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

#1 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 noviembre 2010 - 07:55

Tengo una tabla de clientes, y quiero ejecutar una consulta desde delphi donde solo me muestre los clientes registrados entre dos fechas específicas las cuales se indicaran con dos TEdit o utilizando otro metodo, y que si en la fechas indicadas no hay clientes registrados, muestre un mensaje 'No hay clientes registrados en las fechas indicadas'

El resultado de la consulta lo debe mostrar en un DBGrid.

En la tabla Clientes de la BD SQL server 2005, tengo los siguientes campos:

Cliente_No, Nombres, Ciudad, Direccion, Telefono, Celular, Cedula, Fecha_Hora

Me intereza solo mostrar el campo (Cliente_No) y el campo (Fecha_Hora) y otro campo que no esta en la tabla al cual llamaria (Total) que almacenaria el total de clientes registrados en esas fechas....
El campo Fecha_Hora  esta declarado como DateTime...

Estoy leyendo los libros La Cara oculta de Delphi 6  y la biblia de delphi 7, y estudiando un Tutorial sobre SQL Server 2005, pero aqui en mi pais nos dan pocas horas de luz electrica y casi no he podido estudiar,  ademas del contenido tan amplio de los mismos..

es para un trabajo de la universidad

Gracias por el foro que me ha sido de grandisima ayuda...
Saludos
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 noviembre 2010 - 07:58

Vamos por partes

¿ Y cual es el problema que tienes amigo  lsedr ?

Salud OS
  • 0

#3 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 noviembre 2010 - 08:03

Es que en el material que estoy leyendo necesitaria mucho tiempo para leer pues tiene tantos temas y estoy buscando en ellos como hacer lo que necesito, pues es que soy nuevo y estoy estudiando los tres tutoriales al mismo tiempo y la cabeza no me da para pensar jejeje en tantas cosas que necesito... Bueno soy nuevo en el SQL server 2005  y en este foro me han ayudado mucho sobre estos temas que he posteado...
  • 0

#4 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 13 noviembre 2010 - 08:04

Hola Isedr, como todo inciado en Delphi este tipo de ejercicios ayudan a que pensemos en el buen diseño de nuestras consultas y la validación de las mismas.

Lo que buscas es lo que comunmente llamamos búsqueda por parámetros

Así, teniendo esta estructura que comentas:

Cliente_No, Nombres, Ciudad, Direccion, Telefono, Celular, Cedula, Fecha_Hora


Sería elaborar el query que se ajuste a tu necesidad, por ejemplo:



sql
  1. SELECT * FROM MI_TABLA WHERE fecha_hora >= FECHA1 AND fecha_hora >= FECHA2



En donde FECHA1 y FECHA2, son tus parámetros.

Recuerda que en otro hilo ya te explicaron sobre estos, por otra parte, recomendada la búsqueda del foro ;)


Saludos!
  • 0

#5 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 noviembre 2010 - 08:10

La tabla entera ya esta visualizada en un DBGrid, pero necesito que salga el resultado de la consulta en otro formulario que tengo creado para esa consulta el cual tiene el DBgrid que digo.

Que componente uso, y como ejecutar la instruccion sql ?


  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 noviembre 2010 - 09:16

Hola lsed, es lamentable que por tus tierras tengan problemas energéticos y te impidan trabajar a un ritmo mayor, seguro que debe ser muy molesto. En tu caso creo que lo mejor es imprimir, aunque sea de a poco, los libros (si es que son digitales) para que lo puedas llevar y leer aún ante algún corte. Yo tengo impreso La Cara Oculta ;)

Ahora respecto a lo de "urge", eso está demás. Aquí no podemos ir a las prisas y a los ritmos de quien pregunta. La ayuda llegará en cuanto se pueda, no más antes. No nos apresures... en vez de conseguir ayuda, un "urge", "es para ayer" o frases similares provocan el efecto contrario: ahuyentas a los interesados en ayudar.

Ahora, yendo a tu duda... no me claro que es lo que deseas hacer. Si la consulta debe mostrarse en otro form con un DBGrid, entonces basta con asociar ese DBGrid al DataSource y éste al DataSet (el ADOQuery) y luego bastará con abrir la consulta y el habilitar el DataSource para que se muestren sus datos.

