Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Parametros tipo DATE que no funcionan como supondría.

A ver si alguien me puede dar un norte.

Uso FB Embedded 2.0 y quiero hacer esta consulta:

Código SQL [-]
  Select folio, fecha from facturas
      where fecha between extract(DAY from :fecha1) and extract(DAY from :fecha2

En Delphi utilizó los parámetros :fecha1 y :fecha2 para introducir las fechas por medio de datetimepickers así:
Código Delphi [-]
   With MiQuery Do
   Begin
      ParamByNAme('fecha1').Asdate := efecha1.date;
     ParamByNAme('fecha2').AsDate  := efecha2.Date;
   end;

Sin embargo cuando ejecuto el query me genera el error -105 que menciona que el parametro de EXTRACT no es una fecha literal válida.

Leyendo un poco me entero que FB tiene la graciosada de considerar las fechas divididas con "/" como fechas en formato gringo sin importar nada de los parámetros de win o linux. Para especificarlo en otro formato hay que usar "." como separadores. Hasta aquí ya se entiende como arreglarlo pero entonces:

1.- Tendría que convertir el valor de los datepickers a cadena y sustituir los "/" por puntos.
2.- Tendria que añadir un cast a mi query para que me acepte la cadena en forma literal.

Si no hay otra forma pues ni modo pero quisiera ver si alguien lo pudo resolver usando los parámetros normalmente.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #2  
Antiguo 05-05-2008
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Creo que Extract te regresa un valor entero, y al compararlo con fecha debe de ser un tipo Date, entonces la comparación debe ser:

Código SQL [-]
  Select folio, fecha from facturas
      where extract(DAY from fecha) between 
          extract(DAY from :fecha1) and extract(DAY from :fecha2)
ó

Código SQL [-]
  Select folio, fecha from facturas
      where fecha between :fecha1 and :fecha2
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #3  
Antiguo 05-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
perdon...olvide mencionar que el campo fecha representa un día del mes o lo que es lo mismo un entero.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 06-05-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Y por qué en ves de resolverlo a nivel de FB, no lo resuelves a nivel de tu aplicación Delphi ?

En vez de pasarle el párametro como fecha, y después en FB sacar el día, sácalo directamente en Delphi y le pasas el parámetro como integer.

Código Delphi [-]
With MiQuery Do
Begin
  ParamByName('fecha1').AsInteger := DayOf(efecha1.Date);
  ParamByName('fecha2').AsInteger := DayOf(efecha2.Date);
end;

Código SQL [-]
Select folio, fecha from facturas
      where fecha between :fecha1 and :fecha2
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 06-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
finalmente metí un campo calculado y con eso me las arreglé.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #6  
Antiguo 06-05-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola!

Cita:
Empezado por AzidRain Ver Mensaje
...Sin embargo cuando ejecuto el query me genera el error -105 que menciona que el parametro de EXTRACT no es una fecha literal válida......Tendría que convertir el valor de los datepickers a cadena y sustituir los "/" por...
Probablemente definiste ese parámetro en Delphi como uno de tipo String en lugar de tipo Date. Esa puede ser la causa.

Cita:
Empezado por AzidRain Ver Mensaje
...Leyendo un poco me entero que FB tiene la graciosada de considerar las fechas divididas con "/" como fechas en formato gringo sin importar nada de los parámetros de win o linux...
Me parece que la mayoría de las bases de datos cliente-servidor hacen eso mismo.

Cita:
Empezado por AzidRain Ver Mensaje
...Para especificarlo en otro formato hay que usar "." como separadores...
El estándar que te aceptaría cualquier base de datos es el formato ISO (aaaa-mm-dd), es el recomendado a la hora de expresar fechas de forma literal. Pero creo que en tu caso no deberías recurrir a esto si en cambio usas parámetros de tipo Date en lugar de tipo String.

Perdón si no comprendí bien el planteamiento, César, ¿podrías detallarlo un poco más?

Saludos.

Al.
Responder Con Cita
  #7  
Antiguo 06-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Los párametros nunca los hé definido por tipo, simplemente dejo que Delphi les asigne el tipo de acuerdo con lo que le devuelve el motor y hasta ahora no tuve problemas.

La graciosada de los separadores no se si sea única de FB pero por ejemplo en MySQL por default utiliza el formato ISO pero se puede definir perfectamente cualquier otro formato que uno desee así como los separadores correspondiente.

Precisamente en MySQL utilizaba mis parametros como ".AsDate" y le pasaba directo el valor de los datepickers olvidándome del formato de fechas de MySQL y nunca tuve problemas.

En MySQL por ejemplo puedo hacer lo siguiente:

Código SQL [-]
  select dayof(:fecha)
y funciona perfectamente haciendo esto:
Código Delphi [-]
  MiQuery.ParamByNAme('fecha').AsDate := datepicker1.fecha;

Sin embargo ese mismo código no sirve para FB. Primero porque no hay tal función "DayOf" y segundo porque la función equivalente (que por cierto igual existe en MySQL) "extract" se niega a tomar los valores de un parámetro que se le pasen como fecha.

Para que funcione es necesario hacer esto:
Código SQL [-]
   extract( day from cast (:fecha as date))

Además de que el parametro :fecha hay que pasárselo como cadena y en formato "DD.MM.AAAA" si le pasa uno el parámetro :fecha como Date FB simplemente no le reconoce como fecha.
__________________
AKA "El animalito" ||Cordobés a mucha honra||

Última edición por AzidRain fecha: 06-05-2008 a las 06:00:10.
Responder Con Cita
  #8  
Antiguo 06-05-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Cita:
Empezado por AzidRain Ver Mensaje
Los párametros nunca los hé definido por tipo, simplemente dejo que Delphi les asigne el tipo de acuerdo con lo que le devuelve el motor y hasta ahora no tuve problemas...
El título del hilo señala que son parámetros de tipo Date, pero por lo que comentas tengo dudas de si realmente la propiedad DataType del parámetro en Delphi tiene un valor de ftDate, ¿podrías verificar esto? Me parece que con ajustar esa propiedad sería suficiente para que la función Extract trabaje sin problemas con el parámetro.

Cita:
Empezado por AzidRain Ver Mensaje
...en MySQL por default utiliza el formato ISO...
En Firebird y otras bases de datos cliente-servidor también.

Cita:
Empezado por AzidRain Ver Mensaje
...Precisamente en MySQL utilizaba mis parametros como ".AsDate" y le pasaba directo el valor de los datepickers olvidándome del formato de fechas de MySQL y nunca tuve problemas...
Creo que con ajustar la propiedad DataType del parámetro a ftDate debería ser igual. ¿Por qué no lo intentas y nos dices qué pasa?

Cita:
Empezado por AzidRain Ver Mensaje
...En MySQL por ejemplo puedo hacer lo siguiente:

Código SQL [-]
  select dayof(:fecha)
y funciona perfectamente haciendo esto:
Código Delphi [-]
  MiQuery.ParamByNAme('fecha').AsDate := datepicker1.fecha;

Sin embargo ese mismo código no sirve para FB. Primero porque no hay tal función "DayOf" y segundo porque la función equivalente (que por cierto igual existe en MySQL) "extract" se niega a tomar los valores de un parámetro que se le pasen como fecha...
Vuelvo a lo mismo, ¿seguro que es un parámetro de tipo fecha (ftDate)? Cabe mencionar que Extract es parte del estándar SQL (por ello MySQL también la incluye), mientras que DayOf no. Tratándose de bases de datos, es muy recomendable apegarse lo más posible al estándar SQL para evitar problemas de compatibilidad, conversión o transición. Cada base de datos agrega algunos comandos y funciones muy particulares (y en ocasiones es bueno utilizar éstos), pero algo que me gusta de InterBase / Firebird es el cuidadoso respeto que le tiene al estándar SQL.

No dejes de retroalimentar el hilo para llegar al punto justo de la verdad.

Saludos afectuosos.

Al González.
Responder Con Cita
  #9  
Antiguo 06-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Y había intentado forzar el tipo del parámetro a ftDate pero al ejecutar el programa me genera una excepción pues al parecer el query utiliza el parámetro como string.

Si en modo diseño escribo el query con los parámetros así tal cual lo indiqué al principio y luego quiero acceder a los parámetros mediante el object inspector me doy cuenta que ambos parámetros son tratados como cadenas, es decir les asigna el tipo ftString.

De hecho probé el mismo query en MySQL usando extract y ahi si funciona, es decir cuando le paso el parámetro como fecha MySQL lo interpreta correctamente como fecha.

Estaba pensando aunque no se que tan cierto sea pues de momento no tengo como probarlo, que el problema tal vez pueda ser el componente que uso para conectarme, en este caso Zeos, que es el mismo que usaba para conectarme vía MySQL.

Si corro querys normales sin parámetros si se ejecutan con este componente pero al parecer debe tener algún problema para lo de los parámetros. Recordemos que la sustitución de parámetros por los valores correspondientes los hace el componente de manera que probablemente esté haciendo esta sustitución de forma incorrecta. Nadando en el código de Zeos observé que utiliza diferente código cuando se conecta a MySQL.

¿Que otra alternativa tengo para conectarme a Firebird? Probablemente si cambio los componentes y lo intento de nuevo ahora si resulte.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #10  
Antiguo 06-05-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por AzidRain Ver Mensaje
Y había intentado forzar el tipo del parámetro a ftDate pero al ejecutar el programa me genera una excepción...
Conocer los detalles de tal excepción sería un buen punto de partida. ¿Podrías reproducir el problema?

Cita:
Empezado por AzidRain Ver Mensaje
...Estaba pensando aunque no se que tan cierto sea pues de momento no tengo como probarlo, que el problema tal vez pueda ser el componente que uso para conectarme, en este caso Zeos...Recordemos que la sustitución de parámetros por los valores correspondientes los hace el componente de manera que probablemente esté haciendo esta sustitución de forma incorrecta. Nadando en el código de Zeos observé que utiliza diferente código cuando se conecta a MySQL...
Por ahí podría estar la causa del problema.

Cita:
Empezado por AzidRain Ver Mensaje
...¿Que otra alternativa tengo para conectarme a Firebird? Probablemente si cambio los componentes y lo intento de nuevo ahora si resulte.
Eso sin duda. Con IBX y dbExpress no he tenido problema alguno al manejar parámetros de tipo fecha. Pero no por ello hay que dar por descalificado a Zeos, ya que podría haber por ahí alguna propiedad desconocida que arregle el problema. Personalmente no conozco Zeos, pero me resultaría interesante ver la parte del código donde Zeos decide que el parámetro debe ser ftString.

También considera que IBX está "casado" con InterBase, y no hay garantía de buen funcionamiento de estos componentes con Firebird 2. Yo utilizo dbExpress con el controlador de InterBase para acceder a bases de datos Firebird 1.5, apoyándome con objetos TClientDataSet. Cuando decida empezar a usar Firebird 2, sólo tendré que conseguir el controlador (DLL) adecuado (dbExpress es una tecnología abierta a cualquier base de datos y la más avanzada de CodeGear).

Seguimos indagando.

Al González.
Responder Con Cita
  #11  
Antiguo 06-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Efectivamente ya había leído que IBX esta ligado con Interbase y aunque funciona en la mayoría de los casos bien con FB no se garantiza su funcionamiento ya que FB cada vez se aleja más de IB. Ahora bien, dbExpress mencionas que utiliza un controlador para conectarse, pregunto si este controlador no puede ser el que utiliza en mi caso el servidor embedded de FB (fbclient.dll). Digo, para hacer la prueba.

Edito: Veo que SQLConnection mantiene una propiedad VendorLib que contiene gds32.dll que menciona la documentación de FB que puede ser sustituido por fbclient.dll para acceder al servidor. Voy a hacer la prueba a ver si funciona.

¿Hay alguna forma de meter el drivername de Firebird dentro del componente? De manera que cuando uno quiera conectarse con FB y sus bibliotecas propias solo haya que cambiar esta propiedad.
__________________
AKA "El animalito" ||Cordobés a mucha honra||

Última edición por AzidRain fecha: 06-05-2008 a las 17:58:50.
Responder Con Cita
  #12  
Antiguo 06-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Amigo Acid,
He leído que usas la versión 2.0, en ese caso deberías optar por algo más seguro, MDO FIBPlus, u otros... la verdad es que desconozco cuales son pagos y cuales son gratuitos.

Para la versión 1.5 con IBX yo no he tenido problemas, por el momento, pero el salto de 1.5 a 2.0 es algo brusco como para arriesgarse a seguir usando IBX. Al menos yo no me animaría a seguir usando IBX con la 2.0 habiendo bibliotecas que están preparadas para ello.

La compatibilidad de IBX a Firebird se está desaparaciendo.

Yo no uso otros componentes que no sea IBX, por el momento, tendrías que probar como dice Al si no hay por allí alguna propiedad en los componentes Zeos que permita trabajar correctamente con Firebird.

Supuestamente, por lo que he leído en otros hilos, Zeos trabaja bien con Firebird.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 06-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Me contesto yo mismo:

Si es posible definir la conexion con FB mediante la modificación del archivo dbxdrivers.ini que contiene las definiciones de todas las bases de datos que utiliza el componente.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #14  
Antiguo 06-05-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Me rindo...usando dbExpress y un pequeño programa para probar solamente este caso, me arroja el mismo problema:



Como pueden ver tenemos la excepción que se genera, arriba tenemos el código que uso para pasarle la fecha al parámetro y abajo el query que tengo definido.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #15  
Antiguo 06-05-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues no sé yo, pero tu consulta tampoco va desde el propio IB Expert.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 06-05-2008 a las 20:19:59. Razón: He descubierto la rueda
Responder Con Cita
  #16  
Antiguo 06-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
¿Entonces el error lo tienes en el extract?
Yo andaba pensando en que hasta podría ser el dialecto y/o el tipo que tienes definido en el campo. ¿Es TIMESTAMP? ¿DATE?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #17  
Antiguo 06-05-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Llevo media hora dándole vueltas a esto y buscando en Google, pero no encuentro nada relevente.

Después de algunas pruebas en IBExpert, pareciera que la función Extract en Firebird no soporta parámetros a menos que se esté dentro de un procedimiento almacenado y el parámetro en cuestión esté declarado en su cabecera. De ésta forma sí funciona, pero con un parámetro "suelto" no.

Debe existir una razón para esto. ¿Alguien puede verificar si pasa lo mismo con InterBase?

Saludos.

Al.
Responder Con Cita
  #18  
Antiguo 06-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Asi parece Al.
Tal parece que no permite parámetros en EXTACT.

He probado de varias maneras (Firebird 1.5.3, IBX, dialecto 3) y nada... me arroja el mismo error que a AzidRain.

¿Se nos estará pasando algo por alto? ¿O será algo propio de Firebird?
Pues yo ma me siento un tanto loquito por no hallarle vuelta.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #19  
Antiguo 06-05-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Delphius Ver Mensaje
Asi parece Al.
Tal parece que no permite parámetros en EXTACT...
OJO: No permite parámetros "sueltos" especificados "al aire", pero sí aquellos declarados en la cabecera del procedimiento almacenado en el que nos encontramos.

César podría optar por poner su consulta dentro de un procedimiento almacenado, como solución temporal.

Saludos.

Al.
Responder Con Cita
  #20  
Antiguo 06-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
OJO: No permite parámetros "sueltos" especificados "al aire", pero sí aquellos declarados en la cabecera del procedimiento almacenado en el que nos encontramos.

César podría optar por poner su consulta dentro de un procedimiento almacenado, como solución temporal.

Saludos.

Al.
No, claro. Te entiendo...
Nomás me quemé un poquito algunos cables buscandole la vuelta a traves de SQL.

De tanto probar, mi cerebro decidió mandar una instrucción que si entiende:
Código:
BRAIN OFF
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
tipo date jSr MySQL 7 14-11-2007 09:36:57
Como funcionan los indice para una tabla de tipo TADOTable locotenentul Conexión con bases de datos 1 10-04-2007 14:46:58
Como seleccionar de una campo tipo date solo el dia Gaby123 Conexión con bases de datos 1 06-09-2006 17:55:50
Como filtrar un campo tipo Date en una Tabla? JuanErasmo C++ Builder 6 21-12-2005 10:24:59
campo tipo date Giniromero Firebird e Interbase 21 13-08-2003 14:47:53


La franja horaria es GMT +2. Ahora son las 07:21:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi