Ir al contenido


Foto

[RESUELTO] Consulta con parametros


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

#1 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 01 enero 2011 - 09:18

Saludos C

Estoy ejecutando esta consulta con parametros en un Query:



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



Y este código en el boton de ejecutarla:



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



Cómo hago para que al ejecutar la consulta me muestre la cantidad de clientes registrados en la tabla 'Clientes' usando un Label de acuerdo a las dos fechas que se le indican mediante Datetimepicker1 y Datetimepicker2  ??

Archivos adjuntos


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 01 enero 2011 - 12:28

Hola lsedr,
Una posibilidad (que es lo más conveniente) es que el mismo motor te lo diga cuando ejecutes la consulta. Bastaría con añadir COUNT(Cliente_No) a una consulta previa para regrese la cantidad de registros:



sql
  1. SELECT COUNT(Client_No)
  2. FROM ...




O puedes también comprobar la propiedad RecordCount, aunque no todos los datasets regresan el valor correcto o tienen implementado el método de lectura de dicha propiedad (por defecto, regresa -1) a menos que el dataset sobreescriba e implemente el método.

La otra vía, por código, es más segura que RecordCount: contar los registros devueltos. Es decir: recorrer el dataset registro a registro y contarlos.

Saludos,
  • 0

#3 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 01 enero 2011 - 01:42

Depende de como quieres desplegar el dato en tu aplicación, si solo quieres mostrar un entero como dato final, pues como bien menciona Delphius:



sql
  1. SELECT COUNT(Client_No)
  2. FROM ...



Así solo el motor te devuelve un dato (entero), le ahorras el envio de datos tal vez hasta innecesarios y la respuesta será más rápida.

Pero si quieres desplegar ciertos datos de los clientes y al final mostrar el numero de clientes totales en pantalla, solo asegurate que la propiedad del dataset Fetchall sea true o usa Last, lo que obliga a traer todos los registros posicionandote en el último de ellos y por lo tanto RecordCount tendría q funcionar correctamente.

Saludos.
  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 enero 2011 - 04:14

Buenas,

A parte de lo que te han comentado los compañeros, decirte que la mayoría de motores SQL (por no decir todos) tienen la sentencia between para condiciones que requieren un inicio y fin como la tuya. Así, esa consulta SQL podría quedar de la siguiente manera:



sql
  1. SELECT Cliente_No, Fecha_Hora, Nombres
  2. FROM Clientes
  3. WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2;



Nos leemos

  • 0

#5 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 03 enero 2011 - 12:40

Depende de como quieres desplegar el dato en tu aplicación, si solo quieres mostrar un entero como dato final, pues como bien menciona Delphius:




sql
  1. SELECT COUNT(Client_No)
  2. FROM ...



Así solo el motor te devuelve un dato (entero), le ahorras el envio de datos tal vez hasta innecesarios y la respuesta será más rápida.

Pero si quieres desplegar ciertos datos de los clientes y al final mostrar el numero de clientes totales en pantalla, solo asegurate que la propiedad del dataset Fetchall sea true o usa Last, lo que obliga a traer todos los registros posicionandote en el último de ellos y por lo tanto RecordCount tendría q funcionar correctamente.

Saludos.


Bueno lo que quiero es que muestre el resultado del COUNT en un Label, de los registros (clientes) registrados entre las fechas indicadas, pues Ya aprendí como se hace para que muestra la cantidad de los registros de una tabla pero cuando no se usan datetimepicker.

Ejemplo:

Que tal si le digo que me muestre los clientes registrados entre 1-1-2011 y 10-1-2011  ? la consulta debe arrojar el resultado en un Label, pero tomando en cuenta el uso de los datetimepicker
  • 0

#6 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 03 enero 2011 - 08:01

Que tal si le digo que me muestre los clientes registrados entre 1-1-2011 y 10-1-2011  ? la consulta debe arrojar el resultado en un Label, pero tomando en cuenta el uso de los datetimepicker


No comprendo la duda, igual si generas la consulta en un rango 'X' de fechas vas a obtener la cantidad de registros.
Te recomiendo que primero hagas las pruebas.


