Variables en Query para consulta en BD con macro

Estoy realizando una consulta a Access desde una Macro hecha en Excel con una query.
Esta query tiene unas fechas que quiero introducir mediante variables desde la macro de Excel.
La parte donde está esto es:
WHERE (Incidencias.dFecRecogida>= {ts '2010-09-12 00:00:00'} And Incidencias.dFecRecogida<={ts " & fecha & "})  and Incidencias.nCNU = '0'")
La fecha de recogida tiene que ser mayor al 12 - Septiembre (esta fecha es fija), pero tiene que ser menor a la que yo decida.
Se me ocurrió hacerlo así:
fecha = Format(Date, ("yyyy-mm-dd hh:mm:ss"))
INNER JOIN Estados ON EstadoActual_0.sEstado = Estados.Id" & Chr(13) & _
        "WHERE (Incidencias.dFecRecogida>= {ts '2010-09-12 00:00:00'} And Incidencias.dFecRecogida<={ts " & fecha & "})  and Incidencias.nCNU = '0'"
Pero la macro me da error de sintaxis SQL, supongo que será error de formato de fechas.
Si yo pusiera las fechas a mano directamente en la query funciona correctamente, sólo me falta poner la variable.
Para cualquier aclaración, estaré pendiente.

1 respuesta

Respuesta
1
Los dos principales problemas que tiene el manejo de fechas en cualquier sistema informático son:
1) El formato puede variar en función de la configuración del equipo
2) Puede contener, además de la fecha, la hora:minutos:segundos
Por ello hay que tener cuidado con estos campos.
Charlas aparte, vamos con la solución.
Para evitar problemas de configuración del equipo lo mejor es comparar las fechas usando funciones de conversión cuya salida sea de tipo fecha. En concreto para access la función "dateSerial".
Esta función devuelve una fecha y usa como parámetros el año, mes y día.
El problema... que no maneja la hora:minutos:segundos, por lo que siempre las considera como "00:00:00". Problemas hasta cierto punto porque muchas veces esa es la hora que tenemos en nuestros campos.
Resumiendo, supongo que 'fecha' es una variable de tipo texto que hace referencia a la fecha de hoy. Prueba con el siguiente código:
"WHERE (Incidencias.dFecRecogida>= dateserial(2010,9,12) And Incidencias.dFecRecogida<=" & "dateserial(" & format$(now(),"yyyy,mm,dd") & ")" & " and Incidencias.nCNU = '0'"
Si quieres que también controle la hora máxima dependiendo de la que tenga el ordenador, podrías poner:
"WHERE (Incidencias.dFecRecogida>= dateserial(2010,9,12) And Incidencias.dFecRecogida<=now() and Incidencias.nCNU = '0'"
Hola,
Gracias por la pronta respuesta. No conocía lo del "dataserial", gracias por la información. Me parece muy útil.
He probado con los cambios propuestos y funciona perfectamente (me da los resultados esperados).
Mi variable "fecha" es en realidad la fecha actual más 1 día (la fecha de mañana), pero con lo que me has explicado he caído en cuenta de que esa condición sobra, ya que siempre querré que me de los resultados desde el 12-09 hasta este momento.
Por lo que entiendo que puedo usar sencillamente:
 "WHERE (Incidencias.dFecRecogida>= dateserial(2010,9,12) Incidencias.nCNU = '0'"
ó
"WHERE (Incidencias.dFecRecogida>= dateserial(2010,9,12) And Incidencias.dFecRecogida<=now() and Incidencias.nCNU = '0'"
Sólo 2 cositas más:
- ¿Habría diferencia entre las dos querys que te propongo si siempre quiero tener la hora máxima?
- Esto ya es por curiosidad: Se me ocurrió que la fecha 12-09 quizás quiera meterla mano, lo hice de ésta manera:
'La fecha de inicio la pongo así por facilidad de visualizacion, ya me encargo de capturarla y formar la cadena.
fecha_inicio = "(2010,9,12)" 
...
WHERE (Incidencias.dFecRecogida>= dateserial" & fecha_inicio & ") and Incidencias.nCNU = '0'"
Y me funciona Bien.
Así que por mi parte sólo me queda esa duda: (la diferencia entre las ultimas querys respecto a la hora)
Gracias.
José Acevedo.
La dos cláusulas where de las consultas:
1) "WHERE (Incidencias.dFecRecogida>= dateserial(2010,9,12) Incidencias.nCNU = '0'"
2) "WHERE (Incidencias.dFecRecogida>= dateserial(2010,9,12) And Incidencias.dFecRecogida<=now() and Incidencias.nCNU = '0'"
Tienen una diferencia importante: la primera te devolverá registros con fecha de recogida de mañana, de pasado y de dentro de un mes, mientras que la segunda no te devolverá los que tengan una fecha posterior a la de hoy.
Eso sí, si en el campo "dFecRecogida" incluyes la hora, deberías usar en la condición que sea menor que la fecha de mañana (sin horas). Eso sería poniendo:
    DFecRecogida<dateserial(year(now()), month(now()), day(now()))+1
Construyo la fecha basándome en la del sistema pero... sin horas ni minutos ni segundos.
Si no usas las horas/minutos/segundos y quieres incluir los registros con fecha de recogida de mañana puedes utilizar "now()+1", sumando 1 a la fecha de hoy.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas