Ir al contenido


Foto

Calcular suma en columna dbgrid


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

#1 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 12 junio 2011 - 04:42

Buenas noches:

Antes de nada presentarme, soy Jesus de Cádiz, y me alegro de haber encontrado muchos nicks conocidos de otros foros y webs por aqui.

Y ahora a la cuestion, intento obtener la suma de una columna de un dbgrid (delphi 2010 sobre FB), como se les ocurre la forma mas eficiente de hacerlo, porque recorrer todos los registros para obtener el total me parece un  atraso y un desperdicio de trafico de red.

saludos y gracias
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 12 junio 2011 - 05:13

Hola
El DBGrid muestra el contenido de un dataSet.
Si quieres obtener la sum de un campo lo puedes hacer por sql:
Select sum(TuCampo) as suma where Tucondicion.

Saludos
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 junio 2011 - 06:38

Depende de la exigencia de la aplicación, si lo que se necesita es calcular el valor de una columna de datos previamente guardados, la indicación de Caral es la más lógica, pero si en cambio lo que necesitas es que vaya calculando en cuanto se cambie una línea antes de guardar, entonces no tendrás más remedio que recorrer la columna. Si de pronto usas TClientDatasets la cosa se hace fácil agregando un campo de tipo Aggregate y configurándolo para que sume.

Saludos

  • 0

#4 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 13 junio 2011 - 01:50

Gracias Caral, esa solucion la tengo presente; pero ocurre que tengo un pequeño inconveniente y es que estoy usando el componente JvFindEdit, de las Jedi, que por si no lo conocen lo que hace es una busqueda dinamica sobre el contenido de un Dataset, conforme vamos escribiendo va filtrando el Dataset. Por eso, inicialmente, cuando me traigo todos los registros me resulta facil saber la suma con la consulta SQL que propone el amigo Caral, pero una vez modificado el contenido del Dataset con el filtrado por alguno de los campos ya no puedo saber esos totales.

Mi idea es saber si es posible a nivel del conjunto de datos poder calcular ese total, ya que como digo cambia o puede cambiar con facilidad, por eso la solucion de ClientDataSet y el campo tipo Aggregate, pero no trabajo con ellos y ando un poco perdido. Alguna orientacion en este sentido?


Gracia y un Saludo
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 junio 2011 - 02:50

Los ClientDatasets son un tremendamente útiles, puedes empezar leyendo los artículos del blog Delphi al Limite para ir haciéndote una idea de su funcionamiento :

http://delphiallimit...tdataset-i.html
http://delphiallimit...dataset-ii.html
http://delphiallimit...ataset-iii.html
http://delphiallimit...dataset-iv.html
http://delphiallimit...ataset-y-v.html
http://delphiallimit...emoria-con.html

Saludos.
  • 0

#6 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 13 junio 2011 - 03:49

Gracias Marc por los enlaces, que he estado repasando.... y me queda una duda, como accedo a los campos agregattes de un Clientdataset para por ejemplo colocar su valor en una etiqueta por ejemplo


Saludos y gracias
  • 0

#7 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 junio 2011 - 03:51

Gracias Marc por los enlaces, que he estado repasando.... y me queda una duda, como accedo a los campos agregattes de un Clientdataset para por ejemplo colocar su valor en una etiqueta por ejemplo


Saludos y gracias


Lo puedes poner como un campo normal y corriente. Para los controles del formulario es indistinguible de cualquier otro campo.

Saludos.
  • 0

#8 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 13 junio 2011 - 05:16

Pues por alguna extraña razon, no me aparece en la lista de los campos disponibles para el Datasource correspondiente...


Algo no estoy haciendo bien


Saludos
  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 junio 2011 - 05:52

Pues por alguna extraña razon, no me aparece en la lista de los campos disponibles para el Datasource correspondiente...


Algo no estoy haciendo bien


Saludos


El Datasource tiene que estar enlazado con el ClientDataset (y no con el Dataset que le proporciona los datos via un DatasetProvider).

Después, en la lista de campos del ClientDataset (que se abre con un doble-clic sobre el mismo), añades un campo con el botón derecho -> New Field, y en Field Type marcas que es de tipo Aggregate.

A partir de ese momento ya debería estar disponible para ser enlazado vía DataSource a cualquier otro control.

NOTA: Para que funcione correctamente, no olvides rellear en Expression su función de Cálculo, y activar a True el AggregatesActive del ClientDataset.

Saludos.
  • 0

#10 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 13 junio 2011 - 06:31

Ok gracias lo probare


saludos
  • 0

#11 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 13 junio 2011 - 11:28

Gracias a vuestra ayuda por fin veo el resultado del campo agregatte.

Ahora tengo otra cuestion: si se filtran los datos del Dataset como puedo hacer para que refresque el contenido del campo agregatte con el resultado del nuevo conjunto de datos filtrado


Gracias y un saludo
  • 0

#12 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 junio 2011 - 12:43

Hola.

Gracias a vuestra ayuda por fin veo el resultado del campo agregatte.

Ahora tengo otra cuestion: si se filtran los datos del Dataset como puedo hacer para que refresque el contenido del campo agregatte con el resultado del nuevo conjunto de datos filtrado


Gracias y un saludo


Creo que ese ya es el comportamiento normal de los campos agregados, el de solo sumar los registros que cumplen el filtro.

Saludos.
  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 13 junio 2011 - 12:49

Hola.


Gracias a vuestra ayuda por fin veo el resultado del campo agregatte.

Ahora tengo otra cuestion: si se filtran los datos del Dataset como puedo hacer para que refresque el contenido del campo agregatte con el resultado del nuevo conjunto de datos filtrado


Gracias y un saludo


Creo que ese ya es el comportamiento normal de los campos agregados, el de solo sumar los registros que cumplen el filtro.

Saludos.


Además de lo que dice Marc, hay que tener claro que para que el campo agregate se actualice hay que aplicar el filtro sobre el TClientDataset y  no sobre el Dataset enlazado al TDatsetProvider.

Saludos
  • 0

#14 jesus_lara

jesus_lara

    Member

  • Miembros
  • PipPip
  • 29 mensajes
  • LocationCadiz

Escrito 13 junio 2011 - 02:28

Además de lo que dice Marc, hay que tener claro que para que el campo agregate se actualice hay que aplicar el filtro sobre el TClientDataset y  no sobre el Dataset enlazado al TDatsetProvider.


Gracias por ese pequeño apunte, lo estaba haciendo sobre el Dataset, pensando que la actualizacion era automatica pero veo que no

Gracias y un Saludo
  • 0




IP.Board spam blocked by CleanTalk.