Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Alguien me puede decir este error!! (https://www.clubdelphi.com/foros/showthread.php?t=51858)

Alsaca 02-01-2008 16:21:03

Alguien me puede decir este error!!
 
Buasa todo el foro. Quiero que me aparezca en un dbgrid las fechas que le queden un mes para su caducidad. Tengo una tabla en paradox con un tquery, este es mi código. Y me da el error "Type mismatch in expression".

Código Delphi [-]
tclient.Open;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.text := 'select * from tclient where f_cad <= :f_nueva';
Query1.parambyname('f_nueva').value := now-30;
Query1.Open;

Haber quién me puede decir algo.



Gracias.

kuan-yiu 02-01-2008 16:43:58

Debes indicar el tipo del parámetro:
Código Delphi [-]
Query1.parambyname('f_nueva').AsFloat := now-30;

enecumene 02-01-2008 16:44:18

Código Delphi [-]
tclient.Open;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.text := 'select * from tclient where f_cad <= :f_nueva';
Query1.parambyname('f_nueva').value := DateToStr(now-30);
Query1.Open;

Mira a ver si te funciona ahora.

Saludos.

Alsaca 02-01-2008 16:55:35

Me funciona la opción qe me da kuan-yiu, el error ya no lo tengo.... pero me muestra todas las fechas que hay en la tabla, no las que caducan dentro de un mes, y creo que el código es correcto.



Gracias a los dos por contestar tan rápido.

kuan-yiu 02-01-2008 17:53:44

Es que la consulta que haces te saca las fechas de hace un mes "hacia atrás": te sacaría todo lo del año pasado y el anterior. Lo que necesitas es "hacia delante", ¿no?
Código SQL [-]
select * from tclient where f_cad >= sysdate-30

jachguate 02-01-2008 18:19:28

En lugar de AsFloat, debieras usar AsDateTime.

Hasta luego.

;)

Alsaca 08-01-2008 16:21:05

Creo que el problemas puede estar en las conexiones, vamos haber como lo explico.... el Query conectado al datasource1, el datasourece1 a la tabla tclient y el dbgrid al datasource1.... es que no encuentro otra lógica, puesto que me sigue saliendo cuando hago la consulta todas las fechas que hay en la tabla.


Una ayuda por favor.....

jachguate 09-01-2008 00:30:58

a ver a ver... creo que el problema está en que tenes una tabla y un query. Esto no hace falta. El DataSource1 o solo tiene una fuente de datos (por eso se llama DataSource) que será la tabla o el query, pero no ambos.

A menos que se trate de una relación maestro detalle, pero eso no se ha mencionado.

Los datos de dicha fuente serán los que se muestren en el grid.

Hasta luego.

;)

egostar 09-01-2008 00:44:50

Cita:

Empezado por jachguate (Mensaje 256813)
a ver a ver... creo que el problema está en que tenes una tabla y un query. Esto no hace falta. El DataSource1 o solo tiene una fuente de datos (por eso se llama DataSource) que será la tabla o el query, pero no ambos.

A menos que se trate de una relación maestro detalle, pero eso no se ha mencionado.

Los datos de dicha fuente serán los que se muestren en el grid.

Hasta luego.

;)

Efectivamente amigo jachguate,

Al principio pense que estaba mal asignados los objetos, pero viendo la sentencia del query está pasando el dato "olimpicamente".....

Código Delphi [-]
// tclient.Open; No es necesario
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.text := 'select * from tclient where f_cad <= :f_nueva';
Query1.parambyname('f_nueva').value := now-30; //Aqui se esta pasando el parametro
Query1.Open;

Por tanto, la liga de objetos debe ser mas simple
  • DataSource1 ligado al Query1
  • DBGrid1 ligado al DataSource1
  • Quitar la liga del DataSource1 del Query1

Salud OS

Alsaca 09-01-2008 10:29:32

Antes de nada, gracias a todos... explico lo que he cambiado:

Datasource1 ligado al Query1
Dbgrid ligado al Datasouce1
Query1 no está ligado al datasource1, solo a la tabla.

He tenido que quitar value, porque me da el error TYPE MISMATCH, y en su lugar he puesto asdate. Hasta aquí creo que todo correcto, pero a la hora de ejecutar no muestra nada en el Dbgrid, ya no se. por donde seguir.

Lepe 09-01-2008 11:24:39

Cita:

Empezado por Alsaca (Mensaje 256881)
. Hasta aquí creo que todo correcto, pero a la hora de ejecutar no muestra nada en el Dbgrid, ya no se. por donde seguir.

Pues está claro que no hay registros con fecha menor o igual a la f_nueva.

Si estás seguro de que sí existen, entonces revisa el tipo de campo (ya que si guarda la hora), es muy posible que el fallo venga por ahí.

Otro lado por donde pueda venir el fallo, es que now() incorpora la fecha y hora, por tanto estás suministrando la parte de la hora a la consulta. Si tu campo es de tipo fecha (sin la porción de hora), quizás sea lógico el resultado. Para este caso:
Código Delphi [-]
Query1.parambyname('f_nueva').AsDate := Date - 30; //Aqui se esta pasando el parametro

Saludos

Alsaca 09-01-2008 20:01:07

Gracias Lepe, te explico:

f_cad=:f_nueva con date solo y coincidiendo los registros, lo muestra sin problema.

