Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-01-2008
Alsaca Alsaca is offline
Miembro
 
Registrado: dic 2007
Posts: 31
Poder: 0
Alsaca Va por buen camino
Question 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.

Última edición por dec fecha: 02-01-2008 a las 16:32:17.
Responder Con Cita
  #2  
Antiguo 02-01-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Debes indicar el tipo del parámetro:
Código Delphi [-]
Query1.parambyname('f_nueva').AsFloat := now-30;
Responder Con Cita
  #3  
Antiguo 02-01-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #4  
Antiguo 02-01-2008
Alsaca Alsaca is offline
Miembro
 
Registrado: dic 2007
Posts: 31
Poder: 0
Alsaca Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 02-01-2008
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
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
Responder Con Cita
  #6  
Antiguo 02-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
En lugar de AsFloat, debieras usar AsDateTime.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 08-01-2008
Alsaca Alsaca is offline
Miembro
 
Registrado: dic 2007
Posts: 31
Poder: 0
Alsaca Va por buen camino
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.....
Responder Con Cita
  #8  
Antiguo 09-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 09-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por jachguate Ver Mensaje
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
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #10  
Antiguo 09-01-2008
Alsaca Alsaca is offline
Miembro
 
Registrado: dic 2007
Posts: 31
Poder: 0
Alsaca Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 09-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Alsaca Ver Mensaje
. 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 09-01-2008
Alsaca Alsaca is offline
Miembro
 
Registrado: dic 2007
Posts: 31
Poder: 0
Alsaca Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 09-01-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #14  
Antiguo 09-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Alsaca Ver Mensaje
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 , espero lo entiendas .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 09-01-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Amigo Lepe una explicación mas clara de ahi se daña..

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #16  
Antiguo 09-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Alsaca Ver Mensaje
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #17  
Antiguo 09-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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..
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #18  
Antiguo 09-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por jachguate Ver Mensaje
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..
Y además hemos citado el texto de Alsaca poniendo en negrita las mismas palabras .

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

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

Saludos
__________________
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: 09-01-2008 a las 21:56:13.
Responder Con Cita
  #19  
Antiguo 10-01-2008
Alsaca Alsaca is offline
Miembro
 
Registrado: dic 2007
Posts: 31
Poder: 0
Alsaca Va por buen camino
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.

Última edición por Alsaca fecha: 10-01-2008 a las 12:19:05.
Responder Con Cita
  #20  
Antiguo 10-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



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
Alguien sabe qué significa este error??? Chalo78 Varios 7 09-02-2006 21:32:15
Error en QReport - Alguien puede ayudarme? tehuacanero Impresión 4 21-09-2005 10:14:03
Alguien tiene idea de que sea este error.... Alfredo Varios 2 04-02-2005 13:59:15
Ehm, alguien me puede facilitar éste código? gatsu PHP 3 09-07-2004 13:35:01
Me ayuda alguien con este msg de error? NaZZ Varios 4 12-03-2004 09:31:25


La franja horaria es GMT +2. Ahora son las 04:20:57.


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