** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - FECHAS EN VBA
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoFECHAS EN VBA

 Responder Responder
Autor
Mensaje
garba1957 Ver desplegable
Nuevo
Nuevo


Unido: 28/Octubre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 35
Enlace directo a este mensaje Tema: FECHAS EN VBA
    Enviado: 28/Enero/2016 a las 13:29
Hola amigos,

Esto de las fechas en VBA me está volviendo loco, primero porque no podía utilizar variables, que me resolvió el amigo E.Feijoo, y ahora lo que me está haciendo la vida imposible "creo que son las comillas".

Tengo esta elemental sentencia:
DoCmd.RunSQL ("SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) >= " & Desde & " and " & (fecha) & "<=" & Hasta)

Pero cuando la ejecuto me da el siguiente error:
Error de sintaxis (falta operador) en la expresión de consulta '((Fecha) >= 01/01/2015 and  <=31/01/2015'

Como observaréis aparecen los valores de las variables desde y hasta, por lo que supongo que esa parte está bien.

Mi sospecha es que el "and" es lo que está mal, pero no se como poner las puñeteras comillas.

Gracias y un saludo a todo este gran foro.
Arriba
admin Ver desplegable
Administrador
Administrador
Avatar

Unido: 14/Agosto/2013
Localización: Cualquier lugar
Estado: Sin conexión
Puntos: 790
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 13:50
Yo en ya mis "ancianos" programa de access solía utilizar lo mismo y nunca me falló. Oirás aquí, con esto de las fechas, varias teorías y sintaxis todas válidas. Depende de cada uno.

Yo probaria así...

DoCmd.RunSQL "SELECT Fecha, importe FROM tabla1 WHERE Fecha between #" & Format(Desde, "mm/dd/yyyy") & "# And #" & Format(Hasta, "mm/dd/yyyy") & "#"

Lo he escrito a pelo, espero que esté bien

Mira el uso de BetWeen y como en SQL las fechas deben ir en formati mes-dia año

Hay otros caminos...
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 14:28
Si, falla el 'segundo' parámetro porque le falta un referente, la sintaxis correcta debería ser algo como:

Fecha >= xxxx And Fecha <= yyyyy

Access (si no se le indica con meridiana claridad) no sabe con quien comparar el segundo referente que puede ser la misma fecha u otra cualquiera, todo depende de lo que se pretenda obtener.
Arriba
garba1957 Ver desplegable
Nuevo
Nuevo


Unido: 28/Octubre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 35
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 14:52
Gracias por tu respuesta. 

Lamentablemente no funciona, da el mensaje: Error 2342 - La acción Ejecutar SQL requiere como argumento una instrucción SQL

Creo que el tema no es por el formato, digo esto porque la misma sentencia la pego en una consulta y la ejecuta sin problemas.
Arriba
garba1957 Ver desplegable
Nuevo
Nuevo


Unido: 28/Octubre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 35
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 14:53
Gracias por tu respuesta. 

Creo que el tema no es por el formato, digo esto porque la misma sentencia la pego en una consulta y la ejecuta sin problemas.
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 15:23
No a quien va dirigida esa repuesta, pero el formato influye (y mucho) según se utilice en una ubicación u otra.

Un símil seria la diferencia entre hacerme yo la comida y el ir a un restaurante en el restaurante (equivale a la consulta) hay cocineros y camareros para servirme (la comida me gustara mas o menos), en mi cocina la hare a mi gusto, pero implica que tengo que hacer yo todo (la cocina y el servicio).

En definitiva: en la consulta Access trasforma las fechas, en VBA tendré que ser yo quien le adjudique formato correcto (con el método que se desee, pero hay que hacerlo).

Editado por E. Feijoo - 28/Enero/2016 a las 15:24
Arriba
garba1957 Ver desplegable
Nuevo
Nuevo


Unido: 28/Octubre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 35
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 16:28
Hola E.Feijoo

No se como va muy bien el tema de las respuestas, porque seleccioné la opción que está debajo de cada pregunta, pensando que resapondía a esa pregunta, pero no ha sido así. Ahora he seleccionado el "responder" de abajo, a ver si te llega.

En absoluto pretendo decirte lo que si funciona y lo que no, pues ya veo que tú de esto sabes un montón, solo quería decir que mi deducción es que los formatos de las fechas no deben ser el problema, lo digo porque si copio la sentencia y la pongo en una consulta Access se ejecuta y me da el resultado esperado, es decir los datos entre las dos fechas.

Ahora he cambiado la sentencia, para usar Between, es esta:
DoCmd.RunSQL ("SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between " & Desde & " And " & Hasta)

