Calculando Movimientos a partir de Saldos
Este tip de diseño pretende solucionar la siguiente situación:
Se tiene una fuente de datos que presenta el saldo de una cuenta para cada mes. Estos saldos además se van acumulando dentro del semestre, es decir que tanto Enero como Julio tienen como saldo el monto efectivamente movilizado en ese mes. El resto de los meses presenta la acumulación de los meses anteriores dentro del semestre.
La siguiente tabla ilustra esta situación, donde se agregó la columna Movimiento que debe calcularse a partir del Saldo
Mes |
Saldo |
Movimiento |
---|---|---|
1 |
10 |
10 |
2 |
15 |
5 |
3 |
17 |
2 |
4 |
20 |
3 |
5 |
18 |
-2 |
6 |
21 |
3 |
7 |
17 |
17 |
8 |
11 |
-6 |
9 |
7 |
-4 |
10 |
22 |
15 |
11 |
31 |
9 |
12 |
27 |
-4 |
Si bien una alternativa es realizar el cálculo los movimientos directamente en la consulta de los saldos mediante consultas anidadas, estas requieren varias pasadas sobre los datos.
En primer lugar es necesario resaltar las características de esta situación
- El monto del Movimiento para cada mes se calcula como el Saldo del mes corriente menos el Saldo del mes anterior
- Para los meses de Enero y Julio el Saldo y el Movimiento coinciden
Considerando estas características es posible encontrar una solución más eficiente y elegante utilizando mecanismos de O3 de la siguiente forma:
Por cada registro leido de la consulta de Saldos, se generan datos para el mes indicado en el registro (mes corriente) y para el mes siguiente. El monto asociado al mes corriente coincide con el Saldo, y para el mes siguiente se le asigna el Saldo con signo cambiado. Sería como "restar" el Saldo.
Con esta solución cada registro de la consulta de Saldos genera 2 tuplas en el cubo tal como se ilustra en la siguiente tabla:
Mes |
Saldo |
Mes |
Valor |
---|---|---|---|
1 |
10 |
1 |
10 |
2 |
15 |
2 |
15 |
3 |
17 |
3 |
17 |
4 |
20 |
4 |
20 |
5 |
18 |
5 |
18 |
6 |
21 |
6 |
21 |
7 |
17 |
7 |
17 |
8 |
11 |
8 |
11 |
9 |
7 |
9 |
7 |
10 |
22 |
10 |
22 |
11 |
31 |
11 |
31 |
12 |
27 |
12 |
27 |
Notar los ceros que se muestran en rojo que son generados debido a que los saldos se acumulan dentro del semestre por lo que para los meses de Enero y Julio no deben realizarse ajustes.
De esta forma una vez construido el cubo la columna que figura en la tabla como Valor presentará el movimiento en cada mes ya que se obtiene como el saldo corriente menos el saldo del mes anterior.
La mejor forma de implementar esto en un modelo de O3 es de la siguiente forma:
- Se define la consulta de Saldos tal como se lo haría para construir la medida de Saldos con la salvedad que se le indica que construye 2 Tuplas por Registro
- Se construyen dos campos virtuales, uno para calcular la Fecha y otro para calcular el Valor que se le asignará a la medida Movimiento.
Los campos virtuales serían de la siguiente forma:
Campo Virtual para la Fecha
mes=Month(FechaParaMensual);
año=Year(FechaParaMensual);
mesSig=(mes==12) ? 1 : mes+1;
añoSig=(mes==12) ? año+1 : año;
Choose(TN, FechaParaMensual, Date(1,mesSig,añoSig))
Campo Virtual para el Valor
mes=Month(FechaParaMensual);
ultimoMes=Month(Date(1,12,2007));
Ajuste=((mes==ultimoMes) || (mes==12) || (mes==6)) ? 0 : -SaldoParaMensual;
(TN==2 && Ajuste==0) ? Skip() : Choose(TN, SaldoParaMensual, Ajuste)
Estos dos campos virtuales son los que hacen el truco de generar los Saldos corridos ajustados por signo que permiten calcular los movimientos.
Estas expresiones tienen además algunas particularidades que se marcaron en rojo y esto se debe a que el campo para calcular el Valor no debe generar valores para meses para los cuales no existe un saldo, es decir que si los saldos existen hasta el mes de Agosto, no se deberá calcular el ajuste para el mes de Setiembre o éste presentaría un movimiento negativo incorrecto.
Con estos ajustes se detecta el último mes (que en este ejemplo se dejó fijo como una constante) y se saltea el procesamiento del registro cuando se trata del ajuste y de un mes que no corresponde calcular.
Si bien en este ejemplo se definió el último mes como una constante en la expresión, es posible hacer algo más realista a través de una consulta sobre la tabla de Saldos que devuelva un único registro con la máxima fecha. Esta consulta luego puede convertirse en tabla local para recuperar dicho valor desde el campo virtual.