Доступ к базе данных после вставки выполняется до вставки - PullRequest
1 голос
/ 09 января 2020

Это не моя настоящая проблема, а (надеюсь) воспроизводимый пример. Я использую 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

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