PDA

Ver la Versión Completa : SQL sumar iniciando con valor del renglon anterior


agova
22-01-2009, 15:33:30
Que tal a todos, tengo tiempo tratando de hacer un reporte de historico de saldos de clientes, o sea es algo como esto:

CLIENTE FECHA MOVIMIENTO CARGO ABONO SALDO
1 01/01/09 NOTA 1500 0 1500<--Saldo renglon anterior+cargo-abono
1 03/01/08 PAGO NOTA 0 500 1000<--Saldo renglon anterior+cargo-abono
1 09/01/08 PAGO NOTA 0 900 100<--Saldo renglon anterior+cargo-abono

ya tengo el reporte con las primeras 5 columnas pero no se como hacer para la columna de saldo ya que este valor entra como campo inicial del renglon siguiente, alguien tiene alguna solucion, de antemando agradezco su atencion.

poliburro
22-01-2009, 16:34:00
Que tal a todos, tengo tiempo tratando de hacer un reporte de historico de saldos de clientes, o sea es algo como esto:

CLIENTE FECHA MOVIMIENTO CARGO ABONO SALDO
1 01/01/09 NOTA 1500 0 1500<--Saldo renglon anterior+cargo-abono
1 03/01/08 PAGO NOTA 0 500 1000<--Saldo renglon anterior+cargo-abono
1 09/01/08 PAGO NOTA 0 900 100<--Saldo renglon anterior+cargo-abono

ya tengo el reporte con las primeras 5 columnas pero no se como hacer para la columna de saldo ya que este valor entra como campo inicial del renglon siguiente, alguien tiene alguna solucion, de antemando agradezco su atencion.


Podrías usar un cursor que en una tabla temporal te genere los saldos progresivos en una tabla temporal. Tu consulta la unes con la temporal amarrando por la fecha. Se me ocurre a botepronto que esa sería una solución. saludos.

agova
22-01-2009, 16:52:43
suena bien tu propuesta yo creo que pueda funcionar pero el cursor como se utiliza?, y seria por fecha y tipo de movimiento(Nota, Pago,Etc) por que si es solo por fecha, existen dias en que se registran varios movimientos.

poliburro
22-01-2009, 17:54:20
Ok, Primero lo que debes hacer es obtener los sumarios por Dia.

Luego ese sumario lo recorres con el cursor grabando los acumulados en una tabla temporal teniendo entonces la columna

Fecha, Sumario, Acumulado
X X X
Y Y X + Y
Z Z X + Y + Z


Luego a tu consulta la unes con esta tabla temporal y obtienes lo que necesitas. Saludos

luisgutierrezb
22-01-2009, 17:55:19
podria ser un subselect con la fecha anterior algo asi como:


Select cliente, Movimiento, Fecha, Cargo,
(Select Sum(m.Abono) from movimientos m
where m.fecha < p.fecha and cliente = x, etc) as Abono
from movimientos p


es un ejemplo simple, pero a lo mejor sirve como guia...

poliburro
22-01-2009, 20:40:14
podria ser un subselect con la fecha anterior algo asi como:


Código SQL [-] (http://www.clubdelphi.com/foros/#)
Select cliente, Movimiento, Fecha, Cargo,
(Select Sum(m.Abono) from movimientos m
where m.fecha < p.fecha and cliente = x, etc) as Abono
from movimientos p





es un ejemplo simple, pero a lo mejor sirve como guia...


Es de hecho totalmente correcta esa solución, la única desventaja es que esa es una consulta sumamente costosa.

agova
23-01-2009, 00:46:08
gracias a ambos por su respuesta, estoy tratando de implementar la tuya poliburro, pero podrias explicarme un poco mas como se usan los cursores que nunca he utilizado alguno, cabe mencionar que estoy usando bases de datos en access y acceso por medio de ODBC´s

agova
23-01-2009, 19:23:50
Que tal luisgutierrezb, ya probe tu propuesta y si funciona, pero no es viable ya que en los primeros renglones todo bien, el problema empieza cuando recorro la consulta a los registros superirores funciona de la misma forma que con campos calculados, hace el calculo conforme va desplegando los valores y el numero de subconsultas que tiene que realizar aumenta exponencialmente y no termina, ya habia probado la posibilidad de hacerlo por medio de campos calculados pero como te digo tampoco es viable, lo que me queda es hacerlo por medio de cursores, como dice poliburro, el detalle es que nunca los he utilizado, si alguien sabe y me puede guiar se los agradecere. Si algo encuentro los mantendre al tanto.

fjcg02
24-01-2009, 15:02:16
¿ qué motor de BBDD utilizas ?
Con interbase, firebird, sqlserver, ... se puede hacer un procedimiento almacenado que te permite realizar lo que tú propones sin que se dispare el rendimiento.

Saluds

agova
27-01-2009, 15:17:19
que tal fjcg02, estoy manejando para esta aplicacion una BD en access es de lo mas pobre, generalmente manejo postgresql pero para esta aplicacion decidi usar access 97 por la misma naturaleza de la aplicacion.

poliburro
27-01-2009, 20:52:42
lo que me queda es hacerlo por medio de cursores, como dice poliburro, el detalle es que nunca los he utilizado, si alguien sabe y me puede guiar se los agradecere. Si algo encuentro los mantendre al tanto.


El problema amigo es que los cursores no están disponibles en Access97.

Otra posible solución es que agreges un campo calculado a tu AdoQuery y allí vayas generando el acumulado. Saludos.