![]() |
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.:confused:
|
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 |
Cita:
|
¿Por qué no dejas que el servidor haga su trabajo lanzando una consulta que sume la columna?
Bye |
Cita:
Saludos |
Cita:
|
Cita:
|
Cita:
|
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:
En tal caso sólo tienes que tomar el valor así:
Si te referías a la propuesta de juanelo, entonces tendrás que explicar a qué codigo te refieres. Bye |
Cita:
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=:obra'); 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 |
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!!!
|
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 :
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:
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 |
Código PHP:
undeclared identifier:'asfloat' undeclared identifier:'sumarcampo' |
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 :
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 :
Ahora, disculpa la pregunta; pero, sabes como se crean campos permanentes ?. Query1VALOR debe ser un campo permanente y necesitas saber como crearlo Suerte |
no se como crear un campo permenete
|
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 |
Hola
Prueba con fieldbyname el field es el nombre de tu campo. pienso que es algo sencillo pero puede servirte
Saludos |
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 :
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. |
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!!!:D
|
Cita:
Salud OS |
La franja horaria es GMT +2. Ahora son las 12:47:57. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi