Запрос доступа не выполняется при закрытии книги - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь выполнить запрос на удаление Access, когда закрываю книгу Excel. Я хочу, чтобы запрос DELETE удалял любую запись, предшествующую сегодняшней дате, в поле «ResDate». Ниже приведен код, который я написал. Рабочая книга закрывается, но записи остаются в базе данных (таблица TR).

Я думал, что это сработает, но до сих пор вычеркнул. Будем весьма благодарны за любые предложения о том, как заставить это работать. Спасибо за помощь ... …….

Const ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\MyDatabase\TRC.mdb;Persist Security Info=False"

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Set Connection = New ADODB.Connection
    Connection.ConnectionString = ConnectionString
    Connection.Open

    VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < " & Date

    Set RecSet1 = Connection.Execute(VSQL, dbrows, adCmdText)

    Connection.Close

    Set RecSet1 = Nothing

End Sub

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Используйте функцию Access Date() в вашем операторе SQL вместо вставки даты в тексте в оператор.

Включите Option Explicit в раздел объявлений вашего модуля и запустите Debug-> Compile from VBГлавное меню редактора. Исправьте первую ошибку компиляции, на которую Access жалуется, а затем снова выполните Debug-> Compile. Повторите, пока не будет больше ошибок.

Открытие набора записей на основе запроса DELETE бесполезно, поскольку DELETE не возвращает записи. Вместо этого просто выполните запрос.

Const ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\MyDatabase\TRC.mdb;Persist Security Info=False"

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim cn As ADODB.Connection
    Dim VSQL As String
    Dim dbrows As Long
    Set cn = New ADODB.Connection
    cn.ConnectionString = ConnectionString
    cn.Open

    VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < Date()"

    cn.Execute VSQL, dbrows, adCmdText

    cn.Close
End Sub
0 голосов
/ 08 ноября 2019

ВСЕГДА ИСПОЛЬЗУЙТЕ ПАРАМЕТРЫ!

Когда вы делаете VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < " & Date, в зависимости от вашей локали, это может привести к нескольким проблемам.

Например, DELETE * FROM [TR] WHERE [TR].ResDate < 2019-11-08 и 2019 минус 11 минус08 равно 2000, а CDate(2000) - 1905-06-22, так что это правильный запрос, но, вероятно, он не удалит то, что вы хотите удалить.

В альтернативной локали может быть 11/ 08/2019, и 11, деленное на 8, деленное на 2019, составляет приблизительно 0, а CDATE(0) - 1899-12-30.

Вместо этого выбирайте из Как использовать параметры в VBA вразличные контексты в Microsoft Access? , например:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Set Connection = New ADODB.Connection
    Connection.ConnectionString = ConnectionString
    Connection.Open

    VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < " & Date
    With CreateObject("ADODB.Command")
         Set .ActiveConnection = Connection
         .CommandText = "DELETE * FROM [TR] WHERE [TR].ResDate < ?"
         Set RecSet1 = .Execute(, Array(Date))
    End With
    Connection.Close

    Set RecSet1 = Nothing

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