¿Es posible que a través de un cuadro de texto de un formulario buscado con dlookup, que me actualice un campo de una tabla?

Os pongo el código a ver que es lo que hago mal (entiendo que debería ser posible), funciona todo correctamente excepto la última línea If me. Cierre …:

En ella yo lo que pretendo es que si el cuadro de texto Cierre (calculado en la línea anterior del código), es menor que el campo hora_llegada (este me lo pone después de insertar en el formulario a través de un Now) entonces que me actualice la consulta clasificaciones fuera de control y que me ponga en el campo incidencias "fuera de control"

Private Sub Dorsal_BeforeUpdate(Cancel As Integer)
If DLookup("[CATEGORIA]", "[DATOS PRUEBA]", "DORSAL=" & Me.Dorsal) = "No sale" Then

MsgBox "ESE CORREDOR NO TOMÓ LA SALIDA"

Cancel = True
End If
Nombre = DLookup("[NOMBRE]", "[DATOS PRUEBA]", "DORSAL=" & Me.Dorsal)
Cierre = DLookup("[CIERRE_META]", "[CIERRE META]", "DORSAL=" & Me.Dorsal)

If Me.Cierre < Me.Hora_llegada Then CurrentDb.Execute "update[clasificaciones fuera de control] SET incidencias='Fuera de control'"

End Sub

1

1 respuesta

Respuesta
2

¿Y por qué no te funciona? ¿Cuál es el problema: no se ejecuta, te da error, no hace nada...?

Cosas que puedes probar:

1º/ separar el update del nombre de la tabla (si lo tienes pegado en el editor de VBA)

2º/ ejecutar el código paso a paso, para comprobar que los valores de cierre y hora_llegada son los correctos, y se cumple la condición o no

3º/ añadir a la instrucción CurrentDe. Execute el parámetro dbFailOnError, para que te avise si hay algún problema con la actualización

No da error ni nada pero no se ejecuta la última línea.

1º Lo hice y sigue igual

2º No sé como se hace eso, pero la condición se cumple seguro (Ejecuto la sentencia desde un botón de otro formulario tal cual está y si me los pone todos "clasificaciones fuera de control": CurrentDb.Execute "update[clasificaciones fuera de control] SET incidencias='Fuera de control'")

3º La añadí de la siguiente forma (imagino que será así) y sigue igual:

If Me.Cierre < Me.Hora_llegada Then CurrentDb.Execute ("update [clasificaciones fuera de control] SET incidencias='Fuera de control', dbFailOnError")

Te respondo a un par de cuestiones:

2º/ No te voy a explicar ahora cómo ejecutar paso a paso, pero te dejo un enlace para que lo veas: http://neckkito.xyz/nck/index.php/manuales/48-mini-guia-depuracion-vba

Otra opción es poner un msgbox dentro de ese if para saber si se cumple la condición (si se cumple, te salta el mensaje)

3º/ Tienes mal la instrucción, sería:

If Me.Cierre < Me.Hora_llegada Then CurrentDb.Execute "update [clasificaciones fuera de control] SET incidencias='Fuera de control'", dbFailOnError

De todas formas, y re-ojeando tu código, te comento una cosa, porque igual no es lo que quieres hacer:

Tal y como tienes la SQL, te va a poner en todos los registro de la tabla "clasificaciones fuera de control" el valor "fuera de control" en el campo "incidencias".

Tendrías que ver si únicamente quieres actualizar el valor para el dorsal que estás metiendo, para lo que tendrías que añadirle un WHERE a esa SQL.

O si tu formulario se basa en esa tabla, y tienes el campo incidencias en él (aunque sea oculto), simplemente poner:

Me.incidencias="Fuera de control"

Muchas gracias por el enlace, tan pronto tenga un rato me lo leo.

Es que no es una tabla, es una consulta, entonces esos son los que quiero que me los actualice a fuera de control desde un botón de otro formulario funciona perfectamente, yo era para ver si me os podía ya poner directamente en este formulario sin tener que actualizarlos al final, pero vamos sino también arreglo.

Poniendo la instrucción como me comentarte me da error de compilación "no se ha definido la variable"

Me parece rarísimo que te de ese error de no definición de variable, porque la sintaxis es la correcta:

https://msdn.microsoft.com/es-es/library/office/ff197654.aspx 

https://www.experts-exchange.com/questions/27581448/Syntax-for-CurrentDB-Execute.html 

Y más ejemplos que puedes buscar...

De todas formas, si quieres probar alternativas, usa DoCmd. RunSQL en vez de CurrentDb. Execute. Te pedirá confirmar cada acción, y si hay algún error, te lo dirá. Y si no te dice nada, es que no llega a ejecutarse...

No va tampoco con el docmd (sigue sin hacer nada). Ya me cansó, puse en el formulario un botón para que al pinchar ejecutase la sentencia y a continuación que actualizase el formulario y así ya me pone lo que quería. (yo creo que no funciona por el tema de que la hora de llegada se genera con el now y el cierre de meta es un cuadro de texto que se actualiza al entrar el dorsal. No sé explicarme nada bien pero algo de eso debe ser… cosas de la informática, o a lo mejor alguna gambada tendré por ahí).

Private Sub Comando23_Click()
CurrentDb.Execute "update[clasificaciones fuera de control] SET incidencias='Fuera de control'"
Me.Refresh
End Sub

De todas formas muchas gracias!!!

Pues si no te funciona el currentdb.execute ni el docmd. Runsql, insisto en mi idea de que no se cumple la condición, sino tendría que o funcionar o dar un error... Pero sin verlo poco más te puedo decir...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas