visual programar ejemplos codigos vba ms-access access-vba ms-access-2010

vba - programar - Error 3251 en la propiedad de control.oldValue



vba access pdf (2)

Es difícil decir exactamente qué está causando el error cuando no especifica la línea que está apareciendo el error, pero hay una posibilidad obvia.

Estás atrapando a Null en tu lazo de control

If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then

Y lo más importante es que te falta un paréntesis frontal como "("

Pero luego no atrapa esa posibilidad cuando asigna el valor del control y el valor anterior a su conjunto de registros.

![ancienneValeur] = ctl.OldValue ![nouvelleValeur] = ctl.Value

¿ ancienneValeur campos ancienneValeur y nouvelleValeur permiten asignar campos nulos o de longitud cero?

En cualquier caso, debe ser coherente y asegurarse de atrapar los valores nulos antes de asignarlos a los campos de su tabla.

![ancienneValeur] = NZ(ctl.OldValue,"") ![nouvelleValeur] = NZ(ctl.Value,"")

Actualmente estoy trabajando en agregar una pista de auditoría a una base de datos MS-Access 2010 y estoy luchando con

"error 3251: la operación no es compatible para este tipo de objeto"

Aquí está el código de mi módulo de pista de auditoría, la mayoría de los códigos arreglados provienen de la web:

Public Function auditChanges(RecordID As String, userAction As String, cForm As Form) Dim db As DAO.Database Dim rst As DAO.Recordset Dim ctl As Control Dim userLogin As String Set db = CurrentDb Set rst = db.OpenRecordset("SELECT * FROM T_AUDIT") userLogin = getCurrentUser Select Case userAction Case "New" With rst .AddNew ![Date] = Now() ![utilisateur] = userLogin ![nomFormulaire] = cForm.Name ![Action] = userAction ![RecordID] = cForm.Controls(RecordID).Value .Update End With Case "Delete" With rst .AddNew ![Date] = Now() ![utilisateur] = userLogin ![nomFormulaire] = cForm.Name ![Action] = userAction ![RecordID] = cForm.Controls(RecordID).Value .Update End With Case "Edit" For Each ctl In cForm.Controls If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Or (ctl.ControlType = acCheckBox) Then If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then With rst .AddNew ![Date] = Now() ![utilisateur] = userLogin ![nomFormulaire] = cForm.Name ![Action] = userAction ![RecordID] = cForm.Controls(RecordID).Value ![champs] = ctl.ControlSource ![ancienneValeur] = ctl.OldValue ![nouvelleValeur] = ctl.Value .Update End With End If End If Next ctl End Select rst.Close db.Close Set rst = Nothing Set db = Nothing End Function

Esta función se llama en el evento beforeUpdate de los formularios que quiero rastrear.

El error se dispara cuando intento editar un cuadro de texto encuadernado. Y la línea If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then es la línea que provoca el error

El formulario se basa en 2 tablas vinculadas con una relación One-To-Many. La función funciona cuando edito los campos de la tabla que están a un lado de la parte "Uno" de la relación pero arroja el error cuando quiero editar campos del lado "Muchos".

Espero ser lo suficientemente claro, gracias

Editar: más detalles

Mi formulario está basado en esa solicitud:

SELECT T_REVISION.ID_revision, T_REVISION.fk_ID_proposition, T_REVISION.numero, T_REVISION.fk_etat_revision, T_REVISION.EOTP, T_PROPOSITION.reference_simple, T_PROPOSITION.libelle, T_REVISION.description_localisation FROM T_PROPOSITION INNER JOIN T_REVISION ON T_PROPOSITION.ID_proposition = T_REVISION.fk_ID_proposition ORDER BY T_REVISION.numero DESC;

El error se dispara desde el control T_PROPOSITION.reference_simple . El error 3251 ocurre cuando: Intento editar los campos T_REVISION.EOTP , T_REVISION.description_localisation . El error 3251 no ocurre cuando edito T_PROPOSITION.reference_simple , T_PROPOSITION.libelle !

Entonces, puedo editar valores provenientes del lado "Uno" de la relación, pero cuando quiero editar el lado "Muchos", parece que no puedo acceder a la propiedad oldValue.

Como puedo resolver esto ?


No es exactamente una respuesta, pero el área de comentarios no es adecuada ...

Si se agregan 2 líneas ANTES de If (Nz(ctl.Value, "") <> Nz(ctl.OldValue, "")) Then :

debug.print ctl.Name, ctl.value debug.print ctl.name, ctl.oldvalue

Esto le permitirá ver si el error está vinculado a un control específico y a una propiedad específica, y limitar su búsqueda.

Editar : Después de editar su OP que indica que el problema surge en el lado "muchos" de su unión, creo que debe cambiar su forma a una arquitectura de "formulario principal - subformulario" . Esto le permitirá realizar un seguimiento de las actualizaciones de cada TABLA correctamente.