Ir al contenido


Foto

[RESUELTO] Cómo ejecutar una consulta desde Delphi 7 con SQL server 2005


  • Por favor identifícate para responder
39 respuestas en este tema

#21 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 14 noviembre 2010 - 07:08

ya revisaste que tienes datos en el rango de fechas que estas especificando?


  • 0

#22 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 14 noviembre 2010 - 08:04

Estoy buscando en el libro La Biblia del delphi 7, pero no habla del Datetimepicker...

Existe una tecla en el teclado que te puede ayudar, y muchísimo: F1. Selecciona el componente y presiona F1. Eso bastará para que se abra la ayuda con la información acerca del componente:

Description

TDateTimePicker is a visual component designed specifically for entering dates or times. In dmComboBox date mode, it resembles a list box or combo box, except that the drop-down list is replaced with a calendar illustration; users can select a date from the calendar. Dates or times can also be selected by scrolling with Up and Down arrows and by typing.

Date-time picker ignores the BiDiMode setting for right-to-left reading, displaying dates according to the system locale.

TDateTimePicker formats date and time values according to the date and time settings in the Regional Settings of the Control panel on the user’s system. Because TDateTimePicker is a wrapper for a Windows control, these formats can’t be changed by changing the formatting variables in the SysUtils unit. However, you can use the Windows API call DateTime_SetFormat to programmatically specify these settings.


Aunque si lo menciona en el libro La Cara oculta delphi 6, pero no exactamente se refiere a lo que necesito...

No hay documentación que se ajuste 100% a lo que uno necesita.  ;) Es obligación y responsabilidad de uno el unir las ideas y entender como usarlas.
No esperes siempre que en un documento tendrá la respuesta a "realizar una consulta sobre la tabla clientes en base a un criterio o rango de fechas utilizando ADO, parámetros y TDateTimePicker".

Vamos  lsedr que es cosa de sentarse a leer un poco en la ayuda y te das una idea de como usarlo:

Indicates the date that is marked on the calendar.

property DateTime: TDateTime;

Description

Use DateTime to get or set the date (and, if relevant, time) that is marked on the calendar control. The value of DateTime must lie within the range specified by MaxDate and MinDate.

If MultiSelect is True, the selected range of dates goes from DateTime to EndDate.

Note:    You can also set the marked date with the Date property.


Bueno, aun sigo buscando el problema pues no me presenta nada aun el DBGrid.

esto tengo en el boton:



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftDateTime;
  2. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := DateTimePicker1.DateTime;
  3. ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftDateTime;
  4. ADOQuery1.Parameters.ParamByName('MiParametro2').Value := DateTimePicker2.DateTime;
  5. ADOquery1.Open;



El que no te muestre datos en el DBGrid se puede deber a dos cosas:
1. No tienes fechas en el rango. Ten presente que como tus campos son de fecha/hora debes considerar que por ejemplo 14-11-2010 23:02 > 14-11-2010 01:30. Se considera no sólo la fecha sino además la hora.

2. A la consulta SQL le sobre ese punto y coma al final y debe haber un espacio entre el <= y los dos puntos que indican el parámetro MiParameter2.

Saludos,
  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 14 noviembre 2010 - 08:27

¡Pero que bestia que soy!

¡Esta vez debo corregirme y pedir disculpas  :( ... No se debe usar DateTimePicker.DateTime! Debe emplearse o .Date o .Time e ignorar la parte Time o Date según como esté configurado con la propiedad Kind.

Cuando se invoca a .DateTime toma tanto la fecha como la hora, pero si en Kind está el valor dtkDate la parte Time del TDateTime será la hora que figure en la propiedad Time... por defecto el valor de ésta es la hora en la que el componente se ha colocado en el form... De modo que si por ejemplo se colocó el componente a las 23:10:19 al seleccionar la fecha y empleando .DateTime regresará: xx/yy/zzzz 23:10:19

Una posible solución es la poner hora 00:00 pero lo correcto sería obviar esta parte.

Algo similar sucede si se configura el componente a dtkTime... en Date queda la hora de creación del componente.

Saludos,
  • 0

#24 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 noviembre 2010 - 10:53

En la propiedad Kind estan los dos como dtkDate

Ejecute de esta manera y aun no funciona



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftDate;
  2. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := DateTimePicker1.Date;
  3. ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftDate;
  4. ADOQuery1.Parameters.ParamByName('MiParametro2').Value := DateTimePicker2.Date;
  5. ADOquery1.Open;




  • 0

#25 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 14 noviembre 2010 - 11:38

Hay algo que no cuadra...
el DateTimePicker envía el valor con el formato dd/mm/aaaa, ¿pero cómo se guardan en la base de datos?, ¿es el mismo formato?  ^o|



Saludos!
  • 0

#26 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 12:34

Hay algo que no cuadra...
el DateTimePicker envía el valor con el formato dd/mm/aaaa, ¿pero cómo se guardan en la base de datos?, ¿es el mismo formato?  ^o|



Saludos!


En la tabla el campo Fecha_Hora esta declarado como DateTime.

Y lo guardo de esta manera:



delphi
  1. Datamodule3.ADOTable1.fieldByname('Fecha_Hora').Asdatetime:=Now;


  • 0

#27 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 noviembre 2010 - 06:33

Hola lsedr ejecuta una consulta SQL de esta forma:



sql
  1. SELECT *
  2. FROM TuTabla



Y muéstranos como se ven los datos. Eso podría ayudar a ver donde puede estar el problema.

Saludos,

  • 0

#28 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 08:35

Con otra consulta me funciona bien amigo delphius

saludos

aqui esta la imagen....

Archivos adjuntos


  • 0

#29 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 noviembre 2010 - 10:49

Pues no debería haber problemas, si tienes registros la consulta con los datos de los rangos debería funcionar. Prueba, en MS SQL Sever, si la consulta



sql
  1. SELECT *
  2. FROM tuTabla
  3. WHERE (campoFechaHora <= FechaHora1) AND (CampoFechaHora >= FechaHora2)



Funciona. O también puedes hacer uso de BETWEEN:



sql
  1. SLECT *
  2. FROM tuTabla
  3. WHERE CampoFecha BETWEEN FechaHora1 AND FechaHora2



Siendo FechaHora1 y FechaHora2 alguna fecha y hora válida en el rango...

Si te arroja resultados es porque la consulta está perfectamente... aunque es muy dificil que tuvieras poblemas.

Luego en Delphi haz una prueba como:



delphi
  1. var FechaHora: TDateTime;
  2. begin
  3. FechaHora := ADOTable1.FieldByName('fecha_hora').AsDateTime;
  4. ShowMessage(DateTimeToStr(FechaHora));
  5. end;



Para ver en que formato está leyendo y trabajando Delphi y comentanos como se vé el ShowMessage.

Una segunda prueba, antes de lanzar la consulta con el rango, muestra la fecha elegida de forma similar al el ejemplo:



delphi
  1. ShowMessage(DateTimeToStr(DateTimePicker1.Date));



Y luego prueba también con un .DateTime en vez de Date.

Y ahora la preguntonta pero necesaria: ¿Te aseguras de estar ingresando valores de un rango válido?

Prueba lanzar la consulta original, la del rango de fechas. Y fíjate que resultado te da el método IsEmpty... algo como:



delphi
  1. ADOQuery1.Open;
  2. if ADOQuery1.IsEmpty
  3.   then ShowMessage('Consulta vacía')
  4.   else ShowMessage('La consulta tiene datos');



Te digo que es muy raro que no te muestre nada en el DBGrid... ¿Te aseguraste de que esté activo (Enabled = True) el DataSource y/o que esté relacionado al TADOQuery? ¿En el mismo TADOQuery de la consulta de rangos si ejecutas la consulta SELECT * from Tabla te da los datos? ¿O es que a esa consulta de prueba la ejecutaste desde otro TADOQuery?

Hay muchas cosas por ver y tu no nos facilitas las cosas. Hay algo que no me cierra. Deberías ser bien descriptivo, aportar más  información y no ser tan "secote" y que te tengamos que sacar las cosas a  tirabuzón.

Saludos,
  • 0

#30 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 01:23

Ejecute eso




delphi
  1. var Fecha_Hora: TDateTime;
  2. begin
  3. Fecha_Hora := DataModule3.ADOTable1.FieldByName('Fecha_Hora').AsDateTime;
  4. ShowMessage(DateTimeToStr(Fecha_Hora));



y me mostro la fecha y hora del primer cliente registrado:


Archivos adjuntos


  • 0

#31 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 01:26

y este es el ultimo registrado

Los datetimepicker funcionan bien, pues con un showmessage ya vi la fecha correcta cuando la selecciono.

Archivos adjuntos


  • 0

#32 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 01:39

Pues no debería haber problemas, si tienes registros la consulta con los datos de los rangos debería funcionar. Prueba, en MS SQL Sever, si la consulta



sql
  1. SELECT *
  2. FROM tuTabla
  3. WHERE (campoFechaHora <= FechaHora1) AND (CampoFechaHora >= FechaHora2)



Funciona. O también puedes hacer uso de BETWEEN:



sql
  1. SLECT *
  2. FROM tuTabla
  3. WHERE CampoFecha BETWEEN FechaHora1 AND FechaHora2



Siendo FechaHora1 y FechaHora2 alguna fecha y hora válida en el rango...

Si te arroja resultados es porque la consulta está perfectamente... aunque es muy dificil que tuvieras poblemas.

Luego en Delphi haz una prueba como:



delphi
  1. var FechaHora: TDateTime;
  2. begin
  3. FechaHora := ADOTable1.FieldByName('fecha_hora').AsDateTime;
  4. ShowMessage(DateTimeToStr(FechaHora));
  5. end;



Para ver en que formato está leyendo y trabajando Delphi y comentanos como se vé el ShowMessage.

Una segunda prueba, antes de lanzar la consulta con el rango, muestra la fecha elegida de forma similar al el ejemplo:



delphi
  1. ShowMessage(DateTimeToStr(DateTimePicker1.Date));



Y luego prueba también con un .DateTime en vez de Date.

Y ahora la preguntonta pero necesaria: ¿Te aseguras de estar ingresando valores de un rango válido?

Prueba lanzar la consulta original, la del rango de fechas. Y fíjate que resultado te da el método IsEmpty... algo como:



delphi
  1. ADOQuery1.Open;
  2. if ADOQuery1.IsEmpty
  3.   then ShowMessage('Consulta vacía')
  4.   else ShowMessage('La consulta tiene datos');



Te digo que es muy raro que no te muestre nada en el DBGrid... ¿Te aseguraste de que esté activo (Enabled = True) el DataSource y/o que esté relacionado al TADOQuery? ¿En el mismo TADOQuery de la consulta de rangos si ejecutas la consulta SELECT * from Tabla te da los datos? ¿O es que a esa consulta de prueba la ejecutaste desde otro TADOQuery?

Hay muchas cosas por ver y tu no nos facilitas las cosas. Hay algo que no me cierra. Deberías ser bien descriptivo, aportar más  información y no ser tan "secote" y que te tengamos que sacar las cosas a  tirabuzón.

Saludos,



Con respecto al DBgrid:
- En Enable=true
- En DataSource = DataSource 2

Con respecto al DataSource 2 :

- En DataSet =ADOQuery 1

Con respecto al ADOQuery 1 :
- En Connection = DataModule3.ADOConnection 1 (es el que se conecta a la BD)





  • 0

#33 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 noviembre 2010 - 03:18

¿Y que hay sobre las consultas con rango de fechas? A simple vista, por lo que comentas debería funcionar todo perfectamente.

Saludos,
  • 0

#34 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 03:47

Pues no se que pasa

hice esto


delphi
  1. ADOQuery1.Open;
  2. if ADOQuery1.IsEmpty
  3.   then ShowMessage('Consulta vacía')
  4.   else ShowMessage('La consulta tiene datos');



Mostro consulta vacia
  • 0

#35 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 noviembre 2010 - 04:29

Eso si que es raro... no logro ver al gato encerrado  ^o|

¿Y probando la misma consulta de rangos de fecha en MS SQL Server te sale algo?

Disculpa que suelte de nuevo la pregunta tonta: ¿Seguro que estás pasando fechas válidas que cumplan el rango? Lo máximo que se me ocurre es que estés pasando los datos al parámetro de forma invertida haciendo que la condición WHERE no se cumpla.

Recuerda que al hacer uso de .Date en el DateTimePicker se está regresando un valor TDateTime cuya parte Time será igual a la hora de creación del componente. Eso puede hacer diferencia.

Saludos,
  • 0

#36 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 15 noviembre 2010 - 04:46

Recuerda que al hacer uso de .Date en el DateTimePicker se está  regresando un valor TDateTime cuya parte Time será igual a la hora de  creación del componente. Eso puede hacer diferencia.


Yo creo que por alli va el asunto, dentro del browser de MSSQL al ejecutar la consulta le da resultados, pero creo que cuando se consulta desde la aplicacion,???

Prueba con alguna funcion de MSSQL que te devuelva solo la fecha del campo, por ejemplo:

Select * from tabla where funcion_extraesolofecha(campo)>=Miparametro1 and
funcion_extraesolofecha(campo)<=Miparametro2.

Saludos
  • 0

#37 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 15 noviembre 2010 - 05:02

uff ahora si estoy confundido,  OH MY GOD !!
  • 0

#38 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 noviembre 2010 - 06:05

lsedrtu impaciencia te está nublando... ese es tu problema.

Prueba en SQL Server si la consulta con el rango de fecha te funciona. Si anda entonces el problema está en el programa. En este caso habría que ver con mayor profundidad donde se está metiendo mal la pata... y pueden ser muchas cosas... cosas que tu no nos comentas, aunque lo más probable es que sea algo que ya he comentado:

Cuando se hace:


delphi
  1. ADOQuery1.Parameters.ParamByName('Parametro').Value := DateTimePicker1.Date;



La propiedad Date del DateTimePicker regresa un valor TDateTime con la fecha y la hora. Cuando la propiedad Kind tiene el valor dtkDate La fecha será la elegida en el DateTimePicker pero la hora será tomada según lo que figure en la propiedad Time. Esta propiedad por defecto toma el valor de la hora en el momento en que se ha colocado o creado el componente en el form y puede modificarse en tiempo de diseño si se desea.

De modo que por ejemplo si colocaste a las 20:31:17 del día 15/11/2010 el DateTimePicker en el form. En su propiedad Time tendrás ese valor... por tanto cada vez que selecciones una fecha dd/mm/yyyy cualquiera el DateTimePicker devolverá un valor dd/mm/yyyy 20:31:17.
Algo similar sucede si se configura a dtkTime, en Date se tendrá la fecha de creación por lo que al leerse se tendrá algo como: 15/11/2010 hh:mm:ss.

Eso hace que al pasar el valor al parámetro no se tenga una hora limpia (00:00:00) con lo que hace que las comparaciones no sean tan exactas ya que se tiene en cuenta tanto la fecha como la hora.

Si deseas que sólo se tenga en cuenta la fecha para comparar, como dice jdepaz lo mejor es tomar sólo la parte Fecha. Algunos motores de datos cuentan con funciones para eso, por lo general se llaman EXTRACT, CONVERT, CAST.

Luego, en Delphi, antes de pasarse la fecha seleccionada en el DateTimePicker se debe ignorar la parte Time del TDateTime ... Y esto ya se ha comentado antes.

Saludos,
  • 0

#39 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 17 noviembre 2010 - 09:44

Saludos amigos

Ya me funciona, pues estaba haciendo una burrada, pues era el orden de los componentes DateTimePicker.

Lo sinverti de lugar y funciono, era cuestion de logica el problema pero no me habia dado cuenta de la posicion de ellos en el form, pues la fecha se la indicaba alreves.

pero ahora tengo una duda sobre esta consulta...

Por que solo puedo indicar una sola vez la consulta y cuando elijo otras fechas ya no me funciona, osea, solo funciona la primera vez.

En la propiedad SQL del DBQuery tengo esto:


delphi
  1. SELECT Cliente_No, Fecha_Hora
  2. FROM Clientes
  3. WHERE Fecha_Hora >= :MiParametro1
  4. AND Fecha_Hora<=:MiParametro2;



Y en el boton con el cual ejecuto la consulta:



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftDate;
  2. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := DateTimePicker1.Date;
  3. ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftDate;
  4. ADOQuery1.Parameters.ParamByName('MiParametro2').Value := DateTimePicker2.Date;
  5. ADOquery1.Open;



Que hago para que al yo elegir otras fechas y darle click al boton para ejecutar la consulta deseada, me funcione ????

  • 0

#40 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 17 noviembre 2010 - 10:06

Hola Isedr,

Ya decía yo:

Lo máximo que se me ocurre es que estés pasando los datos al parámetro  de forma invertida haciendo que la condición WHERE no se cumpla.


Menos mal que lo digo... que sino...  ^o|

Déjame ver si entiendo lo que pides ahora... ¿Deseas poder ejecutar la consulta muchas veces? Para ello primero debes cerrar (Close) y Abrir (Open) el TADOQuery. Obviamente, antes de hacer Open se deben pasar los datos al parámetro.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.