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.