Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-03-2008
MARLON1 MARLON1 is offline
Miembro
 
Registrado: nov 2007
Posts: 118
Poder: 17
MARLON1 Va por buen camino
Como sumar los datos de un dbgrid!!!

Hola a todos necesito sumar todos los datos de una columna en un dbgrid y mostrar el resultado en un edit espero que me puedan ayudar.
Responder Con Cita
  #2  
Antiguo 13-03-2008
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Que tal,
Lo que yo haria es usar el dataset asociado al DBGrid para sumar la columna que se necesita, y no el DBGrid, es mas , usaria un ClientDataSet y en a este le creo un campo agregado sumando los valores de la columna que se necesita.
Saludos
Responder Con Cita
  #3  
Antiguo 13-03-2008
MARLON1 MARLON1 is offline
Miembro
 
Registrado: nov 2007
Posts: 118
Poder: 17
MARLON1 Va por buen camino
Cita:
Empezado por juanelo Ver Mensaje
Que tal,
Lo que yo haria es usar el dataset asociado al DBGrid para sumar la columna que se necesita, y no el DBGrid, es mas , usaria un ClientDataSet y en a este le creo un campo agregado sumando los valores de la columna que se necesita.
Saludos
hola gracias spor la ayuda pero me podrias dar una idea de como va el codigo es que todavia no tengo mucha experencia espero y me puedas proporcionar codigo gracias
Responder Con Cita
  #4  
Antiguo 13-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
¿Por qué no dejas que el servidor haga su trabajo lanzando una consulta que sume la columna?

Código SQL [-]
select sum(columna) from tu tabla

Bye
Responder Con Cita
  #5  
Antiguo 13-03-2008
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Cita:
Empezado por keyboy Ver Mensaje
¿Por qué no dejas que el servidor haga su trabajo lanzando una consulta que sume la columna?

Código SQL [-]select sum(columna) from tu tabla


Bye
La verdad es que no pone mucho codigo nuestro amigo Marlon1 y tampoco explica la funcionalidad que tiene su programa, tu idea es buena, pero si el dbgrid es editable y puede modificar la columna por la que quiere sumar, entonces tu idea ya no funcionaria, con un CDS el campo agregado se calcula de forma automatica.
Saludos
Responder Con Cita
  #6  
Antiguo 13-03-2008
MARLON1 MARLON1 is offline
Miembro
 
Registrado: nov 2007
Posts: 118
Poder: 17
MARLON1 Va por buen camino
Cita:
Empezado por juanelo Ver Mensaje
La verdad es que no pone mucho codigo nuestro amigo Marlon1 y tampoco explica la funcionalidad que tiene su programa, tu idea es buena, pero si el dbgrid es editable y puede modificar la columna por la que quiere sumar, entonces tu idea ya no funcionaria, con un CDS el campo agregado se calcula de forma automatica.
Saludos
hola no me marca ningun error al ejecutarlo pero no me muestra nada, como hago para mostrar el resultado de esa consulta me puedes ayudar de nuevo porfavor.
Responder Con Cita
  #7  
Antiguo 13-03-2008
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Cita:
Empezado por MARLON1 Ver Mensaje
hola no me marca ningun error al ejecutarlo pero no me muestra nada, como hago para mostrar el resultado de esa consulta me puedes ayudar de nuevo porfavor.
No entiendo lo que quieres decir ...
Responder Con Cita
  #8  
Antiguo 13-03-2008
MARLON1 MARLON1 is offline
Miembro
 
Registrado: nov 2007
Posts: 118
Poder: 17
MARLON1 Va por buen camino
Red face

Cita:
Empezado por juanelo Ver Mensaje
No entiendo lo que quieres decir ...
hola perdon por no explicarme bien, lo que quiero decir es ke no me muestra ningun resultado, o mas bien como le hago para que el resultado de la consulta me lo muestre en un edit.espero ke me entiendas gracias
Responder Con Cita
  #9  
Antiguo 13-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Es que creo que citaste a juanelo cuando en realidad te referías a mi propuesta. Si es así, supongo que tienes ya un Query para la consulta:

Código Delphi [-]
Query1.SQL.Text := 'select sum(columna) from tabla';
Query1.Open;

En tal caso sólo tienes que tomar el valor así:

