Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Campos Calculados en base un registro anterior al actual (https://www.clubdelphi.com/foros/showthread.php?t=54058)

MaMu 07-03-2008 19:51:31

Campos Calculados en base un registro anterior al actual
 
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:

Código SQL [-]

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

Cita:

Empezado por luisgutierrezb (Mensaje 271572)
bueno, se me ocurre una subconsulta, algo asi como:


Código SQL [-]

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:

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

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


La franja horaria es GMT +2. Ahora son las 18:06:43.

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