Por otro lado, ¿cómo es eso de como ejecutar la instrucción sql? ¡Si tu haz dicho que ya tienes visualizada la consulta es porque la sabes ejecutar!

No comprendo. Por favor lsedr explícate bien.

Saludos,

  • 0

#7 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 noviembre 2010 - 10:04

Hola lsed, es lamentable que por tus tierras tengan problemas energéticos y te impidan trabajar a un ritmo mayor, seguro que debe ser muy molesto. En tu caso creo que lo mejor es imprimir, aunque sea de a poco, los libros (si es que son digitales) para que lo puedas llevar y leer aún ante algún corte. Yo tengo impreso La Cara Oculta ;)

Ahora respecto a lo de "urge", eso está demás. Aquí no podemos ir a las prisas y a los ritmos de quien pregunta. La ayuda llegará en cuanto se pueda, no más antes. No nos apresures... en vez de conseguir ayuda, un "urge", "es para ayer" o frases similares provocan el efecto contrario: ahuyentas a los interesados en ayudar.

Ahora, yendo a tu duda... no me claro que es lo que deseas hacer. Si la consulta debe mostrarse en otro form con un DBGrid, entonces basta con asociar ese DBGrid al DataSource y éste al DataSet (el ADOQuery) y luego bastará con abrir la consulta y el habilitar el DataSource para que se muestren sus datos.

Por otro lado, ¿cómo es eso de como ejecutar la instrucción sql? ¡Si tu haz dicho que ya tienes visualizada la consulta es porque la sabes ejecutar!

No comprendo. Por favor lsedr explícate bien.

Saludos,



Ok, me explico mas

Realmente estoy en la etapa del diseño del sistema que estoy haciendo, pero voy probando parcialmente cada etapa del diseño en el delphi 7.

Lo que digo es que ya tengo visualizada toda la tabla 'Clientes' en un DBGrid.
Esa tabla tiene estos campos:
Cliente_No, Nombres, Ciudad, Direccion, Telefono, Celular, Cedula, Fecha_Hora

Pero deseo permitir que el usuario haga una consulta de solamente los clientes registrados entre dos fechas especificas, y que esa consulta me la muestre en otro DBgrid diferente. Las dos fechas pienso indicarlas con dos TEdit, y despues darle clic al boton y que se ejecute la consulta y la muestre.

Pues entiendo que en el SSMS del SQL se hace rapido, pero lo interezante es ejecutarla desde delphi, pues el usuario no manejara el SQL, pues para eso se hace el software en delphi y se hacen los enlaces.

Eso es lo que me intereza amigos...
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 noviembre 2010 - 10:26

Eso lo consigues con el TADOQuery.

Haz lo mismo como si fuera un TADOTable: lo relacionas con el TADOConnection, luego colocas el DatSource y lo relacionas con el TADOQuery, y al DBGrid lo vinculas con el DataSource.

Ve a la propiedad SQL del TADOQuery y haz clic en los tres puntos. Te debería aparecer una ventana en la que debes escribir la consulta SQL.
Una vez hecho esto, acepta.

Luego para ejecutarla basta con abrir el TADOQuery con el método Open.

Ahora, respecto a como ingresar los datos para el rango de las fechas. Como decía felipe lo más conveniente es hacer uso de los parámetros. Los parámetros son unas variables especiales que se pueden colocar en una instrucción SQL. A esas variables uno les puede pasar unos datos y luego cuando se ejecuta el SQL el componente automáticamente reemplaza los parámetros por los datos.

Para declarar parámetros en un SQL debes anteponer dos puntos y darle un nombre. Por ejemplo:



sql
  1. SELECT tus-campos
  2. FROM tu-tabla
  3. WHERE campo >= :MiParametro



En este caso, el parámetro se llama MiParametro.

Luego, antes de ejecutar la consulta le indicamos el dato o valor a tomar:



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger;
  2. ADOQuery1.Parameters.ParamByName('MiParametro').Value := 123456;