Código Delphi [-]
Edit1.Text := Query1.Fields[0].Value;

Si te referías a la propuesta de juanelo, entonces tendrás que explicar a qué codigo te refieres.

Bye
Responder Con Cita
  #10  
Antiguo 13-03-2008
MARLON1 MARLON1 is offline
Miembro
 
Registrado: nov 2007
Posts: 118
Poder: 17
MARLON1 Va por buen camino
Thumbs up

Cita:
Empezado por keyboy Ver Mensaje
Es que creo que citaste a juanelo cuando en realidad te referías a mi propuesta. Si es así, supongo que tienes ya un Query para la consulta:


Código Delphi [-]
Query1.SQL.Text := 'select sum(columna) from tabla';
Query1.Open;





En tal caso sólo tienes que tomar el valor así:


Código Delphi [-]
Edit1.Text := Query1.Fields[0].Value;





Si te referías a la propuesta de juanelo, entonces tendrás que explicar a qué codigo te refieres.

Bye
GRACIAS POR LA AYUDA Y PERDON SI NO ME EXPLIQUE BIEN , ME SIRVIO TODO GRACIAS

de nuevo yo aki una duda y si para hacer la consulta utilizo un boton y le pongo el codigo:

query1.Close;
query1.SQL.Clear;

query1.SQL.Add('Select Sum(imp) AS total From seg1 WHERE idcli=:cla && obr=bra');
query1.ParamByName('cla').Value:=Edit1.Text;
query1.ParamByName('obra').Value:=Edit4.Text;


query1.Open;

como tengo ke tomar el valor pra mostrarlo en el edit. muchas gracias

Última edición por MARLON1 fecha: 13-03-2008 a las 19:50:01.
Responder Con Cita
  #11  
Antiguo 21-04-2008
Avatar de jirbert
jirbert jirbert is offline
Miembro
 
Registrado: nov 2007
Ubicación: Valencia-Venezuela
Posts: 60
Poder: 17
jirbert Va por buen camino
buenas, trate de usar el mismo codigo en algo parecido que estoy haciendo pero no me resulto!! lo que quiero es que me sume todos los campos que se encuentra en un dbgrid el cual se esta cargando constantemente pero no editable sino que se le agrega, trabajo en delphi 6 gracias!!!
Responder Con Cita
  #12  
Antiguo 21-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Un enfoque alternativo

Hola,

En primer lugar, hay que tener en cuenta que en el TDBGrid puede haber campos calculados, en cuyo caso, la solución basada en usar un TQuery para obtener la suma con un :

Código SQL [-]
Select Sum(CampoBuscado) From Tabla

no serviría, a menos que pudieras reproducir en el Select el campo calculado lo que no siempre es posible o fácil. Sin embargo, en la mayoría de los casos el Select es una buena solución

Para usar otro enfoque, no debes trabajar con el TDBGrid sino con su dataset asociado, y realizar la suma con un While. Veamos un ejemplo con un solo campo a sumar:

Código Delphi [-]
Function TMiFormulario.SumarCampoouble;
Var
  Suma:          Double; 
Begin
     Suma := 0;
     Try
        With MiDataSet Do Begin
             DisableControls;  
             First;
             While Not EoF Do Begin
                   Suma := Suma + MiDataSetCAMPO.AsFloat;
                   Next;
             End;
        End; 
     Finally
        MiDataSet.EnableControls;
     End; 
     SumarCampo := Suma;
End;

En este caso MiDataSet es típicamente un TQuery y MiDataSetCAMPO es un campo permanente correspondiente al campo de la base de datos que se desea sumar. Observa el uso de DisableControls y EnableControls; esto se hace para evitar refrescar la pantalla mientras se calcula la suma.

Creo que te será facil adaptar esta solución a varios campos.

Suerte
Responder Con Cita
  #13  
Antiguo 21-04-2008
Avatar de jirbert
jirbert jirbert is offline
Miembro
 
Registrado: nov 2007
Ubicación: Valencia-Venezuela
Posts: 60
Poder: 17
jirbert Va por buen camino
Código PHP:
Var
Suma:Double;
Begin
     Suma
:=0;
     Try
        
With query1 Do Begin
             DisableControls
;
             
First;
             While 
Not EoF Do Begin
                   Suma 
:= Suma Query1.AsFloat;
                   
Next;
             