Me da otro mensaje diferente: Falta ),] o un elemento en la expresión de consulta '((Fecha) Between 01/01/2015 And 31/01/2015'

Esto me hace pensar que de nuevo está tomando los valores de las variables desde y hasta, pues el mensaje muestra los valores y no los nombre de las variables, y no me pide que los introduzca. Por esto es por lo que tiendo a pensar que el problema está en el And, que lo esté considerando como texto y no como parámetro.

Si trato de quitar las comillas al And me da error de sintaxis, así que me tiene loco.

Gracias por tu ayuda y paciencia.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: ROC, NY
Estado: Sin conexión
Puntos: 3293
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 18:11
Creo que lo que pones deberia ser asi:

DoCmd.RunSQL ("SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between " & Desde & " And " & Hasta & ")")


Pero para que de verdad funcione
DoCmd.RunSQL ("SELECT Fecha, importe FROM tabla1 
WHERE ((Fecha) Between #" & Format (Desde, "mm/dd/yyyy") & "# And #" & Format(Hasta, "mm/dd/yyyy") & "#)")

Un saludo.

Luis
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 18:18
No es cuestión de seleccionar a quien se responde (eso no influye), lo que si influye es que la respuesta es tan ambigua que es difícil interpretarla.

Lo que me parece poco eficiente (por tu parte) es que tengas esa sentencia perfectamente funcional en una respuesta anterior (o has 'mentido como un bellaco') y vuelvas a preguntar lo mismo.

Insisto que según se utilice (en la consulta o en la ventana de VBA) la sintaxis cambia un montón, para empezar no se le esta indicando a Access que lo que se le pasa como parámetro 'es un dato de fecha', pero OJO fecha Access, no un texto que simula una fecha, si los textos libres se pudieran utilizar como fechas, no existiría un campo especifico (en Access y muchas mas bases de datos) para almacenar fechas.

Dedícale un mínimo de tiempo a la expresión que te mostro el usuario admin para encontrar las diferencias (y las diferencia mas básica no es el 'Format', está antes y después).
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4898
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 20:40
Me voy a entrometer en esto:
Access trata de diferente manera a los textos, los números y las fechas.
Para que access sepa que son textos las encerramos en comillas.
Para que sepa que son Fechas les agregamos el signo de numero #.
Y con número no hacemos nada, las dejamos igual.
Internamente las fechas access las convierte en número, así que tenemos dos posibilidades convertir las fechas a números o tratarlas como fechas, si las tratamos como fechas, VBA las fechas las considera con formato ingles mes/dia/año. En cambio en el generador de consultas considera las fechas como lo tengas establecido en la configuración regional, así una fecha de cinco de Enero 1/5/2016, en vba la considera primero de mayo.
A lo tuyo tienes:

“SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between " & Desde & " And " & Hasta)

Ya trataste a Desde y Hasta con comillas y &, nos falta tratarlos como fecha o como numero
Como fecha hay que agregar # afuera de las comillas quedaría:

“SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between #" & Desde & "# And #" & Hasta) & “#”

Pero tenemos un problema las fechas no les hemos dado el formato americano así que nos cambiaría el mes por el dia, lo solucionamos con Format algo así:

“SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between #" & Format(Desde,"mm/dd/yyyy") & "# And #" & Format(Hasta,"mm/dd/yyyy")) & “#”

Ahora si tratamos las fechas como números quedaría algo asi

“SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between " & CDbl(Desde) & " And " & CDbl(Hasta))

Pero no sabemos cómo consideraste Desde y Hasta, si no son fechas Access puede confundirse así que le podemos indicar que son fechas

“SELECT Fecha, importe FROM tabla1 WHERE ((Fecha) Between " & CDbl(CDate(Desde)) & " And " & CDbl(CDate(Hasta)))

Y eso es todo, yo generalmente hago lo siguiente para comprobar:

Dim SQL As String
SQL = "SELECT Fecha, importe FROM tabla1 WHERE (Fecha) Between " & CDbl(Desde) & " And " & CDbl(Me. Hasta)
'SQL = "SELECT Fecha, importe FROM tabla1 WHERE (Fecha) BETWEEN #" & Format(Desde, "mm/dd/yyyy") & "# AND #" & Format(Hasta, "mm/dd/yyyy") & "#"
'SQL = "SELECT Fecha, importe FROM tabla1 WHERE (Fecha) BETWEEN " & CDbl(CDate(Desde)) & " AND " & CDbl(CDate(Hasta))
'DoCmd.RunSQL SQL
Debug.Print SQL

Una vez que la corro en la ventana inmediata lo pego en la vista SQL de una nueva consulta y si funciona a trabajar.
Saludos.


Editado por emiliove - 28/Enero/2016 a las 20:46
Arriba
admin Ver desplegable
Administrador
Administrador
Avatar

Unido: 14/Agosto/2013
Localización: Cualquier lugar
Estado: Sin conexión
Puntos: 790
Enlace directo a este mensaje Enviado: 28/Enero/2016 a las 20:49
Publicado originalmente por lbauluz lbauluz escribió:

Pero para que de verdad funcione
DoCmd.RunSQL ("SELECT Fecha, importe FROM tabla1 
WHERE ((Fecha) Between #" & Format (Desde, "mm/dd/yyyy") & "# And #" & Format(Hasta, "mm/dd/yyyy") & "#)")


Si no veo mal, es la misma respuesta que he dado yo...
A parte de eso, no sé qué sentido tiene meter los paréntesis tanto en (fecha) como en la clausula WHERE.
Bajo mi punto de vista sobran y pueden liar más que otra cosa.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: ROC, NY
Estado: Sin conexión
Puntos: 3293
Enlace directo a este mensaje Enviado: 29/Enero/2016 a las 03:43
Hola Admin

Los paréntesis de la fecha solo son para mantener el formato original del usuario, creo (o espero) que así le puede resultar más fácil entender la respuesta.

Un saludo.

Luis
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
Arriba
garba1957 Ver desplegable
Nuevo
Nuevo


Unido: 28/Octubre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 35
Enlace directo a este mensaje Enviado: 29/Enero/2016 a las 09:03
Ante todo quiero dejar muy claro que no me gustan las polémicas y mucho menos con alguien que no conozco, digo esto porque E.Feijoo cuando decía a tu primera contestación que el problema era el que comentabas, lo dije estrictamente porque cuando puse la instrucción como me indicaste dejó de darme error, razón por la que pensé que estaba resuelto. El problema es que realmente no estaba haciendo la comparación, es decir que el resultado obtenido no controlaba las fechas.

También quiero aclarar que he estado probablemente más años en sistemas que la mitad del foro junto, pues tengo el número 42 de licenciados en sistemas de este país, estoy a punto de jubilarme. Ahora no me dedico a ello, pero quiero echar un cable a un compañero. He programado, que recuerde ahora, en Assembler, RPG en varias versiones, Cobol en varias versiones, Fortran, Pascal, C, C++, Basic, PHP, HTML,..... no sigo porque resulta aburrido, no lo digo por presumir, es solo por dejar claro que no me acabo de caer de un guindo.

Ahora simplemente trato de echar una mano a un compañero, que el pobre está aún más perdido que yo, el problema es que solo se utilizar Access para las típicas consultas de usuario, que no se como va la sintaxis, ni los distintos tipos de objetos que maneja, ni siquiera que es un jodido módulo, vamos que no tengo ni idea.

Bueno, ya está bien de rollo, que vosotros lo tendréis muy claro, pero yo cuando me pongo a mecanizar lo que me decís tengo problemas de todo tipo, razón ..... evidentemente mi desconocimiento.

Gracias emiliove, creo que tu explicación es excelente, así que trataré de ir probando las distintas opciones.

Gracias Admin, intenté lo de los formatos, pero no se si es por la versión, por mi torpeza o por ....., lo cierto es que no me funcionó, ahora no recuerdo el problema que tuve.

En definitiva gracias a todos por vuestro tiempo y vuestra paciencia.
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 29/Enero/2016 a las 10:00
Te adjudicas méritos que no demuestras, yo la primera vez que 'jugué' con bases de datos lo hice con el ZX 81, (posiblemente ni lo conozcas) y cuando comencé a programar en red fue con THEOS (que a lo mejor ni te suena) y trabajando en redes por puerto serial a 1200 baudios....
Como yo (y mejores) hay muchos en el foro, asi que esa mitad que te atribuyes posiblemente sea un 0,001 por ciento.

Que estés a punto de jubilarte no es indicativo de nada, hay muchos en el foro (sobre todo los 'por antiguos = expertos') en similares condiciones (yo mismo) y no me he dedicado a vivir de la programación, siempre ha sido un accesorio (útil) pero no el pan de cada día (lo que ocurre es que me encanta conocer 'como funcionan las cosas' no me conformo con manosearlas).

Access es como otra aplicación cualquiera, solo tiene 'encima' una nueva capa de abstracción para hacerle amable el entorno a los que comienzan y por eso 'hace en su lugar' (o le da 'masticadito') un montón de conversiones y adaptaciones

Todo eso 'se pierde' si bajamos un nivel (nos adentramos en VBA) y por ello el tratamiento que efectúa la capa de abstracción con los datos, hay que hacerlo a mano.

Creo que 'esa respuesta no valida' era esta:
Origen:
(asumo que copiada de la ventana 'vista SQL de una consulta grafica)
SELECT Plazos.DL_DATEBC FROM Plazos WHERE ((Plazos.DL_DATEBC) Between Desde and Hasta)

La 'solución' equivalente(la comento):

'dimensionamos las variables a utilizar como corresponde a una programación ética
Dim Desde as Double, Hasta As Double, SQL As String

'se desconoce si el origen de datos es un texto 'un texto no es una fecha Access' y a una fecha se la puede tratar como numero y evitar errores de formatos regionales

'CDate es una función que convierte un texto en fecha-Access, si se corresponde con cualquier formato regional activo

'CDBL es otra función que se puede utilizar para convertir esa fecha-Access en numero (y los números, números son)
Desde = Cdbl(Cdate("01/01/2015"))
Hasta = Cdbl(Cdate("31/01/2015"))


'Asignamos el contenido a la variable de de tipo texto y de nombre SQL (ojo : es un texto que representa a una SQL, se le puede llamar SQL o ElCastilloDeLaMontaña)
SQL = "SELECT [DL_DATEBC] FROM Plazos WHERE [DL_DATEBC] Between " & Desde & " and " & Hasta

En SQL aparecería algo como:
(para ver este resultado se tendría que parar la aplicación y ejecutar en la 'ventana de inmediato' un
?SQL
el cual mostaría (con los datos del ejemplo):
SELECT [DL_DATEBC] FROM Plazos WHERE [DL_DATEBC] Between 42005 and 42035


Pero ESO NO VALE PARA NADA, que exista una cadena de texto con una SQL valida no implica que exista ese conjunto de datos, para que 'exista' ese conjunto habrá que asignárselo a algo (un formulario, un combo, o internamente un recordset) y aquí aparece nuevamente la capa superior de Access, pues una consulta grafica guardada (las que aparecen en la lista de consultas) son 'sin serlo' supuestos conjuntos de datos que tienen (se lo concede la capa de abstracción) un entorno de visualización (digamos que asumen el estatus de tablas temporales en modo 'hoja de datos')

Y aquí acaba la función, pues esa SQL (y cualquera otra que no sea de acción) por mucho que se ejecute no devuelve NADA, se la ha de asignar a algo para poder manejar los resultados como por ejemplo a un formulario con algo asi y en su evento Open:
Me.RecordsSource = SQL

O a un cuadro de lista asi:
Me.ElCuadroDeLIsta.RowSource = SQL

En definitiva: además de generar hipotéticos conjuntos de datos, se les ha de asignar un cometido.
Arriba
admin Ver desplegable
Administrador
Administrador
Avatar

Unido: 14/Agosto/2013
Localización: Cualquier lugar
Estado: Sin conexión
Puntos: 790
Enlace directo a este mensaje Enviado: 29/Enero/2016 a las 10:38
Publicado originalmente por lbauluz lbauluz escribió:

Los paréntesis de la fecha solo son para mantener el formato original del usuario, creo (o espero) que así le puede resultar más fácil entender la respuesta.


Hola Luis. No era mi intención rectificar nada de tu respuesta, ya sabes que yo te admiro y te respeto. Era poner de manifiesto algo claro y alto tres cosas:

1)  Que ambas sintaxis eran muy parecidas, salvo los paréntesis y que yo sí he hecho pruebas reales (No tengo otra cosa que hacer pues ya estoy jubilado y prefiero hacer estas pruebas que estar mirando obras en construcción como los abueletes).

2) Pues eso, que había hecho pruebas reales y había funcionado perfectamente.
 
3) Parece ser que la persona que ha preguntado,  tiene una larga y dilatada experiencia en la programación, según manifestaciones suyas, por lo cual le felicito.
No obstante calculo que en este foro habrá unas 50  personas (LLevo muchos años entrando aquí y lo sé) con tanta o más dilatada experiencia que la que manifiesta y se le presupone.

Sinceramente no sé a cuenta de qué ha venido ese comentario de la experiencia, en un hilo que trataba de algo trivial en Access, como es poner una sentencia SQL de fechas "como dios VBA manda"

En fin...si en un futuro alguien lee este hilo, buscando algo similar, señalar a ciencia cierta, que tanto la respuesta de Enrique Feijoo, como la de Luis como la mía son válidas y funcionan perfectamente en codigo SQL de VBA de Access.
Un saludo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable