Me sale un mensaje de "error 2001" al ejecutar una operación en un documento de Microsoft Access

Pregunto de nuevo:
Me sale el siguiente mensaje de error:
"Se ha producido el error 2001 en tiempo de ejecución. Canceló la operación anterior".
Llevo 2 días intentando ver qué puede ser, pero no lo veo.
Sale al seleccionar una opción de un desplegable, que tiene en el evento "After update" el código "me.requery", para que ejecute la consulta una vez seleccionada una opción.
El caso es que esto me ocurre en un formulario que es copia de otro en el que no ocurre..
¿Sabes qué es?

1 Respuesta

Respuesta
1
Para verlo lo mejor que puede hacer es seguirlo en modo de depuración para ver en que sentencia ocurre el error. Es realmente útil, pero sin más información (cópiame la parte de código del evento) a primera vista no me cuadra el cancelar la operación anterior y un me. Requery en un after update, me suena a que debe estar antes de esto.
Los códigos de error cambiaron entre Access 97 y 2000 o posteriores ¿qué versión usas?
Espero tu contestación, y que lo del debug te pueda servir de ayuda
Estoy con Access 97.
El error marca la linea del me. requery del After Update..
En el form.onOpen tengo: me.recordSource= consulta,
Siendo Consulta una sentencia select construida según la selección de un desplegable.
En el evento After Update lo único que hay es:
Me.Requery
Detalle.Visible = True
Me. mes_real.SetFocus


He hecho otra copia de un formulario en el que no me sale el error, le he cambiado los parámetros que necesitaba, y también sale el mismo error. Pero en este caso nada más abrir el formulario.
(Lo único que se me ocurre es que al copiar un formulario no cambie bien todos los controles de nombre, o algo así, y por eso me fallen las copias.. O que haya que hacer algo más, y no lo esté haciendo..)
La consulta select, por si estuviera ahí el problema es:
CONSULTA = "SELECT * FROM T_cuotas_real WHERE año=" + a_actual + " and seccion='" + seccion_gasto_real + "' and tipo_gasto=1 and tipo=1 and codprov=[Formularios]![F_real]![provincia_codprov] and mes_numero=[Formularios]![F_real]![mes_numero] order by id"
- a_actual= year(date)
- seccion_gasto_real: es una variable global, definida en un módulo, y que toma un valor en el formulario anterior a este, según la opción que se elija de un desplegable
El error lo tienes en la cadena SQL de la consulta, te aconsejo que lo descompongas en tantas partes como te hagan falta para facilitarte y que partas de una consulta escrita en SQL por Access (la haces en vista diseño, luego pasas a vista SQL, la copias y la pegas en un editor de texto algo potente, ultra edit o similar)
Dim strSQL as string '(ponlo aquí o mejor global en un modulo para usarlo donde quieras)
Dim CodProv as string '(integer o lo que sea)
Dim nMes as integer
CodProv = [Formularios]![F_real]![provincia_codprov]
nMes = [Formularios]![F_real]![mes_numero]
strSQL = SELECT *"
strSQL = strSQL & " FROM T_Cuotas"
strSQL = strSQL & " WHERE año = " & a_actual & " AND seccion = " & seccion_gasto_real & " AND tipo_gasto = 1 AND CodProv = " & CodProv & " AND mes_numero= " & nMes"
strSQL = strSQL & " ORDER BY id"
... resto del código
Así le puedes hacer un debug a la variable strSQL para ver donde te falla e ir componiéndola poco a poco.
Puede ser que te fallen los valores de CodProv o nMes, al tomar el valor por [Formularios]!..., yo nunca se lo doy así, defino las variable en el mismo formulario, o globales si están en otros, y le paso el valor en un procedimiento.
Si están en el mismo formulario
Dim strCodProv as string
strCodProv=me.CodProv
Si está en otro formulario, puedes hacerlo como lo haces, siempre y cuando esté abierto, si no lo está Access no podrá leer el valor. En este caso lo que hago es definirla como global, y al cerrar el formulario donde está el contol CodProv
Global strCodProv (en un módulo)
strCodProv = me.CodProv (al cerrar el formulario)
Para verlo mete un msgbox strCodProv antes de empezar a construir el strSQL para ver el valor que tiene, en este caso es más rápido y fácil que andar con el debug para ver el valor que tiene la variable strCodProv
Algunos detalles a tener en cuenta:
- El identificador de texto en código VBA es ", el identificador de texto en SQL es " (comilla doble) o ' (comilla simple). Para trabajar una cadena de texto en VBA hay que utilizar la comilla simple como identificador de texto para no partir el string de VBA. Yo por costumbre y para facilitarme el copiar (en vista SQL) y pegar (en VBA) sólo utilizo ' en las consultas, nunca ".
dim strCriterio as string
strSQL = "SELECT ...
strSQL = strSQL & " FROM ....
strSQL = strSQL & " WHERE Campo1 = '" strCiterio & "';"
Fíjate en la comilla simple que he puesto junto a las comillas dobles
- Para concatenar usa & en lugar de +, VB y VBA con & siempre concatena, con + suma o concatena según las variables, y este caso el SQL va a ser siempre texto, dos códigos distintos
Dim strTotal as string
Dim Val1 as string
dim Val2 as string
Val1 = 1
Val2 = 1
strTotal = Val1 & Val2   'cadena strTotal = 11
Dim strTotal as string
Dim Val1 as integer
Dim Val2 as integer
Val1=1
Val2 = 1
strTotal = Val1 + Val2 'cadena strTotal = 2
Para evitar esto lo mejor es usar siempre ' en la vista diseño de las consultas, copiar en la vista SQL, pegar e un editor de texto y trasterlo, para luego pegarlo en VBA
- fíjate en el espacio que hay después de las comillas en las líneas strSQL = strSQL & " ...."
sin espacio:
strSQL = "SELECT *"
strSQL = strSQL & "FROM Tabla1"
La cadena quedará así: SELECT *FROM Tabla1 y fallará, no hay espacio entre * y FROM
con espacio:
strSQL = "SELECT *"
strSQL = strSQL " FROM Tabla1"
La cadena quedará: SELECT * FROM Tabla1, y funcionará correctamente.
El código que te he puesto arriba para que lo uses lo he escrito a pelo, sin copiarlo desde Access, es posible que tengas que revisarlo a la hora de personalizarlo, te lo he puesto para que cojas la idea.
Muchas gracias por las aclaraciones! Me son de gran ayuda
Ese error ya no me sale, en ninguno de los formularios.
Pero ahora me ha salido otra cosa: tengo una variable global en un módulo "global_1"
En el formulario 1 le asigno el valor "-1". Lo muestro con msgbox, y muestra -1.
Llamo al formulario 2 (que es donde necesito conocer su valor), muestro el valor de global_1 con msgbox al abrir el formulario, y muestra 0.
Bueno, le he cambiado el nombre a la global, y ahora sí conserva su valor, aunque no sé muy bien cual era el problema..
De nuevo, muchas gracias por todas las ideas y aclaraciones

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas