vba - dlookup - dbusq access
¿Cómo puedo obtener un valor del aviso de consulta de actualización en Access VBA? (3)
Cuando ejecutamos una consulta de actualización recibimos un mensaje que indica que ''estos muchos grabadores van a ser actualizados. ¿Desea continuar? ¿es posible capturar el valor en el mensaje de solicitud a una variable, es decir, el número de registros que se actualizarán?
Sí, puede obtener la cantidad de registros actualizados a través de la propiedad RecordsAffected
:
Function RowsChanged(updateQuery As String) As Long
Dim qry As QueryDef
Set qry = CurrentDb.QueryDefs(updateQuery)
qry.Execute
RowsChanged = qry.RecordsAffected
End Function
Puede llamar a esta función con el nombre de su consulta de actualización para obtener el número de filas actualizadas:
Dim numRows as long
numRows = RowsChanged("UpdateQuery")
Si ejecuta la consulta desde el código, puede usar la propiedad afectada de registros:
Dim db As Database
Set db=CurrentDB
db.Execute "Some SQL here"
db.RecordsAffected
Si usa una transacción, puede deshacerla.
Patrick Cuff propuso esta función:
Function RowsChanged(updateQuery As String) As Long
Dim qry As QueryDef
Set qry = CurrentDb.QueryDefs(updateQuery)
qry.Execute
RowsChanged = qry.RecordsAffected
End Function
No entiendo por qué uno se tomaría la molestia de asignar una variable QueryDef para ejecutar una consulta cuando se puede hacer directamente con CurrentDB.Execute sin inicializar (o limpiar) ninguna variable de objeto.
Obviamente, una consulta de parámetros va a necesitar usar el enfoque QueryDef, ya que debe asignar los valores a los parámetros antes de ejecutarlos. Pero sin parámetros, no hay razón para hacerlo más complicado de lo necesario. Con una función genérica como esta que no está configurada para manejar consultas de parámetros, parece estar mal diseñada.
Y, por supuesto, también debería usar dbFailOnError, para que no obtenga resultados inesperados (dbFailOnError funciona con QueryDef.Execute, al igual que con CurrentDB.Execute). En ese caso, realmente necesita haber un controlador de errores.
En lugar de escribir un controlador de errores cada vez que ejecuta SQL, puede hacerlo. La siguiente función devuelve los registros afectados y se recuperará adecuadamente de los errores:
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
También se puede usar para reemplazar DoCmd.RunSQL (solo lo llama e ignora el valor de retorno). De hecho, esta función fue diseñada completamente para usarse como un reemplazo global para DoCmd.RunSQL.