Tratamiento de error código vba

Me surge un problema en mi nueva BD:

Tengo un formulario con un subformulario en modo formularios continuos relacionados por un campo numérico. En el subformulario hay un cuadro combinado para elegir un código que no puede ser duplicado. Encontré este código por internet para suprimir el mensaje de error de datos duplicados de access 2007 por este en el evento del subformulario "al ocurrir error":

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'Debug.Print "DataErr = "; DataErr 'el error de duplicados es el 3022
'el error que dice no puede guardar el registro es 2169
If DataErr = 3022 Then
MsgBox " Este Dato ya está Registrado ," & Chr(13) & "EL Nº YA ESTA EN USO, DATOS DUPLICADOS", vbCritical, "ERROR ENTRADA DE DATOS"
SendKeys "{ESC 2}"
Response = acDataErrContinue
Else
Response = acDataErrDisplay
End If
End Sub

El código funciona bien pero necesito que el cuadro combinado vaya actualizando otros campos como descripción por ejemplo al elegir el nº de código va mostrando la definición para ello en el evento después de actualizar le puse el código

Me. Requery

Todo bien, el problema se presenta cuando eliges un numero de código ya en uso, entonces access devuelve el típico mensaje de depurar porque lógicamente si el dato esta duplicado no se puede realizar Me. Requery. Lo que necesito es que cunado se introduzca un dato duplicado salte el mensaje del código advirtiéndolo, borre el dato que hemos introducido y pare el código Me. Requery para que no haga ese error.

1 respuesta

Respuesta
3

Para que se actualicen los datos dentro de un cuadro combinado deberías incluir el siguiente código en el evento "Al recibir el enfoque" del mismo cuadro combinado...

Private Sub CuadroCombinado_GotFocus()

CuadroCombinado.Requery
End Sub

... Y con esto ya funcionará como debe...

Un saludo y espero haber sido de ayuda..

lo siento a lo mejor no me explique bien. No hay que actualizar los datos que tiene el cuadro combinado...el subformulario tiene cuadro combinado con unos códigoProductos que no es necesario actualizar los coge de una consulta, otro llamado descripciónProducto y otro campo NserieProducto. lo que hace es que al seleccionar un códigoProducto en el cuadro combinado en el evento "después de actualizar" o "Al perder el enfoque" se rellenan automáticamente el campo descripciónProducto y NserieProducto. mediante código:

Me. Requery osea va actualizando el subformulario.


pero como el cuadro combinado es sin duplicados, si pones dos veces el mismo codigoProducto el subformulario tiene en el evento "al ocurrir Error" de datos duplicados el siguiente mas personalizado para evitar que salga el de access.

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'Debug.Print "DataErr = "; DataErr 'el error de duplicados es el 3022
If DataErr = 3022 Then
MsgBox " Este Dato ya está Registrado ," & Chr(13) & "EL Nº YA ESTA EN USO, DATOS DUPLICADOS", vbCritical, "ERROR ENTRADA DE DATOS"
SendKeys "{ESC 2}"
Response = acDataErrContinue
Else
Response = acDataErrDisplay
End If
End Sub

se produce el típico error de finalizar o depurar porque no puede realizar Me.Requery al ser datos duplicados. lo que trato de hacer es que si introduzco dos codigosProductos iguales, se va a producir el error de modo que no debe actualizar mediante Me. Requery.

no se si lo he aclarado o lo he liado mas todavía, je, je...

Creo que ya te he entendido algo mejor...

La solución la tienes en el evento "DoCmd.CancelEvent" Esta opción cancela el resto del evento para que no se siga ejecutando código, con lo cual, ya no pasará por el Me. Requery siguiente.

También recuerda borrar el código del error con "Err.Clear" para que no te de un error en el siguiente módulo o instrucción que tenga la clausula "On error" establecida.

gracias por tu respuesta...lo siento pero no tengo ni idea de vba podrías situarme las lineas "DoCmd.CancelEvent" y "Err.Clear" dentro del código para probarlo...

