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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
Consulta con SQL por fecha

Buenas compañeros,
uso tablas paradox y deseo hacer una consulta con tquery sobre unas tablas. En la consulta quiero filtrar el resultado por una fecha que la quiero coger de un TDateTimePicker. ¿Cómo puedo hacerlo en tiempo de ejecución? puesto que no me deja coger directamente en la query el valor del DateTimePicker1.Date. yo pensaba hacerlo así

Cita:
Select *
from x, ...
where tabla.fecha=DateTimePicker1.Date;
pero claro me da error

Muchas gracias

P.D. Si alguien me puede decir que función tengo que usar en el Select para poder sacar de la fecha de nacimiento la edad, directamente, se lo agradecería :-)
Responder Con Cita
  #2  
Antiguo 11-08-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Lo que tienes que poner en la select es un parámetro:

select * from table where fecha = aram

y después en el código le pasas el parámetro antes de ejecutrar la select:

(el ejemplo está preparado para componentes ADO)

Query.parameters.paramByName('param').Value := DateTimePicker1.date;
Query.open;

Un saludo


Edu
Responder Con Cita
  #3  
Antiguo 11-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
¿pero el parámetro tengo que crearlo antes, da igual el nombre que ponga?
Responder Con Cita
  #4  
Antiguo 11-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Ha salido la carita esa y puede que no se entienda bien, así que lo pongo de nuevo:
Código SQL [-]
 select * from x where  campoFecha >= :laFecha

En un SQL se puede poner los dos puntos y despues cualquier nombre, esto se interpreta como un parámetro, y como bien dice epuigdef hay que pasarle el parámetro antes de abrir la consulta:

Código Delphi [-]
Query.paramByName('laFecha').AsDate := DateTimePicker1.date;
query.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
  #5  
Antiguo 11-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
Cita:
Empezado por Lepe
Código SQL [-]
select * from x where campoFecha >= :laFecha
Al poner esto en la propiedad SQL del TQuery, me dice que el parametro "laFecha" no existe

¿tengo que añadirlo antes a algún sitio? por que esto otro:

Código Delphi [-]
Query.paramByName('laFecha').AsDate := DateTimePicker1.date;
query.Open;

lo pongo en el evento onchange del DateTimePicker1.

Muchas gracias
Responder Con Cita
  #6  
Antiguo 11-08-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola

Yo tambien estoy empezando con esto de los parametros, me funciono bien hasta ahora. tal vez lo que te falte es ponerle tipos a tus parametros.
Esto se lo coloca en la propiedad parameters, seleccionas el parametro que añadiste y en sus propiedades indicar lo siguiente:

Datype->ftDate
Value->Type->Date

Supongo que el primero es el tipo de dato de tu base de datos, y el segundo el tipo del parametro que le pasaras.

En resumen:
1. Colocas tu sentencia sql como te indicaron
2. Defines el tipo de tu parametro
3. llamas con parambyname como te indicaron

Lo hice funcionar con BDE, ahora con ADO, me funciono perfectamente

Que todos tengan un Buen Dia
Responder Con Cita
  #7  
Antiguo 11-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por Sayuri
Al poner esto en la propiedad SQL del TQuery, me dice que el parametro "laFecha" no existe
Tendrás la consulta abierta en modo diseño, porque se puede modificar la propiedad SQL sin tener los parámetros creados.

Se añade el Sql, y despues si accedes a la propiedad query.Params, verás que estan creados ya (delphi se encarga de analizar el SQL y crear los parámetros.

Yo en algunos casos ni siquiera le indico el Datatype ni VAlue --> Type, porque en ejecución uso:
Código Delphi [-]
Query.paramByName('laFecha').AsDate :=
Por tanto, ya sabe de que tipo son los parámetros.

Por cierto, deberás cerrar la consulta al cambiar el parámetro:
Código Delphi [-]
query.Close;
Query.paramByName('laFecha').AsDate := DateTimePicker1.date;
query.Open;

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 12-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
No me da error al hacer lo que me habeis dicho, pero no me coge ningún registro de la tabla, cómo si no existieran... y en esa fecha hay datos
Responder Con Cita
  #9  
Antiguo 12-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues parece que está intercambiando el mes por el dia en la fecha que le pasas.

La verdad, es muy raro, cuando se utiliza parámetros en SQL, delphi se encarga de resolver ese conflicto con el sistema gestor de Bases de datos, así que no deberías tener errores de ese tipo, a menos que hayas cambiado el formato de fechas en el control Datetimepicker.

En cambio, cuando se usa (en tablas paradox):
Código SQL [-]
where fecha >= '01/02/2005'
Aqui si hay problemas, ya que normalmente casará las fechas con el formato mm/dd/yyyy, y nos devuelve los registros con fecha 2 de Enero.

Código Delphi [-]
sql.Add('where fecha >= ' + formatDatetime('mm/dd/yyyy', datetimepicker1.date);

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 12-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
a lo mejor el problema está en que en vez de poner
Cita:
where campofecha >=:fecha;
utilizo
Cita:
where campofecha =:fecha;
porque necesito que sea exactamente igual, quiero decir que la búsqueda sea por ese dia
Responder Con Cita
  #11  
Antiguo 12-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Abre la tabla con el Database Desktop, igual está guardando la hora y por eso no te lo pilla, el operador "igual" si debe funcionar.

Una alternativa que no me gusta, sería indicar:
Código SQL [-]
  where fecha >  :FechaIni and fecha < :FechaFin
FechaIni le das la fecha que busca el usuario menos 1 dia
FechaFin le das la fecha que busca el usuario más 1 dia.

Un saludo
__________________
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 12-08-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Gracias amigo Lepe, por haberme hecho dar cuenta que no se necesita ponerle valores al Datype ni al Value, hoy hice la prueba en BDE y en ADO y me funciono todo correctamente.
Muchisimas Gracias
Responder Con Cita
  #13  
Antiguo 12-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
lo gracioso, es que utilizo varias querys en el programa y todas ellas dependen de lo mismo de un datetimepicker, pero la única que funciona correctamente es una en la que en el SELECT pongo una serie de columnas al final pongo lo del
Código SQL [-]
 where campofecha=: Fecha
y funciona corerctamente, pero en el resto de querys no funciona. En todas ellas tengo alguna función en el select cómo avg o count y algunas las tengo con group by, en todas estas es donde me da el error.

Espero que me podais ayudar, porque no tienen sentido que por la fecha me de error y si lo hago por cualquier otra exclusión (el where) como por el nombre o cualquier otra cosa me lo hace bien.
Responder Con Cita
  #14  
Antiguo 12-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
realmente no es que me de error, es que me dice que no hay ninguna... pero miro la fecha en la misma tabla en todos los casos, así que si se lee bien en una de las querys ¿por qué no en el resto? Además en una de las querys, que tengo asignadas por el DataSource a un DBGrid, al activarlas con el where maldito :-) de la fecha se me queda petado el Delphi 5.

Ala que os doy la brasa...

Muchas gracias
Responder Con Cita
  #15  
Antiguo 12-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pon el SQL completo de una consulta que te error o que no salga lo esperado.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #16  
Antiguo 16-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
perdón por el retraso :-) ha sido el puente, pero el error sigue ahi
en este caso me da error y no me deja activarlo se peta todo y tengo que cerrar el delphi:

Código SQL [-]
SELECT count(*) Pacientes, C.DESCRIPCIÓN Compañía
FROM HISTORIA H INNER JOIN COMPANIAS C ON H.COMPANIA=C.COD_COMPAÑIA
WHERE  (H.FECHA_ADMISION=:Fecha)
GROUP BY Compañía;

En este otro caso no me coge nada pero si no pongo en el where lo de la fecha va bien:
Código SQL [-]
SELECT count(*)
FROM HISTORIA
WHERE (HISTORIA.FECHA_ADMISION =:Fecha);


y el único caso en el que funciona bien es:
Código SQL [-]
SELECT H.NHC, P.APELLIDO_1, P.APELLIDO_2, P.NOMBRE, P.FECHA_NACIMIENTO,
       H.COMPANIA, H.MEDICO1, H.MEDICO2, H.HORA_ADMISION,
       H.HORA_CONSULTA, H.HORA_ALTA
FROM PACIENTES P INNER JOIN HISTORIA H ON (P.NHC=H.NHC)
WHERE (H.FECHA_ADMISION=:Fecha);
Responder Con Cita
  #17  
Antiguo 16-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En la primera, tildes y la letra Ñ no lo veo yo muy claro, tendrías que renombrar los campos.

En el segundo intenta esto
Código SQL [-]
SELECT count(*), Fecha
FROM HISTORIA
WHERE (HISTORIA.FECHA_ADMISION =:Fecha)
group by Fecha

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #18  
Antiguo 16-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
No me da 0 pero tampoco me da lo que es, además me coge de más.
Responder Con Cita
  #19  
Antiguo 16-08-2005
Sayuri Sayuri is offline
Miembro
 
Registrado: jul 2005
Posts: 131
Poder: 19
Sayuri Va por buen camino
Además si pongo
Código SQL [-]
SELECT count(*), Fecha
FROM HISTORIA
WHERE (HISTORIA.FECHA_ADMISION =:Fecha)
group by Fecha

me dice que no es válido fecha, así que lo hice directamente con FECHA_ADMISION
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


La franja horaria es GMT +2. Ahora son las 11:56:24.


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