Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda Con Sql (https://www.clubdelphi.com/foros/showthread.php?t=94712)

cloayza 05-06-2020 18:33:26

Como dices los compañeros, lo del formato despliegue lo defines tu.

Mencionas en tu primer post que usas los componentes FIBPlus.

Bueno el TpfIBDataset tiene una propiedad 'DefaultFormats' en la cual puedes definir los siguientes formatos de despliegue:
Código Delphi [-]
     DefaultFormats.DateTimeDisplayformat:='dd.mm.yyyy hh:mm';
     DefaultFormats.DisplayFormatDate:='dd.mm.yyyy';
     DefaultFormats.DisplayFormatTime:='hh:mm';
     DefaultFormats.NumericDisplayFormat:='#,##0.0';
     DefaultFormats.NumericEditFormat:='0.0';

Con esto das solución a el problema al formato de despliegue de datos.

Saludos cordiales

marcial 07-06-2020 19:15:51

Perdonad que os moleste de nuevo con este tema. He usado los parámetros como me habéis dicho pero con este código me da el error:
SQL Error code -303
Arithmetic excepcion, numeric overflow or string truncation.

El código que uso es:
Código Delphi [-]
HistoricoRecibos.Close;
HistoricoRecibos.SelectSQL.Clear;
HistoricoRecibos.SelectSQL.add('SELECT * from HistoricoRecibos');
HistoricoRecibos.SelectSQL.add('where (Upper(Socio) LIKE :Socio)');
HistoricoRecibos.SelectSQL.add('OR Cast(lpad(extract(Month from FECHAEMISION),2,''0'') as VarChar(3)) || ''.'' || 
                                   Cast(lpad(extract(Day from FECHAEMISION),2,''0'') as VarChar(3)) || ''.'' || 
                                   Cast(extract(year from FECHAEMISION) as VarChar(5)) LIKE :FechaEmision');
HistoricoRecibos.ParamByName('Socio').AsString := '%' + Edit1.Text + '%';
HistoricoRecibos.ParamByName('FechaEmision').AsString := '%' + Edit1.Text + '%';

HistoricoRecibos.QSelect.ExecQuery;
HistoricoRecibos.Open;

Cuando voy introduciendo la fecha en el Edit1 en este formato: ej."23.06.202" hasta aqui funciona bien y hace bien la consulta, pero cuando introduzco el último "0" de "año 2020" me da el error.

He probado con Cast, Extract y este código es el que mas se aproxima a lo que quiero, sabéis que puede pasar para que me de ese error??
Gracias por anticipado.

mamcx 08-06-2020 01:45:35

Presta atención al consejo: Sigues sin usar los tipos de datos correctos. Estas mandando como texto un fecha.

kuan-yiu 08-06-2020 08:49:36

Esto no tiene los tipos adecuados: fechas como fechas, enteros como enteros...
Código Delphi [-]
HistoricoRecibos.ParamByName('FechaEmision').AsString := '%' + Edit1.Text + '%';  //NO

HistoricoRecibos.ParamByName('FechaEmision').AsDateTime:= StrToDate(Edit1.Text);  //Solo cuando la fecha esté completa

mamcx 08-06-2020 20:14:00

Y agregaria: Deja de usar un control de texto para un campo fecha. Usa uno que no requiera uso de StrToDate, como TDateTimePicker

marcial 08-06-2020 21:31:30

Gracias por vuestros consejos y tenéis razón. Sólo deciros que cuando se hacen las grabaciones (append o edit) los campos están definidos correctamente los Date con DateTimePicker y los numericos con FloatEdit etc. Sólo he usado los CampoDate.AsString para filtrar las consultas con el LIKE según va cambiando el Edit de la busqueda caracter a caracter para intentar conseguir que si en el Edit de busqueda tecleo un 2, que me filtre TODOS aquellos registros que en cualquiera de sus campos contengan un "2", si luego tecleo "3", que aparezcan todos los campos que contengan "23", y así sucesivamente hasta acotar al máximo el resultado deseado.

Caminante 08-06-2020 22:00:36

Cita:

Empezado por marcial (Mensaje 537565)
Gracias por vuestros consejos y tenéis razón. Sólo deciros que cuando se hacen las grabaciones (append o edit) los campos están definidos correctamente los Date con DateTimePicker y los numericos con FloatEdit etc. Sólo he usado los CampoDate.AsString para filtrar las consultas con el LIKE según va cambiando el Edit de la busqueda caracter a caracter para intentar conseguir que si en el Edit de busqueda tecleo un 2, que me filtre TODOS aquellos registros que en cualquiera de sus campos contengan un "2", si luego tecleo "3", que aparezcan todos los campos que contengan "23", y así sucesivamente hasta acotar al máximo el resultado deseado.




Hola


Como ya te explicaron los tipo datetime son representados internamente como numeros aunque al visualizarlos tengan el formato de fecha que conocemos.
Haciendo una prueba rapida hice esto:


Código Delphi [-]
edit1.Text:=FloatToStr(Now);


Obteniendo: 43990.6227021528


Si te das cuenta para la fecha 08/06/2020 obtengo este numero con lo cual al querer filtrar mientras este escribiendo la fecha no te va a funcionar; es mas te dara errores por todos lados. Te estas complicando innecesariamente. Las fechas debes filtrarlas cuando ya esten ingresadas completamente.


Saludos

mamcx 08-06-2020 22:10:09

Cita:

Empezado por marcial
Sólo he usado los CampoDate.AsString para filtrar las consultas con el LIKE...

Que es el mismo problema :). Si miras la documentacion de LIKE veras que es un operador de TEXTO. No uno de FECHAS. Es como intentar usar UPPER con un numero: No tiene sentido.

Es MUY problematico hacer esos brincos de tipos, porque eso afecta todo: El orden, la exactitud, lo correcto de esas operaciones, la velocidad (si esos campos tienen indices al pasar a texto LOS ANULASTE), etc.

Mira por ejemplo:

"Mentiras que los programadores creen sobre el tiempo":

https://infiniteundo.com/post/253269...eve-about-time

Con solo los primeros flipas:

Cita:

There are always 24 hours in a day.
Months have either 30 or 31 days.
Years have 365 days.
February is always 28 days long.
---
Asi que lo que debes hacer es usar la funcion de fecha correcta, o traducir lo que hace LIKE al pensamiento de fechas. Si lo que quieres es filtrar por ejemplo "dame los registros del mes", entonces debe extraer el año/mes y comparar con año/mes.

Para eso consulta la documentacion de la BD. Hay estan las funciones correctas de fecha.

P.D: Aunque a nivel informativo te han explicado como internamente estan implementados los tipos de fecha, NO USES FECHAS ASI. Es incorrecto convertir fechas a flotantes* y hacer comparaciones. Es igual de erroneo que usar texto.

*Porque hacer comparaciones con flotantes es de los mas flipante/absurdo que hay.

Casimiro Notevi 08-06-2020 23:13:21

Cita:

Empezado por mamcx (Mensaje 537567)
P.D: Aunque a nivel informativo te han explicado como internamente estan implementados los tipos de fecha, NO USES FECHAS ASI. Es incorrecto convertir fechas a flotantes* y hacer comparaciones. Es igual de erroneo que usar texto.

*Porque hacer comparaciones con flotantes es de los mas flipante/absurdo que hay.

Totalmente, era solamente para que comprendiera cómo es "por dentro".

Caminante 09-06-2020 00:06:33

Cita:

Empezado por Casimiro Notevi (Mensaje 537569)
Totalmente, era solamente para que comprendiera cómo es "por dentro".


Si exactamente :D


Saludos

Caminante 09-06-2020 00:10:21

Cita:

Empezado por marcial (Mensaje 537565)
Sólo he usado los CampoDate.AsString para filtrar las consultas con el LIKE según va cambiando el Edit de la busqueda caracter a caracter para intentar conseguir que si en el Edit de busqueda tecleo un 2, que me filtre TODOS aquellos registros que en cualquiera de sus campos contengan un "2", si luego tecleo "3", que aparezcan todos los campos que contengan "23", y así sucesivamente hasta acotar al máximo el resultado deseado.




Lo que debes comprender es que aunque uses Asstring para pasar un texto al parametro internamente al procesar la consulta firebird lo hara con el tipo real del campo osea Date, si le pasas "23" no lo podra manejar ya que no es un valor de fecha valido. Debes enviar una fecha completa.


Saludos


La franja horaria es GMT +2. Ahora son las 08:40:22.

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