Evitar error en access "Se ha pasado un IDA no válido para el control de errores".

He creado una aplicación llamada SmartINCs, en la que me sale este error cuando hago algún cambio en el formulario que se abre:

¿Hay forma de hacer que no salga este error? He intentado buscar en la web y no encuentro nada.

1 respuesta

Respuesta
2

Es imposible darte una respuesta sin saber qué código has progamado en tu formulario, concretamente haría falta saber en qué evento se produce el error y el código de ese evento.

Por lo que veo en el mensaje de error, debes de tener un control de errores en tu código y le estás pasando algún argumento incorrecto. Y es todo lo que puedo decirte con la información disponible.

Un saludo.


bit.ly/NkSvAcademy   /    bit.ly/ForoNkSv 

Buenos días, el código que tengo puesto es este:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF3 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F3", acNormal, "", "", , acHidden
DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F3_INC_NO_revisadas"
DoCmd.Close acForm, "Tecla_F3", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If
If KeyCode = vbKeyF10 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F10", acNormal, "", "", , acHidden
DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F10_INC_NO_revisadas"
DoCmd.Close acForm, "Tecla_F10", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If
End Sub

-----------

Private Sub Form_Load()
Me.KeyPreview = True
End Sub

La idea es que al presionar las teclas F3 o F10, ejecute un consulta actualizar un campo con el texto que sale en el formulario oculto que se abre. Si luego cambio de registro una vez hecho eso, me sale ese mensaje.

Gracias.

¿Son esos los dos únicos códigos que tienes en tu formulario? Porque en ellos no veo nada raro que pueda provocar ese mensaje, ni tampoco veo que tengas ningún control de errores...

¿Tienes códigos programados en los formularios que abres ocultos (Tecla_F3 y Tecla_F10)?

No, los acabo de revisar y no he visto ningún procedimiento de evento. Como debería ser el control de errores, por si lo veo en algún formulario?

Los controles de error empiezan con:

On Error ...

Y suelen ser la primera línea de los códigos (aunque no necesariamente).

¿Y macros tienes en tus formularios? Porque también pueden llevar control de errores.

Si no localizas nada de eso, y no tienes inconveniente, hazme llegar una copia de la BD, sin registros o con un par de ellos inventados, e intento ver dónde está el problema... Puedes colgarla aquí o enviarla a: [email protected] 

Revisado el código que me enviaste, no encuentro ninguna pista que me diga por dónde puede venir el error que te salta.

Lo que sí tengo seguro es que ese no es un error propio de Access, sino uno personalizado que estableció la persona que programó la BD. Lo que no tengo claro es dónde lo hizo.

¿En las macros incrustadas, tienes en alguna la acción AlOcurrirError?

¿Tienes algún módulo estándar (no asociado a un formulario o informe) en la BD que pueda tener el control de errores?

Buenos días, la cosa es que la base de datos la programe yo y en ningún momento he puesto un control de errores y he revisado todas las macros y en ninguna tengo puesto nada. Solo me sale esa pantalla cuando presiono alguna de las teclas F3 o F10 y luego hago algún cambio, sino no me sale.

No hay ningún modulo, solo formularios con eventos.

El archivo que me envías no me sirve para tratar de localizar el error, porque las tablas están vinculadas a una bd que no tengo, y por tanto, no puedo abrir ningún elemento normalmente y ver qué puede fallar.

Sí me ha servido para comprobar que no tienes (o no lo encuentro) control de errores, ni ninguna parte de código o macro que genere ese mensaje de error. Aunque sigo pensando que ese no es un mensaje "nativo" de Access.

Lo único que se me ocurre que pruebes es que comentes todas las líneas "DoCmd.SetWarnings False", lances los formularios F3 o F10, hagas cambios y veas si te salta algún error al ejecutar las consultas...

Ya me dices

Buenas, he probado esto:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF3 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
DoCmd.OpenForm "Tecla_F3", acNormal, "", "", , acHidden
DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F3_INC_completa_listado"
DoCmd.SetWarnings False
DoCmd.Close acForm, "Tecla_F3", acSaveYes
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdRefresh
End If

Quieres decir que ponga "DoCmd.SetWarnings False" antes de cada línea?

Tal como esta arriba ocurre lo mismo.

No, quiero que comentes las líneas DoCmd. SetWarnings False, para lo que tienes que poner una comilla simple al inicio de la línea. O simplemente elimina esas líneas (aunque luego las tendrás que volver a escribir)

Buenos días, ahora lo tengo así:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF3 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F3", acNormal, "", "", , acHidden
'DoCmd.SetWarnings False
DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F3_INC_completa_listado"
DoCmd.Close acForm, "Tecla_F3", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If

If KeyCode = vbKeyF10 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F10", acNormal, "", "", , acHidden
DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F10_INC_completa_listado"
DoCmd.Close acForm, "Tecla_F10", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If
End Sub

Es así como me dices?

Ocurre lo mismo.

Pues no, así no es como te digo.

Verás, un comentario es una línea que no se ejecuta (es un comentario, no código en sí). Lo que quiero es que comentes o elimines todos los DoCmd. SetWarnings que tienes en el código, y pruebes a ver si te da algún error.

Vamos, que te quede así:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF3 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F3", acNormal, "", "", , acHidden
'DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F3_INC_completa_listado"
DoCmd.Close acForm, "Tecla_F3", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If
If KeyCode = vbKeyF10 Then
...

Con la linea Docmd. SetWarnings False, lo que haces es omitir los avisos al ejecutar consultas, pero con la desventaja de que si se produce algún error en la consulta, no te enteras...

Por cierto, que con poner una vez esa linea en el procedimiento, mientras no los vuelvas a activar (con Docmd. SetWarnings True), los avisos quedan desactivados, no tienes que repetir la instrucción cada vez que vayas a ejecutar una consulta.

Ahora lo tengo asi y sigue haciendo lo mismo:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF3 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F3", acNormal, "", "", , acHidden
'DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F3_INC_completa_listado"
DoCmd.Close acForm, "Tecla_F3", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If

If KeyCode = vbKeyF10 Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Tecla_F10", acNormal, "", "", , acHidden
'DoCmd.SetWarnings False
DoCmd.OpenQuery "Tecla_F10_INC_completa_listado"
DoCmd.Close acForm, "Tecla_F10", acSaveYes
DoCmd.RunCommand acCmdRefresh
End If
End Sub

¿Te saltan los mensajes de "se va a ejecutar una consulta de ..." (o algo así) y de "va a actualizar x registros..."?

Si no te saltan tendrás que activar los avisos en las propiedades de tu BD (opciones de Access -> Avanzadas -> Confirmar consultas de acción)

Y supongo que no te aparece ningún mensaje de error.

Si tienes los mensajes de confirmación de acciones y ninguno de error, lo único que se me ocurre es que cambies la sistemática de trabajo y simplifiques el proceso.

Actualmente lo que haces es abrir un formulario (F3 o F10) en un registro concreto (el del WHERE del origen de datos), luego ejecutas una consulta de actualización para pasar los datos de ese formulario (F3 o F10) a la tabla, que es el origen del formulario en el que estás trabajando, y lo refrescas. Y por lo visto en algún punto del proceso se pierde algún valor y se provoca el error.

Todo eso lo puedes hacer más sencillo si por código le asignas el valor de la tabla (el que recoges en F3 o F10) al campo del formulario directamente, algo así:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF3 Then
Me.Revisado_jefe=DLookup("Estado","Estados_INC","Tecla='F3'")
End If
...

Y si esto no te funciona, me estoy quedando sin ideas...

Lo he puesto así como me has dicho y parece que funciona bien, he probado varias veces y ya no sale el error.

Entiendo que haciendo esto, ya no hacen falta los formularios Tecla_F3 y tecla_F10 para filtrar ni las consultas de actualización, ¿Es correcto?

Así funciona, he hecho varias pruebas y no da el error. Entiendo que ahora ya no hacen falta los formularios de tecla_F3 y Tecla_F10 para filtrar ni todas las consultas de actualización, es correcto?

Correcto, no te harían falta ni esos dos formularios ni las consultas de actualización.

Muchísimas gracias, voy a hacer limpieza y lo aplico a los demás formularios. Eres muy grande!!

No hay de qué. A la hora de programar, procura hacerlo siempre lo más simple que puedas, así habrá menos probabilidades de que se produzcan fallos... ;-)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas