Búsqueda de objetivos mediante el comando LOOP
Este ejemplo de script de cálculo de Essbase muestra cómo calcular el valor de ventas que debe alcanzar para obtener una ganancia determinada en un producto específico. En este caso, el script de cálculo ajusta el valor de presupuesto de ventas para alcanzar el objetivo de 15 000 ganancias para enero.
Como se muestra en la siguiente jerarquía, supongamos que no hay miembros etiquetados como Cálculo dinámico y que el miembro Ganancia por onza (en Ratios en la dimensión Medidas) no se incluye en el cálculo.
Figura 24-4 Dimensión de medidas

Supongamos que, antes de ejecutar el script de cálculo de búsqueda de objetivos, los valores de datos son:
Product, Market, Budget Jan
Profit 12,278.50
Margin 30,195.50
Sales 49,950.00
COGS 19,755.00
Total Expenses 17,917.00
Marketing 3,515.00
Payroll 14,402.00
Misc 0
Inventory Label Only member
Ratios Label Only member
Margin % 60.45
Profit % 24.58Script de ejemplo:
/* Declare the temporary variables and set their initial values*/
VAR
Target = 15000,
AcceptableErrorPercent = .001,
AcceptableError,
PriorVar,
PriorTar,
PctNewVarChange = .10,
CurTarDiff,
Slope,
Quit = 0,
DependencyCheck,
NxtVar;
/*Declare a temporary array variable called Rollback based on the Measures dimension */
ARRAY Rollback [Measures];
/* Fix on the appropriate member combinations and perform the goal-seeking calculation*/
FIX(Budget, Jan, Product, Market)
LOOP (35, Quit)
Sales (Rollback = Budget;
AcceptableError = Target * (AcceptableErrorPercent);
PriorVar = Sales;
PriorTar = Profit;
Sales = Sales + PctNewVarChange * Sales;);
CALC DIM(Measures);
Sales (DependencyCheck = PriorVar - PriorTar;
IF(DependencyCheck <> 0) CurTarDiff = Profit - Target;
IF(@ABS(CurTarDiff) > @ABS(AcceptableError))
Slope = (Profit - PriorTar) / (Sales - PriorVar);
NxtVar = Sales - (CurTarDiff / Slope);
PctNewVarChange = (NxtVar - Sales) / Sales;
ELSE
Quit = 1;
ENDIF;
ELSE
Budget = Rollback;
Quit = 1;
ENDIF;);
ENDLOOP
CALC DIM(Measures);
ENDFIXEssbase realiza los siguientes cálculos:
-
Declara las variables temporales necesarias mediante el comando VAR. Cuando corresponda, se establecen los valores iniciales.
-
Declara una matriz unidimensional denominada Rollback para almacenar los valores de Budget.
El tamaño del rollback se basa en el número de miembros de la dimensión Measures.
-
Correcciones en Jan -> Valores de presupuesto para todos los miembros de producto y mercado.
-
Asegura que los comandos entre LOOP y ENDLOOP se sincronicen 35 veces para cada combinación de miembros. Sin embargo, si la variable Salir se establece en 1, el LOOP se interrumpe y el cálculo continúa después del comando ENDLOOP.
-
Recorre las combinaciones de miembros y realiza los siguientes cálculos:
-
Coloca el valor Presupuesto -> Ventas en la variable de matriz temporal Rollback.
-
Calcula el error aceptable multiplicando el valor Objetivo (15000) por el valor AcceptableErrorPercent (0,001). El resultado se coloca en la variable AcceptableError.
-
Mantiene el valor de Ventas actual y coloca el valor de Ventas para la combinación de miembros actual en la variable temporal PriorVar.
-
Mantiene el valor de Ganancia actual y coloca el valor de Ganancia para la combinación de miembros actual en la variable temporal PriorTar.
-
Calcula un nuevo valor de Ventas multiplicando el valor de PctNewVarChange (0.1) por el valor de Ventas actual y agregando el valor de Ventas actual. El resultado se coloca en Ventas.
-
Calcula y consolida la dimensión Measures.
-
Resta el valor PriorTar del valor PriorVar y coloca el resultado en la variable temporal DependencyCheck.
-
Comprueba que DependencyCheck no es 0 (cero) (IF).
-
Si DependencyCheck no es 0, resta el valor Objetivo (15000) de la ganancia actual y coloca el resultado en la variable temporal CurTarDiff.
El comando IF comprueba si el valor absoluto (independientemente del signo + o –) de CurTarDiff es mayor que el valor absoluto de AcceptableError:
-
Si es mayor que AcceptableError, calcula las variables temporales Slope, NxtVar y PctNewVarChange.
-
Si no es mayor que AcceptableError, rompe el comando LOOP estableciendo el valor de Salir en 1. El cálculo continúa después del comando ENDLOOP.
-
-
Si DependencyCheck es 0, coloca el valor en la matriz Rollback en Budget. Essbase rompe el comando LOOP estableciendo el valor de Salir en 1. El cálculo continúa después del comando ENDLOOP.
-
-
-
Calcula y consolida la dimensión Measures.
Los resultados del producto 100-10:
Product, Market, Budget Jan
Profit 15,000.00
Margin 32,917.00
Sales 52,671.50
COGS 19,755.00
Total Expenses 17,917.00
Marketing 3,515.00
Payroll 14,402.00
Misc 0
Inventory Label Only member
Ratios Label Only member
Margin % 28.47839913
Profit % 62.49489762