PDA

Ver la Versión Completa : Campos Calculados en base un registro anterior al actual


MaMu
07-03-2008, 19:51:31
Campos Calculados en base un registro anterior al actual

Estoy haciendo la típica tabla contable
DEBE | HABER | SALDO

Siendo SALDO, un campo calculado en base al DEBE y el HABER. Pero no se como hacer para calcularlo y mostrarlo como se debe, como en la vieja escuela. Porque? Porque si bien el saldo se obtiene directamente desde la operación con DEBE y HABER, necesito que, partiendo del primer registro de la tabla, los siguientes SALDOS, se calculen en base al arrastre de cuentas, es decir, supongamos que tengo:

ID | DEBE | HABER | SALDO
---------------------------
1..........2..........0.......-2
2..........5..........0.......-7
3..........8..........0.......-15
4..........0..........5.......-10

etc.

Puedo hacer el DEBE-HABER cuando calculo el campo, pero como hago para que me arrastre el SALDO anterior? no se me ocurre.

Saludos y gracias

Rudi
07-03-2008, 20:46:37
seria algo como la suma de los DEBE menos la suma de los HABER.
siempre que el sean ID's menores o iguales a mi ID.

luisgutierrezb
07-03-2008, 20:49:49
bueno, se me ocurre una subconsulta, algo asi como:



Select id, debe, haber, (debe - haber) as saldo,
(
Select sum(debe-haber) from tabla t where t.id <= tabla.id
) as acumulado
from tabla




a lo mejor algo me falla pero creo que ahi esta la idea...

MaMu
08-03-2008, 01:28:55
Si, la idea podria ser, pero el tema esta que la consulta, si o si, tiene que estar ordenada por FECHA.

MaMu
08-03-2008, 04:29:21
bueno, se me ocurre una subconsulta, algo asi como:


Código SQL [-] (http://www.clubdelphi.com/foros/#)

Select id, debe, haber, (debe - haber) as saldo,
(
Select sum(debe-haber) from tabla t where t.id <= tabla.id
) as acumulado
from tabla







a lo mejor algo me falla pero creo que ahi esta la idea...

Lo que no entiendo es como aplicar esta subconsulta, es decir, en donde?

jachguate
08-03-2008, 05:41:06
Sobre el ordenamiento, podrías ordenarla tal como te plazca:


select id, debe, haber, (debe - haber) as saldo,
(
select sum(debe-haber) from tabla t where t.id <= tabla.id
) as acumulado
from tabla
order by fecha;


El inconveniente que veo de enfrentar el problema con esta solución es el rendimiento. En bases de datos pequeñas, no habrá diferencia, pero en bases de datos grandes indudablemente no lo dejaría. Lamentablemente no sabemos el motor sobre el que se ejecutará, por lo que, ceñidos al estándar, no veo otra opción que esta.

Hasta luego.

;)

MaMu
09-03-2008, 22:07:07
SOLUCIONADO

Corregí la clausula where, ya que es lo correcto. Porque? que pasa si añadiera un registro cuya fecha es anterior? al estar ordenado por ID, este seria mayor en un registro posterior.


select id_caja, fecha, concepto, cantidad, debe, haber, (debe - haber) as saldo,
(
select sum(debe-haber) from caja t where t.fecha<= caja.fecha
) as acumulado
from caja
order by fecha




Saludos