Aquí te dejo tu código corregido... a ver si ahora funciona bien.

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'Debug.Print "DataErr = "; DataErr 'el error de duplicados es el 3022 '** ESTO SOBRA YA
If Err.Number = 3022 Then 'He cambiado esta linea también
MsgBox" Este Dato ya está Registrado ," & Chr(13) & "EL Nº YA ESTA EN
USO, DATOS DUPLICADOS", vbCritical, "ERROR ENTRADA DE DATOS"
SendKeys "{ESC 2}"
Err.Clear ' Borra el error
DoCmd.CancelEvent ' Y Cancela el evento
End if
'* + +* Este código de abajo ya no sirve si lo que deseas es cancelar el error
' Response = acDataErrContinue 'Antes continuaba porque entendía que response era =si
' Else
' Response = acDataErrDisplay
' End If
' + + + + +
End Sub

bueno va funcionando, creo que le falta muy poco, daba un error y cambie esto

Private Sub Form_Error(DataErr As Integer, Response As Integer) por esto

Private Sub Form_Error( ErrNumber As Integer, Response As Integer) y esto

If Err.Number = 3022 Then por esto

If ErrNumber = 3022 Then

no se si es correcto pero ahora el error funciona muy bien, creo que falta una linea en el código y sigue el mismo error de actualización del formulario aunque no se casi nada de vba a mi parecer habría que integrar una linea después de esta:

DoCmd.CancelEvent yo te lo pongo en cristiano y haber si lo traduces a vba:

decir al código: como se ha producido un error vete al cuadro combinado que se llama codigoProducto y que no actualice el formulario.

dicho de otra manera:

como se ha producido un error vete al cuadro combinado que se llama codigoProducto y hay que parar el evento "después de actualizar" Me. Requery

No llego a entender dónde tienes colocado el "Me.Requery" y si es este comando el que te está generando el error...

No se puede cancelar un evento desde fuera del propio evento, así que, tendrás que incluir el código para cancelar el Requery en el mismo procedimiento que lo tengas puesto.

Lo que tu me dices de indicarle al programa que se vaya a otro control para evitar la actualización, quedaría algo así:

Private Sub Form_Error(ErrNumber As Integer, Response As Integer)
If Err.Number = 3022 Then 'He cambiado esta linea también
MsgBox" Este Dato ya está Registrado," & Chr(13) & "EL Nº YA ESTA EN
USO, DATOS DUPLICADOS", vbCritical, "ERROR ENTRADA DE DATOS"
SendKeys "{ESC 2}"
Err. Clear ' Borra el error

Me. CodigoProducto. SetFocus 'Envía el foco del formulario al control CodigoProducto
DoCmd. CancelEvent ' Y Cancela el evento

End if

End Sub

A ver si esto funciona, aunque me estoy dando cuenta que has complicado un montón el código por un simple error de registro duplicado, que los controla perfectamente el propio Access.

Creo que lo más simple era poner una condición "On error" en el evento "Antes de Actualizar" y con eso, redirigir el error al mensaje que tu quisieras y cancelar el evento de actualización del registro...

efectivamente, ya lo he solucionado y claro estaba complicando demasiado las cosas, gracias a tu aclaración comprendí que era super sencilla la solución, que no ha sido otra que quitar el código para capturar el error en el evento del subformulario "al ocurrír error" y meterlo todo en el evento "después de Actualizar" del cuadro combinado, actualizando y capturando el error desde el mismo en caso que se produzca,... ahora va de maravilla quedando así:

en el evento del cuadro combinado "después de actualizar"

Private Sub codigoProducto_AfterUpdate()
On Error GoTo Err_Number
Me.Requery
Exit Sub
Err_Number:
MsgBox " Este Dato ya está Registrado ," & Chr(13) & "EL Nº YA ESTA EN USO, DATOS DUPLICADOS", vbCritical, "ERROR ENTRADA DE DATOS"
SendKeys "{ESC 2}"
Err.Clear 'Borra el error
DoCmd.CancelEvent
End Sub

y así lo he puesto, solo te pido una cosita mas ya que el código funciona perfectamente y puesto que yo no se apenas nada de vba, simplemente le eches un vistazo a ver si falta o sobra algo... muchas gracias por tu atención

Te contaré un secreto que tenemos en informática... decimos: "Si funciona, no lo toques!",-) jejejeje...

Creo que el tratamiento del error está mucho más claro y más sencillo ahora... tu mismo te has dado cuenta...

Solo me queda felicitarte, porque si apenas sabes programar en código VB, te has peleado lo suficiente como para resolver el problema con muy poca ayuda...

Un saludo y no olvides finalizar esta pregunta para que no se me quede como pendiente...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas