Ir al contenido


Foto

Agrupar valores en una rejilla


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

#1 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 febrero 2009 - 04:03

Estoy haciendo un programa que recoge datos de unas balanzas (tickets, cantidades, etc) y los mete en tablas de MySql. Esa parte ya esta terminada, y funciona bastante bien  :D , ahora mismo lo estoy probando en un supermercado con varias balanzas comunicadas por red y según se va pesando la mercancí­a y los datos se van integrando en las tablas.

Ahora me han pedido que a partir de los datos que tengo en las tablas genere una serie de informes: lo que se vendió de cada producto, cuantos tickets de hicieron, que hora del dí­a se vende mas, etc ... Habí­a pensado hacerlo con informes de Crystal enlazados directamente contra la base de datos, pero la cosa no me esta resultando sencilla ya que es necesario poder modificar los parámetros de los informes para, por ejemplo, averiguar a que hora del dí­a se vende mas jamón  :D

Como la cosa con Crystal no iva muy bien, decidí­ enfocar el problema de otra manera y hacer un pequeño programa que me muestra en una rejilla una serie de consultas (guardadas en archivos de texto) y que me deja cambiarle los filtros de selección.

Por ejemplo, una consulta tí­pica seria algo como esto:


sql
  1. SELECT * FROM lintickets WHERE %FILTRO%


El programa se encarga de reemplazar %FILTRO% por un filtro que el usuario puede personalizar a su gusto.

Pero ahora quiero darle un vuelta de tuerca y necesito poder agrupar los valores de la rejilla. Por ejemplo, la consulta anterior me devuelve todas las ventas, pero si agrupo por fecha me podrí­a dar las ventas por dí­a, y si agrupo por código me podrí­a dar la cantidad total vendida de cada articulo. Y aquí­ es donde tengo el problema ¿como haga esta agrupación?

Una solución sencilla es añadirle "group by" a la consulta, y así­ agrupar por los campos que quiera. Pero eso puede no ser tan sencillo si la consulta es compleja (con varias tablas por ejemplo), ya que la agrupación se tendrí­a que hacer con un par de click por parte del usuario y el programa no conoce previamente la consulta, la tiene que analizar en tiempo de ejecución.

Pensé en otras soluciones, entre ellas cargar el resultado de la consulta en un ClientDataShet y luego, mediante consultas mas sencillas, hacer agrupaciones con los datos contenidos en el ClientDataShet. Pero pensé que tiene que haber alguna solución mas sencilla, no quiero matarme a programar y luego enterarme que existí­a el método "agrupar" en el dbgrid  :D o algo parecido.

En resumen: ¿alguien conoce algún método sencillo de agrupar los valores de una rejilla?

Gracias
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.282 mensajes
  • LocationMéxico

Escrito 26 febrero 2009 - 04:14

Hola amigo, de entrada yo te recomendaria hacer Procedimientos Almacenados donde puedes enviar los parámetros que quieras.

Veamos como podemos solucionar este asunto :D

Salud OS
  • 0

#3 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 26 febrero 2009 - 04:20

el dbgrid como tal no tiene la opcion de agrupar, asi que te tocara hacerlo a pie, de momento la solución de los procedimientos almacenados es la mas facil donde a un procedimiento le dices porque campo quieres agrupar y lo demas lo desarrollas en base a eso.

Aunque si insistes en las consultas desde archivos de texto te recomendaria vistas para las que contengan muchas tablas de esa manera se hacen mas entendibles.
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.282 mensajes
  • LocationMéxico

Escrito 26 febrero 2009 - 04:27

Hola

El dbGrid que viene con Turbo Delphi tiene un evento de nombre OnTitleClick.

property OnTitleClick: TDBGridClickEvent;

Description
Write an OnTitleClick event handler to take specific action when the user clicks in one of the column headers. The Column parameter is the TColumn object that corresponds to the column where the mouse was when the user released the left mouse button.


En ese evento puedes modificar el Group by dependiendo de la columna en que se da clic.

Algo así­:



delphi
  1. procedure TForm2.DBGrid1TitleClick(Column: TColumn);
  2. var
  3.   AgruparPor: string;
  4. begin
  5.   AgruparPor := Column.FieldName;
  6.   //Ejecutas de nuevo el Query.
  7. end;



Salud OS

Edito: No era ordenar, era agrupar :D

  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 26 febrero 2009 - 04:30

el asunto es que el quiere la suma de las ventas por la columna que se clickee, no reordenarlo..
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 febrero 2009 - 04:50

