Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQL sumar iniciando con valor del renglon anterior (https://www.clubdelphi.com/foros/showthread.php?t=62945)

agova 22-01-2009 15:33:30

SQL sumar iniciando con valor del renglon anterior
 
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

Cita:

Empezado por agova (Mensaje 335512)
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:

Código SQL [-]
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

Cita:

Empezado por luisgutierrezb (Mensaje 335545)
podria ser un subselect con la fecha anterior algo asi como:


Código SQL [-]
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

Cita:

Empezado por agova (Mensaje 335711)

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.


La franja horaria es GMT +2. Ahora son las 07:33:01.

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