Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

saldo mensual acumulado

Buenos días, amigos.

Tengo una tabla de saldos de cuentas en la que dispongo de los campos SALDO_INICIAL, DEBE_MES_01...DEBE_MES_12, HABER_MES_01...HABER_MES_12. ¿Cómo hacer para calcular y disponer del saldo acumulado de cada mes, teniendo en cuenta que esto se define de la siguiente manera: saldo_acum_mes_i = SALDO_INICIAL + suma( j <= i , DEBE_MES_(j) - HABER_MES_(j))?

A día de hoy, lo hago sin ningún procedimiento iterativo, lo que me lleva a escribir mucho y a unos script dificultosos de mantener. Busco un procedimiento iterativo.

He probado con uno, pero no consigo asignar un nombre simple a los campos donde alojo los cálculos, y colocarlos en una sola tabla.

Adjunto el archivo de mi ensayo.

¿Alguien me puede ayudar? Gracias de antemano

1 Solution

Accepted Solutions
Not applicable
Author

Corrijo la última respuesta, pues había un error importante. Sobre todo el JOIN, daba lugar a terribles productos cartesianos que no acaban bien...

Cambio los join por INNER JOIN, y además, tomo los registros de la primera tabla de forma que se unan a los de la que se va construyendo a través de un par de campos que forman clave primaria, en mi caso CUENTA y AÑO.

SET vMeses = '01,02,03,04,05,06,07,08,09,10,11,12';

for i = 1 to 12

    LET vSaldoAcumulado = 'SALDO_INICIAL';

    let vNombre = 'SaldoMes' & $(i);   

    for j=1 to $(i)

        LET vMes = SubField('$(vMeses)', ',', $(j));

        LET vSaldoMes = 'DEBE_MES_' & $(vMes) & '- HABER_MES_' & $(vMes);

        vSaldoAcumulado = vSaldoAcumulado & '+' & vSaldoMes;

    NEXT

    if ($(i)=1) then

        datos_numeradores:

        LOAD CUENTA, RATIO, ENTIDAD, AÑO, VALOR_ABS_REAL, OPERACION, CONC_OPERACION Resident datos_brutos_cuentas_numeradores;

        Inner Join LOAD CUENTA, AÑO, $(vSaldoAcumulado) as $(vNombre) Resident datos_brutos_cuentas_numeradores;

    ELSE

        Inner Join LOAD CUENTA, AÑO, $(vSaldoAcumulado) as $(vNombre) Resident datos_brutos_cuentas_numeradores;

    ENDIF

   

NEXT

DROP Table  datos_brutos_cuentas_numeradores;

View solution in original post

1 Reply
Not applicable
Author

Corrijo la última respuesta, pues había un error importante. Sobre todo el JOIN, daba lugar a terribles productos cartesianos que no acaban bien...

Cambio los join por INNER JOIN, y además, tomo los registros de la primera tabla de forma que se unan a los de la que se va construyendo a través de un par de campos que forman clave primaria, en mi caso CUENTA y AÑO.

SET vMeses = '01,02,03,04,05,06,07,08,09,10,11,12';

for i = 1 to 12

    LET vSaldoAcumulado = 'SALDO_INICIAL';

    let vNombre = 'SaldoMes' & $(i);   

    for j=1 to $(i)

        LET vMes = SubField('$(vMeses)', ',', $(j));

        LET vSaldoMes = 'DEBE_MES_' & $(vMes) & '- HABER_MES_' & $(vMes);

        vSaldoAcumulado = vSaldoAcumulado & '+' & vSaldoMes;

    NEXT

    if ($(i)=1) then

        datos_numeradores:

        LOAD CUENTA, RATIO, ENTIDAD, AÑO, VALOR_ABS_REAL, OPERACION, CONC_OPERACION Resident datos_brutos_cuentas_numeradores;

        Inner Join LOAD CUENTA, AÑO, $(vSaldoAcumulado) as $(vNombre) Resident datos_brutos_cuentas_numeradores;

    ELSE

        Inner Join LOAD CUENTA, AÑO, $(vSaldoAcumulado) as $(vNombre) Resident datos_brutos_cuentas_numeradores;

    ENDIF

   

NEXT

DROP Table  datos_brutos_cuentas_numeradores;