Получение значения из запроса на обновление

Когда мы запускаем запрос на обновление, мы получаем сообщение о том, что "эти многочисленные записи будут обновлены. Вы хотите продолжить? Возможно ли зафиксировать значение в сообщении подсказки в переменной, т.е. в количестве записей, которые будут обновлены.

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")
Другие вопросы по тегам