registro dlookup dbusq datos crear consultas consulta actualizar actualizacion vba ms-access access-vba

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.