f_cad<=:f_nueva con date-30 y coincidiendo los registros, no lo muestra.

Entonces explico o que quiero hacer, no vaya a ser que me haya explicado mal....

Quiero que en el Dbgrid me muestre las fechas de caducidad, las cuales falten para caducar 30 días o menos. Creo que lo he explicado bien...



Saludos, y gracias.

enecumene 09-01-2008 20:37:42

Bueno, a ver si entendimos, tienes una campo f_nueva que es una fecha posiblemente la actual o la del momento del registro, no? entonces tienes otro campo llamado f_cad que es la fecha de caducación me parece no?, vale, y lo quieres mostrar en el dbgrid con un mes de diferencia, o sea, un mes mas de la fecha registrada en f_nueva, si es asi entonces deberias usar en la consulta una de estas dos funciones:

en caso de que uses SQL Server:

ADD_MONTHS: devuelve la fecha incrementada en "n" meses.

Código SQL [-]
select ADD_MONTHS(f_nueva, 1) as f_cad from tclient

en caso de que uses MySql:

DATE_ADD

Código SQL [-]
select DATEADD(f_nueva INTERVAL 1 MONTH) as f_cad from tclient //creo que es asi no recuerdo lo hice al vuelo

Saludos.

Lepe 09-01-2008 21:06:04

Cita:

Empezado por Alsaca (Mensaje 256998)
Quiero que en el Dbgrid me muestre las fechas de caducidad, las cuales falten para caducar 30 días o menos. Creo que lo he explicado bien...

Si falta para caducar 4 días, entonces f_cad será una fecha futura. Si pides las fechas f_cad <= : (hoy - 30 días) jamás dará resultados, porque:
- f_cad es una fecha futura
- (hoy - 30 días) es una fecha pasada

obviamente:
"una fecha futura no es menor o igual a una fecha pasada" por eso sale el grid en blanco.

Tip del día: hazte una línea del tiempo con papel y lápiz y pon ejemplos, lo verás más claro.

Resumen: El where deberá ser "where f_cad between :Hoy and :Hoy + 30"

Al parámetro ":Hoy" le darás el valor de la función Date().

Creo haberlo expresado de la forma más enrevesada posible :D :D, espero lo entiendas ;).

Saludos

enecumene 09-01-2008 21:10:15

Amigo Lepe una explicación mas clara de ahi se daña.:D:D:D.

Saludos.

jachguate 09-01-2008 21:24:37

Cita:

Empezado por Alsaca (Mensaje 256998)
Quiero que en el Dbgrid me muestre las fechas de caducidad, [b]las cuales falten para caducar 30 días o menos[b]. Creo que lo he explicado bien...

Es un error de lógica. Con el query tal como lo tenés, mostrarás las que hayan caducado hace 30 días o mas.

Para ver los que caducarán en el futuro (los siguientes 30 días) el query debiera ser algo como:

Código SQL [-]
select *
  from tabla
 where f_cad between :hoy and :unmes
Código Delphi [-]
  Query1.ParamByName('hoy').AsDateTime := Date;
  Query1.ParamByName('unmes').AsDateTime := Date + 30;

Hasta luego.

;)

jachguate 09-01-2008 21:26:06

jajaja.. lo siento, veo que lepe y yo hemos respondido lo mismo... es mi mala costumbre de dejar abierta una página del club mientras hago otras cosas.. :D

Lepe 09-01-2008 21:53:41

Cita:

Empezado por jachguate (Mensaje 257027)
jajaja.. lo siento, veo que lepe y yo hemos respondido lo mismo... es mi mala costumbre de dejar abierta una página del club mientras hago otras cosas.. :D

Y además hemos citado el texto de Alsaca poniendo en negrita las mismas palabras :D.

Lástima que lo hayas explicado de forma cristalina, mi intención era fundir neuronas de todo aquel que leyera mi respuesta :p :p. enecumene, ¿conseguí mi objetivo? :D

OFFTOPIC: recien he acabado mi jornada laboral y estaba un pelin espeso.

Saludos

Alsaca 10-01-2008 10:01:29

Gracias enecumene, jachguate, lepe y a todos los que me habéis ayudado, ahora funciona perfectamente... Quisiera hacer una última consulta, aunque ya estaréis agobiado conmigo....

El Dbgrid se compone de dos fechas de caducidad F_cad y F_cade.... Cuando f_cad está en el rango de menos de un mes, lo muestra sin problemas, pero también muestra la fecha f_cade, aunque el rango sea mayor de un mes, sea cuando caduque siempre la muestra, y lo que necesito es que muestre la que vaya a caducar.


Gracias a todos de corazón, por el tiempo que habéis perdido conmigo.

Lepe 10-01-2008 12:48:30

En lo sucesivo, te recomiendo que plantees el problema completo, así nos hacemos una idea completa de lo que necesitas. Además explica qué significa cada campo, porque al entender de qué va el asunto, podremos afinar más.

Se supone que deberías hacer lo mismo para la fecha f_cade

Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.add( 'select * from tclient where (f_cad  between :Hoy and :hoy + 30)');
Query1.SQL.add('and (f_cade between :hoy and :hoy +30) ');
Query1.parambyname('hoy').asDate := Date;
Query1.Open;

Saludos


La franja horaria es GMT +2. Ahora son las 17:59:06.

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