¿Ves? Bastante parecido al caso cuando uno lee y pasa datos a los campos. Observa que la diferencia está en que estamos accediendo a la lista de parámetros (.Paramaters.) y lo localizamos por su nombre.

Como estás utilizando ADO es fundamental y se aconseja indicar el tipo de dato del parámetro. En este ejemplo como se trata de un número entero el tipo es ftinteger. Y luego en la propiedad Value pasamos el dato. Recuerda hacerlo en ese órden: primero indicar el tipo y luego el dato. Si bien se puede hacer a la inversa, se aconseja esta manera.

Y luego ya podemos mandar a ejecutar la consulta:


delphi
  1. ADOQuery1.Open;



NOTA: Si cierras el ADOQuery pierdes los datos, lo mismo si cambias el SQL: fuerzas a que el componente cierre y ejecute el nuevo SQL.

Creo que con esto te hace una idea. Si tienes problemas, ya sabes.

Saludos,
  • 0

#9 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 noviembre 2010 - 11:08

escribi todo esto

SELECT Cliente_No, Fecha_Hora
FROM Clientes
WHERE Fecha_Hora >= :MiParametro;

ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger;
ADOQuery1.Parameters.ParamByName('MiParametro').Value := 123456;


en la propiedad SQL del adoquery  y da error

Pero como le digo cuales son las dos fechas que quiero ?

  • 0

#10 jdepaz

jdepaz

    Advanced Member

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

Escrito 14 noviembre 2010 - 12:09

Hola buen dia o buena noche,

seria mejor que postearas tu codigo para una mejor ayuda.


en la propiedad SQL del adoquery  y da error


ya que esto:



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger;
  2. ADOQuery1.Parameters.ParamByName('MiParametro').Value := 123456;



no va en la propiedad SQL, y esto fue propuesto como ejemplo para datos
enteros, entonces tendrias que cambiar a un tipo de dato "fecha" (date),

Saludos


Saludos
  • 0

#11 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 noviembre 2010 - 12:11

Bueno pues no entiendo
  • 0

#12 jdepaz

jdepaz

    Advanced Member

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

Escrito 14 noviembre 2010 - 12:19

Buen dia,

mejor copia y pega tu codigo aqui para ver con detalles


Saludos
  • 0

#13 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 noviembre 2010 - 12:24

Eso lo consigues con el TADOQuery.

Haz lo mismo como si fuera un TADOTable: lo relacionas con el TADOConnection, luego colocas el DatSource y lo relacionas con el TADOQuery, y al DBGrid lo vinculas con el DataSource.

Ve a la propiedad SQL del TADOQuery y haz clic en los tres puntos. Te debería aparecer una ventana en la que debes escribir la consulta SQL.
Una vez hecho esto, acepta.

Luego para ejecutarla basta con abrir el TADOQuery con el método Open.

Ahora, respecto a como ingresar los datos para el rango de las fechas. Como decía felipe lo más conveniente es hacer uso de los parámetros. Los parámetros son unas variables especiales que se pueden colocar en una instrucción SQL. A esas variables uno les puede pasar unos datos y luego cuando se ejecuta el SQL el componente automáticamente reemplaza los parámetros por los datos.

Para declarar parámetros en un SQL debes anteponer dos puntos y darle un nombre. Por ejemplo:



sql
  1. SELECT tus-campos
  2. FROM tu-tabla
  3. WHERE campo >= :MiParametro



En este caso, el parámetro se llama MiParametro.

Luego, antes de ejecutar la consulta le indicamos el dato o valor a tomar:



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger;
  2. ADOQuery1.Parameters.ParamByName('MiParametro').Value := 123456;



¿Ves? Bastante parecido al caso cuando uno lee y pasa datos a los campos. Observa que la diferencia está en que estamos accediendo a la lista de parámetros (.Paramaters.) y lo localizamos por su nombre.

Como estás utilizando ADO es fundamental y se aconseja indicar el tipo de dato del parámetro. En este ejemplo como se trata de un número entero el tipo es ftinteger. Y luego en la propiedad Value pasamos el dato. Recuerda hacerlo en ese órden: primero indicar el tipo y luego el dato. Si bien se puede hacer a la inversa, se aconseja esta manera.

