2009-08-11 2 views
6

В ходе сложной структуры базы данных мне необходимо предоставить пользователю возможность редактировать данные, хранящиеся в серии таблиц. Хотя все типы данных одинаковы, они не выстраиваются в очередь 1: 1 в своих именах. Чтобы облегчить это, я создал запрос, который отображает исходные имена (которые поступают из внешних отчетов) во внутренние имена; из этих запросов все подается в один гигантский запрос UNION.Как сделать редактируемый запрос UNION?

Все типы данных и размеры полей строятся правильно.

Что еще мне нужно сделать, чтобы этот запрос UNION работал?

Это текущий SQL за запрос:

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

EDIT:

Ответ ниже разместил ссылку на KB article состояний с уверенностью утверждать, что данные в UNION запрос не может быть обновлено. Есть ли способ обойти это? Например:

SELECT * FROM MappingQuery1, MappingQuery2; 

Будет ли это работать? Помните, что все поля выровнены по типу, размеру и имени.

+0

Есть ли возможность объединить отдельные таблицы в главную таблицу, которая имеет ту же структуру, за исключением одного дополнительного поля для имени таблицы, из которой возникла каждая строка? – HansUp

+1

SELECT * FROM MappingQuery1, MappingQuery2; даст вам декартовой запрос (набор результатов, содержащий все возможные комбинации каждой строки) - он не будет доступен для редактирования. Я согласен с HansUp. – Fionnuala

+1

HansUp предполагает, что структура базы данных не является оптимальной. Как практикующий диагност (в основном, диагностируя свои проблемы, признаюсь), я думаю, что это очень вероятно. Если это так, за этим вызовом последуют многие другие. – Smandoli

ответ

6

Когда запрос является запросом Союза, вы не можете обновлять данные в запросе. не может обновить данные.

http://support.microsoft.com/kb/328828

Когда Access объединяет строки из разных таблиц в запросе на объединение, отдельные строки теряют основную идентичность таблицы. Доступ не может знать, какую таблицу вы хотите обновить при попытке изменить строку в объединенном запросе, поэтому она запрещает все обновления.

следующий вопрос редактировать:

Вы могли бы обойти это с помощью VBA и ADO обновить соответствующую таблицу. Способ, которым я подходил бы к этому, состоял бы в том, чтобы убедиться, что таблица union содержит столбец с идентификатором из исходной таблицы вместе с другим столбцом, который определяет исходную таблицу.

например. в вашем союзе вы бы что-то вроде этого:

SELECT 'Table1', id, ... FROM Table1 
UNION 
SELECT 'Table2', id, ... FROM Table2 

Затем через форму ввода данных и VBA вы можете посмотреть на значения выбранной строки и обновить соответствующую таблицу.

EDIT 2: Для onedaywhen

Это вставляет значения в таблицу с помощью Access VBA

Option Compare Database 
Option Explicit 

Public Sub InsertDataPunk(TargetTable As String, IdVal As Long, MyVal As String) 

    Dim conn As ADODB.Connection 
    Set conn = CurrentProject.Connection 

    Dim sql As String 
    'You could build something fancier here 
    sql = "INSERT INTO " & TargetTable & " VALUES (" & IdVal & ",'" & MyVal & "')" 

    Dim cmd As ADODB.Command 
    Set cmd = New ADODB.Command 
    Set cmd.ActiveConnection = conn 
    cmd.CommandText = sql 
    cmd.CommandType = adCmdText 
    cmd.Execute 

End Sub 


InsertDataPunk "Table2", 7, "DooDar" 
+0

Записи в таблицах имеют уникальные первичные ключи (в частности, ПК в каждой таблице полностью уникальна для базы данных и является неотъемлемой частью набора данных, а не только для AutoNumber). –

+0

При условии, что идентификаторы не перекрываются, вы можете реструктурировать свои таблицы, чтобы иметь родительскую таблицу, содержащую идентификаторы и дочерние таблицы, содержащие данные. Возможно, что результирующий запрос может быть обновляемым (но вам придется сначала его протестировать). SELECT * FROM IdTable внутреннего соединение Table1 ON Table1.Id = IdTable.Id внутреннего соединения Table2 ON Table2.Id = IdTable.Id – pjp

+0

выше следует использовать ЛЕВЫЕ внешние соединения .. Единственная проблема заключается в том, что значения будут в конечном итоге в разных столбцах ... Результат обновляется tho .. Может быть, лучше придерживаться решения VBA – pjp

8

Мои предпочтения было бы объединить эти отдельные таблицы в основной таблице. Со всеми данными в одной таблице это может быть намного проще.

Однако, если у вас есть, чтобы отдельные таблицы были разделены, измените ваши запросы сопоставления, чтобы включить выражение поля для имени исходной таблицы. И включите это поле имени таблицы в запрос UNION.

Затем создайте непрерывную форму на основе запроса UNION только для чтения. Добавьте подформу на основе другого запроса, который возвращает одну редактируемую запись из соответствующей таблицы. В основной форме это на текущее событие, перепишет RowSource для запроса подчиненного в:

strSQL = "SELECT fields_to_edit FROM " & Me.txtTableSource & _ 
    " WHERE pkfield =" & Me.txtPKeyField & ";" 
Me.SubformName.Rowsource = strSQL 
Me.SubformName.Requery 
+4

Во-вторых, я предпочел (именно это я и собирался предложить). Действительно, у меня есть стандартная практика, что я делаю все непрерывные/таблицы данных доступными только для чтения (с несколькими заметными исключениями, такими как детали детали счета-фактуры). –

-1

Это очень старая нить, но я искал решение одной и те же вещи и наткнулся на него. У меня было значение флажка, которое было нажато несколькими запросами Union, и когда я попытался его обновить, я, конечно, не смог.

Однако, я нашел решение и решил поделиться им. В событии OnEnter этого флажка я просто запустил запрос SQL Update, который обновил поле в базовой таблице, которое я хотел изменить. Если он был True, я обновился до False, и если False, я обновил значение true. Вуаля!

Смежные вопросы