Saludos!
  • 0

#7 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 03 enero 2011 - 11:53

eso es lo que quiero felipe, que muestre el resultado de la consulta en un Label con un valor entero, pues quiero que cuente los clientes registrados entre el rango de fechas, pero no se como hacerlo. solo se hacerlo que me muestre la cantidad de registros totales.. pero solo quiero que muestre los ubicados entre las fechas que el usuario elija, asi el usuario observa cuantos clientes se registran, por ejemplo, en los ultimos 7 dias laborables.
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 03 enero 2011 - 12:09

Buenas,

Pues como te han/hemos comentado anteriormente ;)



sql
  1. SELECT COUNT(*)
  2. FROM Clientes
  3. WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2;



Nos leemos

  • 0

#9 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 03 enero 2011 - 05:48

Creo que lo único que te falta es tomar el valor del campo y pasarlo a la etiqueta quedando algo parecido a esto en el evento click del botón:

delphi
  1. ADOQuery1.Close;
  2. ADOQuery1.SQL.Text := 'SELECT COUNT(Cliente_No) AS Cantidad, Cliente_No, Fecha_Hora, Nombres FROM Clientes '+
  3.     'WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2';
  4. ADOQuery1.Parameters.ParamByName('MiParametro1').Value := DateTimePicker1.Date;
  5. ADOQuery1.Parameters.ParamByName('MiParametro2').Value := DateTimePicker2.Date;
  6. ADOQuery1.Open;
  7.  
  8. // Aqui asignamos el valor del campo count a la etiqueta
  9. Etiqueta.Caption := IntToStr(ADOQuery1.FieldByName('Cantidad').AsInteger);


Espero te sirva...

  • 0

#10 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 06 enero 2011 - 09:22

Me da este error

Archivos adjuntos


  • 0

#11 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 06 enero 2011 - 09:42

Prueba con esto:



sql
  1. SELECT COUNT(Cliente_No) AS Cantidad, Cliente_No, Fecha_Hora, Nombres FROM Clientes '+
  2.     'WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2 GROUP BY Cliente_No



Saludos!
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 enero 2011 - 09:43

Es problema es que esa consulta no es válida.

Ya hemos indicado que previamente debes hacer una consulta:



sql
  1. SELECT COUNT(...)
  2. FROM TABLA
  3. WHERE ...



Y luego, por otro lado, hacer la consulta que te devuelva esos registros:



sql
  1. SELECT ...
  2. FROM TABLA
  3. WHERE ....



Saludos,
  • 0

#13 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 06 enero 2011 - 09:44

El error Isedr especifica, que cuando haces uso de funciones de agrupación en este caso count, necesitar usar el agupador group by, para el resto de los campos devueltos en el select.



delphi
  1. 'SELECT COUNT(Cliente_No) AS Cantidad, Cliente_No, Fecha_Hora, Nombres FROM Clientes '+
  2. 'WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2' +
  3. 'GROUP BY Cliente_No, Fecha_Hora, Nombres'


Creo muy posible no te devuelava lo q te esperas. Chécalo.

No testee la consulta, así q puede tener detalles.

Saludos
  • 0

#14 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 06 enero 2011 - 09:45

Hola,
si Delphius tiene razón, otra opción es usar la propiedad RecordCount del ADOQuery


Saludos!
  • 0

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 enero 2011 - 09:53

El error Isedr especifica, que cuando haces uso de funciones de agrupación en este caso count, necesitar usar el agupador group by, para el resto de los campos devueltos en el select.



delphi
  1. 'SELECT COUNT(Cliente_No) AS Cantidad, Cliente_No, Fecha_Hora, Nombres FROM Clientes '+
  2. 'WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2' +
  3. 'GROUP BY Cliente_No, Fecha_Hora, Nombres'


Creo muy posible no te devuelava lo q te esperas. Chécalo.

No testee la consulta, así q puede tener detalles.

Saludos