End;
        
End;
     
Finally
        query1
.EnableControls;
     
End;
     
SumarCampo := Suma;
End
buenas gracias por responder!! bueno hice lo que me dijestes pero me arrojo 2 errores

undeclared identifier:'asfloat'
undeclared identifier:'sumarcampo'
Responder Con Cita
  #14  
Antiguo 21-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Explicación a tús dos errores

Hola,

Mira, SumarCampo te lo indica como no definido seguramente porque no has definido la función en la clase correspondiente al formulario. Típicamente necesitas tenerlo en la sección Private; o sea :

Código Delphi [-]
Private
   Function sumarcampo : Double;

Respecto al AsFloat, es porque en lugar de usar el objeto que representa al campo permanente pusiste fué el Query1. Si tú campo se llama por ejemplo VALOR, la línea debería ser :

Código Delphi [-]
Suma := Suma + Query1VALOR.AsFloat;

Ahora, disculpa la pregunta; pero, sabes como se crean campos permanentes ?. Query1VALOR debe ser un campo permanente y necesitas saber como crearlo

Suerte
Responder Con Cita
  #15  
Antiguo 21-04-2008
Avatar de jirbert
jirbert jirbert is offline
Miembro
 
Registrado: nov 2007
Ubicación: Valencia-Venezuela
Posts: 60
Poder: 17
jirbert Va por buen camino
no se como crear un campo permenete
Responder Con Cita
  #16  
Antiguo 21-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Como crear el campo permanente y un consejo

Hola,

Bueno, la forma más básica de crear un campo permanente es la siguiente:

1. Te aseguras que el componente TDatabase a que este asociado tú TQuery esté activo; para lo cual debes tener su propiedad LoginPrompt en True y luego ahí si poner Connected a True

2. Haces click sobre tú Query1

3, Ahora click con el botón derecho y eliges Fields Editor

4. En la ventana que se abre, otra vez usa el botón derecho del mouse y verá un Menú con las opciones Add Field y Add all Fields, las cuales lógicamente te permiten crear campos individuales (Add Field) o todos de una vez (Add All Fields).

5. En el caso de los Query, lo normal es crealos todos, o sea, usa "Add All Fields"

6. Lo que hace este proceso es crear objetos que descendienden de la clase TField, cada uno de ellos asociado a un campo de la base de datos. El sistema los agrega automáticamente al formulario, o al Data Module, según donde tengas tú Query (por metodología debería ser siempre en un TDataModule). Cada objeto tienen un nombre formado por el nombre del Query seguído del nombre del campo a que este asociado y su tipo, como ya dije, es un descendiente de TField que puede ser un TStringField, TFloatField, etc.

Espero que esto te pueda ayudar para empezar; pero, disculpame, quiero ser sincero contigo :

Por lo que veo, eres aún demasiado novato en esto de Delphi. Lo que te acabo de explicar es de lo más básico en la parte de Base de Datos. Así las cosas, el mejor consejo que te puedo dar es que, antes de seguír codificando, te tomes el tiempo para leer con calma libros de programación en Delphi; como punto de arranque te será mucho más efectivo que la ayuda que podamos prestarte aquí

Suerte
Responder Con Cita
  #17  
Antiguo 21-04-2008
jangel_ramirezm jangel_ramirezm is offline
Miembro
 
Registrado: ago 2007
Ubicación: León Gto. Mex.
Posts: 39
Poder: 0
jangel_ramirezm Va por buen camino
Hola
Prueba con fieldbyname
el field es el nombre de tu campo. pienso que es algo sencillo pero puede servirte
Código Delphi [-]
Var
Suma:Double;
Begin
     Suma:=0;
     Try
        With query1 Do Begin
             DisableControls;
             First;
             While Not EoF Do Begin
                   Suma := Suma + fieldbyname('Field').AsFloat;
                   Next;
             End;
        End;
     Finally
        query1.EnableControls;
     End;
     Edit1.Text:=Floattostr(Suma);
End;  

Saludos
Responder Con Cita
  #18  
Antiguo 21-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Comentarios a FieldByName

Hola,

Respecto a la solución basada en FieldByName, ciertamente también funciona; pero , ya que nuestro amigo está empezando, creo conveniente efectuar algunos comentarios acerca de su uso.