Amigo Seanoe el DBGrid que tiene todo lo que necesitas hacer y mucho mas es el de devExpress http://devexpress.co.../ExQuantumGrid/ falta ver si hay presupuesto para eso, aunque la verdad vale la pena adquirirlos.

Saludos
  • 0

#7 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 26 febrero 2009 - 05:40

Algo asi podrias tener la condicion luego de armar campos y el where



delphi
  1.   s := 'SELECT '+Campos+' FROM TUTABLA '+Where;
  2.   if Pos('SUM',Campos) then
  3.       s := s + 'GROUP BY '+Copy(Campos,1,Pos(',SUM',Campos));


  • 0

#8 Caral

Caral

    Advanced Member

  • Administrador
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 26 febrero 2009 - 07:46

Hola
Ya sabéis que de estas cosas no se, pero cuando yo quiero consultas que contengan múltiples cambios uso el CheckBox.
Lo que hago es hacer la consulta en sql y dependiendo de los campos marcados en el CheckBox se muestran.
Para mi es lo mas sencillo.
Saludos

  • 0

#9 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 26 febrero 2009 - 11:21

Para seguir participando en estos menesteres  :D :D :D :D

Es para que vayas frí­o, pero tocando el tema, no crees que guardandolo de manera vertical puedas resolver ese tipo de problemas, ya que sin importar la data lo podrí­as asociar a un "tipo".

Comentanos!!!
  • 0

#10 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 27 febrero 2009 - 07:32

Lo de añadir "group by" a la consulta ya lo estaba usando, pero no es tan sencillo, hay que tener en cuenta que campos se van a sumar y cuales no, y si la consulta es mas compleja, por ejemplo si ya tiene un group by, la cosa se complica.

Pensaba que a lo mejor habí­a una forma de agrupar los valores que se mostraban en la rejilla sin cambiar la consulta, pero ya veo que no  :( . No me va a quedar mas remedio que buscar una forma sencilla se cambiar la consulta, como la de pulsar en el titulo de las columnas por ejemplo.

Ahora una pregunta: como puedo hacer para guardar el resultado de la consulta en una tabla temporal y luego hacer consultas contra es tabla temporal. ¿alguna sugerencia?
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 febrero 2009 - 07:56

Lo de añadir "group by" a la consulta ya lo estaba usando, pero no es tan sencillo, hay que tener en cuenta que campos se van a sumar y cuales no, y si la consulta es mas compleja, por ejemplo si ya tiene un group by, la cosa se complica.

Pensaba que a lo mejor habí­a una forma de agrupar los valores que se mostraban en la rejilla sin cambiar la consulta, pero ya veo que no  :( . No me va a quedar mas remedio que buscar una forma sencilla se cambiar la consulta, como la de pulsar en el titulo de las columnas por ejemplo.

Ahora una pregunta: como puedo hacer para guardar el resultado de la consulta en una tabla temporal y luego hacer consultas contra es tabla temporal. ¿alguna sugerencia?


yo trabajaria con vistas...



sql
  1. SELECT Fecha, Codigoproducto AS Codigo, SUM(Monto) AS Ventas FROM Facturas GROUP BY Fecha, CodigoProducto



Esto te daria un primer resultado del monto total de las ventas de cada producto en cada fecha.  Luego a partir de hay seria mas facil



sql
  1. SELECT Fecha, SUM(monto) FROM Vista WHERE fecha >= :desde AND fecha <= :hasta GROUP BY Fecha



Te daria un total por fechas en un periodo determinado



sql
  1. SELECT Codigo, SUM(monto) FROM Vista WHERE Codigo >= :desde AND Codigo <= :hasta GROUP BY Codigo



Asi te daria un total de ventas por producto


Creo que de eso es que estabas hablando, o no te he entendido nada  :^)
  • 0

#12 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 27 febrero 2009 - 08:13

yo trabajaria con vistas...


:D Eso de la Vistas promete. Le voy a dar un enfoque completamente diferente al programa. Ahora en los archivos de texto guardare la consulta que genera la Vista y luego el usuario trabajara sobre esa vista aplicando filtros y agrupando.

Muchas gracias !!!
  • 0

#13 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 febrero 2009 - 08:42

no tienes nada que agradecer amigo, cualquier cosa vuelve a pegar el grito, aqui estaremos esperando...
  • 0

#14 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 27 febrero 2009 - 03:20

Pues cuales columnas puedes sumarizar, es facil por los tipos de datos, enteros o flotantes se pueden sumar. Para mi lo mas facil asi como dice Caral, armar a pelo el Select. no es dificil, a ver una duda, sobre cuantas tablas diferentes son las consultas que realizas?, o hay una preconsulta?
  • 0