Me temo fredycc que si bien esa consulta es legal, no arroya el resultado esperado: tener la cantidad total del rango.
Lo que hará es contar los grupos, exactamente la cantidad que se obtiene con un COUNT() solo. Es decir, si COUNT() regresa mil, al agrupar tendrás mil grupos y en cada grupo, el campo Cantidad será 1.

Hola,
si Delphius tiene razón, otra opción es usar la propiedad RecordCount del ADOQuery

Saludos!

Exacto, y lo dije en otra ocasión: O se hace la consulta previa o se hace uso de RecordCount (quizá se deba "forzar" al dataset a llevar la cuenta como preventiva... recuerden que no todos los dataset implementan RecordCount... la verdad es no recuerdo si ADOQuery lo implementa o simplemente regresa -1)

O de última, se lleva la cuenta manualmente recorriendo el conjunto de datos regresado por el ADOQuery.

Saludos,
  • 0

#16 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 06 enero 2011 - 10:11

Ufff !!


Intente hacer uso de otro ADOquery y le puse esto:



delphi
  1. SELECT COUNT(Cliente_No) AS Cantidad FROM Clientes
  2. WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2;




Y en el boton para ejecutarlo agregue esto:


delphi
  1. ADOquery4.Close;
  2. Label4.Caption := InttoStr(ADOQuery4.FieldByName('Cantidad').AsInteger);
  3. ADOquery4.Open;



  • 0

#17 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 06 enero 2011 - 10:22

¿Y ya te funciona?


Saludos!
  • 0

#18 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 06 enero 2011 - 10:30

Me da error dice Cantidad no found
  • 0

#19 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 06 enero 2011 - 10:34

Me da error dice Cantidad no found


Tienes esto:



delphi
  1. ADOquery4.Close;
  2. Label4.Caption := InttoStr(ADOQuery4.FieldByName('Cantidad').AsInteger);
  3. ADOquery4.Open;



Cambialo por esto:



delphi
  1. ADOquery4.Close;
  2. ADOquery4.Open;
  3. Label4.Caption := InttoStr(ADOQuery4.FieldByName('Cantidad').AsInteger);



No te va a mostrar nada si aún no lo consultas  *-)


Saludos!
  • 0

#20 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 06 enero 2011 - 11:01


El error Isedr especifica, que cuando haces uso de funciones de agrupación en este caso count, necesitar usar el agupador group by, para el resto de los campos devueltos en el select.



delphi
  1. 'SELECT COUNT(Cliente_No) AS Cantidad, Cliente_No, Fecha_Hora, Nombres FROM Clientes '+
  2. 'WHERE Fecha_Hora BETWEEN :MiParametro1 AND :MiParametro2' +
  3. 'GROUP BY Cliente_No, Fecha_Hora, Nombres'


Creo muy posible no te devuelava lo q te esperas. Chécalo.

No testee la consulta, así q puede tener detalles.

Saludos

Me temo fredycc que si bien esa consulta es legal, no arroya el resultado esperado: tener la cantidad total del rango.
Lo que hará es contar los grupos, exactamente la cantidad que se obtiene con un COUNT() solo. Es decir, si COUNT() regresa mil, al agrupar tendrás mil grupos y en cada grupo, el campo Cantidad será 1.

Hola,
si Delphius tiene razón, otra opción es usar la propiedad RecordCount del ADOQuery

Saludos!

Exacto, y lo dije en otra ocasión: O se hace la consulta previa o se hace uso de RecordCount (quizá se deba "forzar" al dataset a llevar la cuenta como preventiva... recuerden que no todos los dataset implementan RecordCount... la verdad es no recuerdo si ADOQuery lo implementa o simplemente regresa -1)

O de última, se lleva la cuenta manualmente recorriendo el conjunto de datos regresado por el ADOQuery.

Saludos,


Perfactamente dicho Delphius, tienes toda la razón, y es q el problema no eran las distintas soluciones q se han planteado pues han sido claras, lo único que quería mostrar es que una consulta así, funcionaba con ciertos ajustes pero tiene sus detalles a considerar y a veces no es lo que se requiere, gracias por detallar a más profundidad las consecuencias del mismo Delphius.

Saludos
  • 0




IP.Board spam blocked by CleanTalk.