FieldByName es un método que devuelve automáticamente el objeto, descendiente de TField que el respectivo TDataset tiene para el campo que se la pasa como único parámetro. En ese orden de ideas, si el campo se llama Field, y el Query, Query1, como en el ejemplo, eso es, en principio, lo mismo que crear el objeto Query1Field y escribir Query1Field.AsFloat. Sin embargo, hay varias diferencias.

A efectos de simples operaciones sumatorias, como el caso presente, FieldByName es más versatil que el método que yo mencioné antes, ya que el nombre del campo puede pasarse como parámetro a tiempo de ejecución, y es por tanto la solución adecuada cuando los nombres de los campos pueden ser diferentes a tiempo de ejecución.

Por contra, es bastante ineficiente frente al método de crear el campo permanente, ya que cada vez que se llame a FieldByName, este debe realizar una busqueda entre la lista de campos del Query. Si el Query tiene muchos campos y encima hay muchos registros, esto significa muchas operaciones innecesarias extras.

A lo anterior agrega que es bastante más complicado de manejar cuando se requiere usar otras funcionalidades, tales como campos calculado y eventos OnGetText y OnSetText

Una alternativa para el ejemplo actual es obtener el objeto TField deseado antes de efectuar el While. Veamos :

Código Delphi [-]
Var
Suma: Double;
ElCampo:  TField; 
Begin
     Suma:=0;
     Try
        With query1 Do Begin
             DisableControls;
             ElCampo := fieldbyname('Field');
             First;
             While Not EoF Do Begin
                   Suma := Suma + ElCampo.AsFloat;
                   Next;
             End;
        End;
     Finally
        query1.EnableControls;
     End;
     Edit1.Text:=Floattostr(Suma);
End;

También es de anotar que FieldByName genera una excepción si el campo no existe. Para controlar eso, puede usarse FindField que es lo mismo que FieldByName excepto que si el campo no existe, en lugar de genear un error devuelve el valor Nil, permitiendo así que el programador pueda analizar el error.

Como verás, aún en este caso sencillo hay muchas cosas por anotar. Por eso mi consejo de que dediques un tiempó a leer libros de Delphi o mirar artículos en Internet. Creo que te darán una visión más amplia.

Última edición por rolandoj fecha: 21-04-2008 a las 19:13:09.
Responder Con Cita
  #19  
Antiguo 22-04-2008
Avatar de jirbert
jirbert jirbert is offline
Miembro
 
Registrado: nov 2007
Ubicación: Valencia-Venezuela
Posts: 60
Poder: 17
jirbert Va por buen camino
hola rolandoj gracias por los consejo se que son muy utiles!! y tienes razon tengo qeu adentrarme un poco mas a la teoria para la practica!! en fin gracias ya consegui un codigo super fino me funcina de maravilla no me complico,, gracias de igual forma son muy amables las personas del foro gracias a ustedes he podido aclarar algunas conchas de mango que se me hacen un poco dificiles!! pero muchas gracias!!!
Responder Con Cita
  #20  
Antiguo 22-04-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por jirbert Ver Mensaje
hola rolandoj gracias por los consejo se que son muy utiles!! y tienes razon tengo qeu adentrarme un poco mas a la teoria para la practica!! en fin gracias ya consegui un codigo super fino me funcina de maravilla no me complico,, gracias de igual forma son muy amables las personas del foro gracias a ustedes he podido aclarar algunas conchas de mango que se me hacen un poco dificiles!! pero muchas gracias!!!
Hola jirbert, que bueno que ya conseguiste solucionar tu problema, pero uno de los espiritus del club es mostrar la solución a la problematica que se tenia, te invito a postear la solución para que otro compañero con la misma duda pueda acceder a la misma y de esta forma beneficiarnos todos.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
sumar la columna de un dbgrid pharaonhx Varios 3 12-06-2008 15:27:27
sumar una columna DBGrid cancerbero Conexión con bases de datos 5 11-08-2006 18:49:37
Sumar en DBgrid Migpal Varios 2 18-11-2005 18:02:48
Como extraer datos de un DBgrid a otro DBgrid mickey Conexión con bases de datos 13 29-01-2004 05:05:30
Sumar columnas de un DBGRID magm2000 Varios 3 27-09-2003 00:40:06


La franja horaria es GMT +2. Ahora son las 23:30:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi