PDA

Ver la Versión Completa : Sumar montos a medida que se ingresa


Analia29
25-10-2006, 18:57:26
Hola, les consulto lo siguiente:
Trabajo con Delphi 7, y Firebird 1.5, y resulta que tengo una consulta que me arroja un listado de personas, donde uno de los campos es un monto al cual se ingresa a través de un DBGrid, hasta ahí todo bien, mi duda es como hacer para ir sumando los valores que se ingresan y así ir mostrando un total y que se actualize a medida que se ingresa o se modifica un valor. El total no se necesita almacenar en ningún lado, es simplemente para ir controlando a medida que se ingresa.

Espero haber sido clara. :rolleyes:
Saludos y gracias.

Analía

Caral
25-10-2006, 19:46:22
Hola
La verdad no entiendo muy bien:
Se despliega el campo en un dbgrid:
Pregunto: quieres sumar lo que aparece en el dbgrid o vas cambiando o poniendo tu los datos en este y quieres que se sumen estos, osea los que pones tu.?
Saludos

Analia29
25-10-2006, 20:36:55
A ver si puedo explicar mejor :o .
Tengo en un dbgrid un campo que se va cargando con valores de montos. Yo lo que necesito es ir sumando esos montos que se van cargando para que me vaya arrojando un total, puede ser en un Edit, eso es lo de menos, la idea es que el usuario que carga pueda ir viendo el monto total a medida que va cargando los montos en el dbgrid. Los datos que se muestran en ese dbgrid son resultado de una consulta que está en un dataset, y que luego se actualiza en la base de datos.

Espero haber sido más clara.:D

Gracias y saludos

Caral
25-10-2006, 21:18:59
Bueno Analia29, creo que ya me aclaro, perdon la ingnorancia.:D :D
Creo que ya se lo que quieres, prueba esto:
En un query temporal pones esto:

QTemp.SQL.Text := 'SELECT DISTINCTROW Sum([TuTabla.TuCampo]) AS [Suma] From TuTabla';
QTemp.Open;
Edit1.Text := IntToStr(QTemp.Fields[0].AsInteger);
Por supuesto su tabla y tu campo lo entiendes?:confused: o te aclaras.:D
Espero te sirva y me aclare:D .
Saludos

Lepe
26-10-2006, 08:29:00
Siendo Firebird, se podría abordar el problema desde otro frente.

Una idea: usando Eventos del SGBD, en el afterInsert y/o Update de la tabla a modificar, lanzas un evento. La ventana de tu programa registra ese evento y cuando recibe notificación, ejecuta (una consulta, procedimiento almacenado, etc) que te devuelva ese total y se asigne a un label.

Otra idea: Para actualizar o modificar una tabla, llamas a un procedimiento almacenado de seleccion, al cual le pasas todos los campos a modificar más uno extra donde el propio SP te devuelve ese monto, al ser "un campo más del SP", se usaría un DBEdit para ver el monto.

Así siempre tendrías el valor actualizado, sin tener que abrir y cerrar la consulta cada dos por tres.

Saludos

Analia29
27-10-2006, 12:58:38
Hola, estoy intentando resolver el problema y lo estoy haciendo con procedimientos almacenados, les transcribo el código.
CREATE PROCEDURE SUMATOTAL (
PER INTEGER,
EST INTEGER)
RETURNS (
TOTAL FLOAT,
CODAFILIADO INTEGER,
FECHAMOD DATE,
MONTO FLOAT,
MOTNOPAGO INTEGER,
PAGO VARCHAR(1),
USUARIO INTEGER,
CODIGO INTEGER,
NOMBREYAPELLIDO VARCHAR(50),
NRODOC INTEGER,
APORTA VARCHAR(1),
CUIL VARCHAR(25),
CODPERIODO INTEGER,
NROESTAB INTEGER)
AS
begin
total = 0;
For SELECT DISTINCT APORTESAFI.Codafiliado, APORTESAFI.Fechamod, APORTESAFI.Monto, APORTESAFI.Motnopago, aportesafi.Codperiodo,
Aportesafi.Pago, APORTESAFI.Usuario, APORTESAFI.Codigo, aportesafi.Nroestab, AFILIADOS.NOMBREYAPELLIDO , AFILIADOS.NRODOC, AFILIADOS.APORTA, AFILIADOS.CUIL
FROM APORTESAFI
INNER JOIN AFILIADOS ON (APORTESAFI.CODAFILIADO = AFILIADOS.CODIGOAFILIADO)
WHERE
(
(APORTESAFI.CODPERIODO = :PER)
and
(APORTESAFI.NROESTAB = :EST)
)
ORDER BY APORTESAFI.NROESTAB, NOMBREYAPELLIDO
INTO :Codafiliado, :Fechamod, :Monto, :Motnopago, :codperiodo, :Pago, :Usuario, :Codigo, :nroestab, :NOMBREYAPELLIDO , :NRODOC, :APORTA, :CUIL DO
BEGIN
total = :total + :monto;
suspend;
end
end
El resultado aún no es lo deseado, ya que el total lo va sumando bien, solo que en cada registro, y yo lo necesito que se vaya actualizado en el dbedit la sumatoria o sea el campo total.

Gracias por la ayuda, creo que ahora voy en mejor camino que antes, pero aún no he podido :mad: , seguro que debe ser una pavada.

Saludos

Lepe
27-10-2006, 13:34:56
CREATE PROCEDURE SUMATOTAL (
PER INTEGER,
EST INTEGER)
RETURNS (
TOTAL FLOAT,
CODAFILIADO INTEGER,
FECHAMOD DATE,
MONTO FLOAT,
MOTNOPAGO INTEGER,
PAGO VARCHAR(1),
USUARIO INTEGER,
CODIGO INTEGER,
NOMBREYAPELLIDO VARCHAR(50),
NRODOC INTEGER,
APORTA VARCHAR(1),
CUIL VARCHAR(25),
CODPERIODO INTEGER,
NROESTAB INTEGER)
AS
begin
total = 0;
For SELECT DISTINCT APORTESAFI.Codafiliado, APORTESAFI.Fechamod, APORTESAFI.Monto, APORTESAFI.Motnopago, aportesafi.Codperiodo,
Aportesafi.Pago, APORTESAFI.Usuario, APORTESAFI.Codigo, aportesafi.Nroestab, AFILIADOS.NOMBREYAPELLIDO , AFILIADOS.NRODOC, AFILIADOS.APORTA, AFILIADOS.CUIL
FROM APORTESAFI
INNER JOIN AFILIADOS ON (APORTESAFI.CODAFILIADO = AFILIADOS.CODIGOAFILIADO)
WHERE
(
(APORTESAFI.CODPERIODO = :PER)
and
(APORTESAFI.NROESTAB = :EST)
)
ORDER BY APORTESAFI.NROESTAB, NOMBREYAPELLIDO
INTO :Codafiliado, :Fechamod, :Monto, :Motnopago, :codperiodo, :Pago, :Usuario, :Codigo, :nroestab, :NOMBREYAPELLIDO , :NRODOC, :APORTA, :CUIL DO
BEGIN
total = :total + :monto;
end
suspend;
end

Tan fácil como cambiar el suspend del bucle, así realiza la sumatoria de todos los registros y solo devuelve datos al finalizar, cuando ya se tiene el monto total.

Saludos