
[RESUELTO] Cómo ejecutar una consulta desde Delphi 7 con SQL server 2005
#1
Escrito 13 noviembre 2010 - 07:55
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
#2
Escrito 13 noviembre 2010 - 07:58
¿ Y cual es el problema que tienes amigo lsedr ?
Salud OS
#3
Escrito 13 noviembre 2010 - 08:03
#4
Escrito 13 noviembre 2010 - 08:04
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:
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!
#5
Escrito 13 noviembre 2010 - 08:10
Que componente uso, y como ejecutar la instruccion sql ?
#6
Escrito 13 noviembre 2010 - 09:16

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,
#7
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...
#8
Escrito 13 noviembre 2010 - 10:26
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:
SELECT tus-campos FROM tu-tabla 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:
ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger; 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:
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,
#9
Escrito 13 noviembre 2010 - 11:08
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 ?
#10
Escrito 14 noviembre 2010 - 12:09
seria mejor que postearas tu codigo para una mejor ayuda.
en la propiedad SQL del adoquery y da error
ya que esto:
ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger; 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
#11
Escrito 14 noviembre 2010 - 12:11
#12
Escrito 14 noviembre 2010 - 12:19
mejor copia y pega tu codigo aqui para ver con detalles
Saludos
#13
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
SELECT tus-campos FROM tu-tabla 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
ADOQuery1.Parameters.ParamByName('MiParametro').DataType := ftInteger; 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
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 ....
#14
Escrito 14 noviembre 2010 - 12:35
tu sentencia SQL deberia quedar asi;
SELECT Cliente_No, Fecha_Hora FROM Clientes WHERE Fecha_Hora >= :MiParametro1 AND Fecha_Hora<=:MiParametro2;
y bueno tus lineas de codigo para los parametros:
ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftInteger; ADOQuery1.Parameters.ParamByName('MiParametro1').Value := 123456; ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftInteger; 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,
#15
Escrito 14 noviembre 2010 - 05:35
#16
Escrito 14 noviembre 2010 - 12:07
en Onclick del boton puse:
ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftInteger; ADOQuery1.Parameters.ParamByName('MiParametro1').Value := 123456; ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftInteger; ADOQuery1.Parameters.ParamByName('MiParametro2').Value := 123456; ADOquery1.Open;
Y en SQL del ADOQuery1 puse:
SELECT Cliente_No, Fecha_Hora FROM Clientes WHERE Fecha_Hora >= :MiParametro1 AND Fecha_Hora<=:MiParametro2;
EDITO: Por favor lsedr emplea las etiquetas
#17
Escrito 14 noviembre 2010 - 01:38
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:
ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftDateTime; 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,
#18
Escrito 14 noviembre 2010 - 03:15
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:
ADOQuery1.Parameters.ParamByName('MiParametro1').DataType := ftDateTime; ADOQuery1.Parameters.ParamByName('MiParametro1').Value := DateTimePicker1.DateTime; ADOQuery1.Parameters.ParamByName('MiParametro2').DataType := ftDateTime; ADOQuery1.Parameters.ParamByName('MiParametro2').Value := DateTimePicker2.DateTime; ADOquery1.Open;
#19
Escrito 14 noviembre 2010 - 04:02
Pregunto, ¿como tienes estructurado el Query?, segundo ¿puedes mostrarnos algo más de tu código?
Saludos!
#20
Escrito 14 noviembre 2010 - 04:16
SELECT Cliente_No, Fecha_Hora FROM Clientes WHERE Fecha_Hora >= :MiParametro1 AND Fecha_Hora<=:MiParametro2;