Как мне сделать редактируемый запрос UNION? - PullRequest
6 голосов
/ 11 августа 2009

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

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

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

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

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2;

EDIT:

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

SELECT * FROM MappingQuery1, MappingQuery2;

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

Ответы [ 3 ]

8 голосов
/ 11 августа 2009

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

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

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

strSQL = "SELECT fields_to_edit FROM " & Me.txtTableSource & _
    " WHERE pkfield =" & Me.txtPKeyField & ";"
Me.SubformName.Rowsource = strSQL
Me.SubformName.Requery
7 голосов
/ 11 августа 2009

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

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

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

Следующий вопрос изменить :

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

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

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

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

РЕДАКТИРОВАТЬ 2: Для однодневных

Это вставляет значения в таблицу, используя 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 голосов
/ 28 декабря 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...