Получение значения из запроса на обновление
Когда мы запускаем запрос на обновление, мы получаем сообщение о том, что "эти многочисленные записи будут обновлены. Вы хотите продолжить? Возможно ли зафиксировать значение в сообщении подсказки в переменной, т.е. в количестве записей, которые будут обновлены.
3 ответа
Если вы запускаете запрос из кода, вы можете использовать свойство записи, на которое влияют:
Dim db As Database
Set db=CurrentDB
db.Execute "Some SQL here"
db.RecordsAffected
Если вы используете транзакцию, вы можете выполнить откат.
Патрик Кафф предложил эту функцию:
Function RowsChanged(updateQuery As String) As Long
Dim qry As QueryDef
Set qry = CurrentDb.QueryDefs(updateQuery)
qry.Execute
RowsChanged = qry.RecordsAffected
End Function
Я не понимаю, почему возникнет проблема с назначением переменной QueryDef для выполнения запроса, когда это можно сделать напрямую CurrentDB.Execute без инициализации (или очистки) каких-либо объектных переменных.
Очевидно, что для запроса параметров необходимо использовать подход QueryDef, так как вы должны присвоить значения параметрам перед его выполнением. Но без параметров нет причин делать это более сложным, чем необходимо. С такой универсальной функцией, которая не настроена для обработки запросов параметров, она выглядит неправильно.
И, конечно же, следует также использовать dbFailOnError, чтобы вы не получили неожиданных результатов (dbFailOnError работает с QueryDef.Execute, так же, как и с CurrentDB.Execute). В этом случае действительно должен быть обработчик ошибок.
Вместо того, чтобы писать обработчик ошибок каждый раз, когда вы выполняете SQL, вы можете сделать это вместо этого. Следующая функция возвращает RecordsActed и будет корректно восстанавливаться после ошибок:
Public Function SQLRun(strSQL As String) As Long
On Error GoTo errHandler
Static db As DAO.Database
If db Is Nothing Then
Set db = CurrentDB
End If
db.Execute strSQL, dbFailOnError
SQLRun = db.RecordsAffected
exitRoutine:
Exit Function
errHandler:
MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in SQLRun()"
Resume exitRoutine
End Function
Он также может быть использован для замены DoCmd.RunSQL (вы просто вызываете его и игнорируете возвращаемое значение). Фактически, эта функция была полностью разработана для использования в качестве глобальной замены для DoCmd.RunSQL.
Да, вы можете получить количество обновленных записей через RecordsAffected
имущество:
Function RowsChanged(updateQuery As String) As Long
Dim qry As QueryDef
Set qry = CurrentDb.QueryDefs(updateQuery)
qry.Execute
RowsChanged = qry.RecordsAffected
End Function
Вы можете вызвать эту функцию с именем вашего запроса на обновление, чтобы получить количество обновленных строк:
Dim numRows as long
numRows = RowsChanged("UpdateQuery")