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

Alsaca 10-01-2008 13:46:10

Gracias Lepe, y perdona por no haber puesto todo desde el principio.. No me funciona bien... prefiero mandarte los fuentes y que tu lo veas directamente lo que pasa... si quieres me das tu correo o por msn, como quieras.



Gracias.

enecumene 10-01-2008 14:18:34

Cita:

Empezado por Lepe (Mensaje 257039)
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

Claro que si Amigo Lepe, y por lo visto el amigo Alsaca lo pudo resolver seguro gracias a tu explicación.

Saludos.

Alsaca 10-01-2008 15:44:01

Por favor, no quiero malos rollos por mi culpa, todos me habéis ayudado mucho.



Gracias a todos.

enecumene 10-01-2008 15:49:45

Cita:

Empezado por Alsaca (Mensaje 257178)
Por favor, no quiero malos rollos por mi culpa, todos me habéis ayudado mucho.



Gracias a todos.

No hombre aqui esta pasando nada, no te preocupes solo estamos conversando entre amigos, no pasa nada.

Saludos.

jachguate 10-01-2008 17:34:08

Hola.

Me alegra que se haya avanzado en el problema.
Cita:

Empezado por Alsaca (Mensaje 257114)
Quisiera hacer una última consulta, aunque ya estaréis agobiado conmigo....

Cita:

Empezado por Alsaca
prefiero mandarte los fuentes y que tu lo veas directamente lo que pasa... si quieres me das tu correo o por msn, como quieras

Claro que quien decide si acepta esto o no es Lepe, pero quiero aprovechar para acotar lo que, según mi punto de vista, debiera ocurrir.

Estos foros son un sitio donde el conocimiento se transmite de una manera asombrosa y, según yo lo veo, su principal objetivo es que esto ocurra. Dicho en otras palabras, es que vos aprendas, con la ayuda de todos, y ya has visto que talento no nos falta entre las personalidades que participan y aportan en el club.

Lo que no es nuestro objetivo acá, es hacer el trabajo o asumir las responsabilidades de nadie. Claro que nadie aprende simplemente por el hecho de recibir una buena explicación, quienes lo hacen son quienes se queman las pestañas y dedican suficiente tiempo y esfuerzo en hacerlo...

Con todo respeto, creo que has recibido ayuda suficiente para salir del problema por vos mismo. Quizás tome mas de 5 minutos... eso depende de vos.

Por mi, si volves acá después de un par de días con el mismo problema, pero ya habiéndote esforzado, no hay ningún inconveniente en darte un empujón... pero por ahora, creo que es suficiente.

Que conste en actas que digo todo esto sin mal rollo.

Hasta luego.

;)

Alsaca 10-01-2008 17:36:38

Bueno después de un poco de calma, pongo lo que lepe me ha comentado:


Query1.Close;
Query1.SQL.Clear;
Query1.SQL.add( 'select * from tclient where (f_cad between :Hoy and :unmes)');
Query1.SQL.add( ' and (f_cade between :hoy and :unmes)');
Query1.parambyname('hoy').asDatetime := Date;
query1.ParamByName('unmes').asdatetime :=date + 30;
Query1.Open;

NO muestra nada en el dbgrid, esté cualquiera de las dos fechas en el rango de hoy + 30.


Donde está el error?


Saludos.

Alsaca 10-01-2008 17:41:09

Estoy de acuerdo jachguate y perdona si he abusado de ustedes... intentaré resolver el problema yo mismo como pueda....


Os pido mil disculpas....



Saludos de ALsaca.

enecumene 10-01-2008 17:52:48

Cita:

Empezado por Alsaca (Mensaje 257207)
Bueno después de un poco de calma, pongo lo que lepe me ha comentado:


Query1.Close;
Query1.SQL.Clear;
Query1.SQL.add( 'select * from tclient where (f_cad between :Hoy and :unmes)');
Query1.SQL.add( ' and (f_cade between :hoy and :unmes)');
Query1.parambyname('hoy').asDatetime := Date;
query1.ParamByName('unmes').asdatetime :=date + 30;
Query1.Open;

NO muestra nada en el dbgrid, esté cualquiera de las dos fechas en el rango de hoy + 30.


Donde está el error?


Saludos.

veo algo extraño aqui, pero hay algo repetido en la sentencia "(f_cade between :hoy and :unmes)" esta puesto dos veces, y otra cosa, intentaste usar las sentencias que te recomende anteriormente??.

Saludos.

Lepe 10-01-2008 17:54:38

Estoy de acuerdo con jachguate, lo importante es dar pistas y que la propia persona que pregunta lo tome como punto de partida, pero a veces, un código es más aclaratorio que media página explicando los conceptos.

Según veo en tu penúltimo mensaje, has hecho una mezcla entre lo que jachguate y yo hemos dicho, por tanto es obvio que te has esforzado en entender el problema.

En cuanto al problema, ten en cuenta que las dos claúsulas se enlazan por medio del operador "and", es decir, tanto f_cad y f_cade deben estar en ese rango de fechas para ser mostrado en el grid. Si un registro tiene f_cad en el rango de fechas pero f_cade está fuera del rango, no mostrará ese registro en el grid. Si en lugar del operador "and" usas un "or" si obtendrás este registro en el grid.

Ya esto es problema del lenguaje SQL, te aconsejo un manual SQL de tantos que hay en internet. Avanzarás más rápido por tí mismo que esperar una respuesta por parte del foro.

Saludos

Lepe 10-01-2008 17:56:30

Cita:

Empezado por enecumene (Mensaje 257216)
veo algo extraño aqui, pero hay algo repetido en la sentencia "(f_cade between :hoy and :unmes)" esta puesto dos veces

No exactamente, fíjate que son dos campos distintos f_cad y f_cade. El hecho de repetir parámetros no es pega ninguna.

Saludos

enecumene 10-01-2008 17:59:10

Cita:

Empezado por Lepe (Mensaje 257219)
No exactamente, fíjate que son dos campos distintos f_cad y f_cade. El hecho de repetir parámetros no es pega ninguna.

Saludos

:eek::eek:Vale no me habia fijado, es cierto.:D:p

Alsaca 10-01-2008 18:07:05

Gracias a todos y os pido me perdonéis. Buscaré manuales e intentaré buscar la solución correcta al problema que tengo....



Muchas gracias a todos y mil disculpas....


Alsaca.


La franja horaria es GMT +2. Ahora son las 09:38:07.

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