Это не моя настоящая проблема, а (надеюсь) воспроизводимый пример. Я использую Access 2013.
Вопрос
Как создать запрос на добавление, чтобы он действительно выполнялся после вставки и после удаления? Похоже, что запрос использует таблицу до того, как будет вставлен / удален.
Настройка
table1
имеет два поля: ID_Record
и Record
table2
имеет одно поле: ID_Record
query1
- это запрос на добавление для вставки table1.ID_Record
в table2
Для table1
, Я добавил события для После вставки и После удаления. Они называют следующий именованный макрос (я следовал за ответом на другой вопрос для этого - похоже, он работает, но я не уверен, правильно ли он настроен на 100%).
SetLocalVar
- Имя:
TempVar
- Выражение:
=DeleteThenRun("table2", "query1")
Функция ниже DeleteThenRun()
сначала удаляет все записи в table2
и затем запускает query1
для добавления из table1
в table2
.
То, что я вижу
Это срабатывает и почти работает. Проблема, с которой я сталкиваюсь, заключается в том, что это, похоже, отстает от одной записи. Если у меня есть 1 запись в table1
и затем добавлена другая, table2
будет иметь только эту первую запись, а не новую, основанную на триггере. Если я затем go и вручную удаляю записи в table2
, а затем вручную запускаю query1
, я получу обе записи (т. Е. Запрос на добавление работает правильно).
Если оттуда я go до table1
и удалите вторую запись, макрос запустится снова, удалите таблицу, но затем в table2
есть обе записи, хотя я ожидаю, что в ней будет только одна.
Добавление в точках останова показывает мне немного, что происходит. Функция будет запущена до того, как Access высветится в окне с просьбой подтвердить удаление. Поэтому я думаю, что query1
запускается до того, как вставка или удаление фиксируются, но я не знаю, как это изменить.
Странно для моей теории то, что строка Debug.Print
записывает RecordCount
, который я ожидаю (это не количество записей, которое добавляется).
Public Function DeleteThenRun(DeleteFrom As String, RunQuery As String) As Boolean
On Error GoTo lnError
Dim wrk As DAO.Workspace
Dim db As DAO.Database
Set wrk = DBEngine.Workspaces(0)
Set db = CurrentDb
wrk.BeginTrans
db.Execute "DELETE * FROM " & DeleteFrom & ";", dbFailOnError
DoEvents
Debug.Print db.TableDefs("table1").RecordCount
db.QueryDefs(RunQuery).Execute dbFailOnError
wrk.CommitTrans
Set db = Nothing
Set wrk = Nothing
DeleteThenRun = True
Exit Function
lnError:
wrk.Rollback
Set db = Nothing
Set wrk = Nothing
DeleteThenRun = False
End Function