Y luego ya podemos mandar a ejecutar la consulta:


delphi
  1. ADOQuery1.Open;



NOTA: Si cierras el ADOQuery pierdes los datos, lo mismo si cambias el SQL: fuerzas a que el componente cierre y ejecute el nuevo SQL.

Creo que con esto te hace una idea. Si tienes problemas, ya sabes.

Saludos,


Esta parte ya la aprendi y me funciona bien...

Ahora lo que me falta es la otra parte... Cómo hacer la consulta de tal forma que solo me presente en el DBGrid los clientes registrados entre dos fechas específicas, por ejemplo :  1/10/2010  y  1/11/2010 y que pueda el usuario indicarles las fechas para que la consulta se realice ....
  • 0

#14 jdepaz

jdepaz

    Advanced Member

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

Escrito 14 noviembre 2010 - 12:35

Hola,

tu sentencia SQL deberia quedar asi;



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



y bueno tus lineas de codigo para los parametros:




delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftInteger;
  2. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := 123456;
  3. ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftInteger;
  4. ADOQuery1.Parameters.ParamByName('MiParametro2').Value := 123456;



todo este codigo, para mi opinion, lo podria en el evento OnClick del boton "buscar" (pienso que asi le pondria al boton de busqueda por ese rango de fechas).

ahora bien, creo que el ADOQuery1 tiene una propiedad llamada Active,
la cual al antes  de corregir la propiedad SQL debes colocarla en "false",
por ejemplo podrias seguir estos pasos dentro del evento OnClick:

1. cambiar la propiedad Active a false
2. reescribir la propiedad SQL
3. agregar los paramatros
4. volver a colocar la propiedad Active a true


PD: no tengo Delphi a la mano,

  • 0

#15 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 14 noviembre 2010 - 05:35

Una recomendacion. Usa el control TDatetimepicker en lugar de TEdit. Son lo mas idoneos para esos. Y al codigo de jdepaz solo debes cambiarle el tipo de parametro a Date para que funcione.

  • 0

#16 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 noviembre 2010 - 12:07

No muestra nada el DBGrid solo los campos vacios....y le indique las dos fechas correctas desde el Datetimepicker


en Onclick del boton puse:


delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftInteger;
  2. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := 123456;
  3. ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftInteger;
  4. ADOQuery1.Parameters.ParamByName('MiParametro2').Value := 123456;
  5. ADOquery1.Open;



Y en SQL del ADOQuery1 puse:



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



EDITO: Por favor  lsedr emplea las etiquetas

  • 0

#17 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 14 noviembre 2010 - 01:38

Hola lsed,
Lo que yo hice fue mostrarte un ejemplo. Se supone que tu debes elaborar la consulta adecuada y pasar la cantidad y los tipos adecuados de parámetros.

En mi ejemplo como se trataban de parámetros para un tipo de dato numérico en la propiedad DataType del parámetro se establece el valor ftinteger. En tu caso como se trata de fecha/hora debes emplear ftDateTime. Y luego en la propiedad Value le pasas los datos desde el TDatetimepicker o algún otro componente:



delphi
  1. ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftDateTime;
  2. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := DateTimePicker1.DateTime;



Se supone que cuando uno te da un ejemplo, tu debes estudiarlo, no simplemente copiar. Al menos tomate la molestia de leer acerca del uso de Parámetros: métodos, propiedades, uso... en este caso en particular sobre su propiedad DataType.

Ahora también debes leer un poco sobre como se utiliza el TDateTimePicker.

Saludos,
 
  • 0

#18 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 noviembre 2010 - 03:15

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

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

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;


  • 0

#19 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 14 noviembre 2010 - 04:02

El DateTimePicker es un componente, generalmente las guías de programación no se enfocan en dar mayor detalle, por lo que deberás usar otros métodos de investigación, ejemplo claro Mr. Google

Pregunto, ¿como tienes estructurado el Query?, segundo ¿puedes mostrarnos algo más de tu código?


Saludos!
  • 0

#20 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 noviembre 2010 - 04:16

esto tengo en el SQL del query



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


  • 1




IP.Board spam blocked by CleanTalk.