Recherche d'objectifs à l'aide de la commande LOOP
Cet exemple de script de calcul Essbase montre comment calculer la valeur de vente que vous devez atteindre pour obtenir un certain bénéfice sur un produit spécifique. Dans ce cas, le script de calcul ajuste la valeur Budget de Sales pour atteindre un objectif de 15 000 bénéfices pour Jan.
Comme indiqué dans la hiérarchie ci-dessous, supposons qu'aucun membre ne soit marqué comme Calcul dynamique et que le membre Bénéfice par once (sous Ratios dans la dimension Mesures) ne soit pas inclus dans le calcul.
Figure 24-4 Dimension Mesures

Supposons que, avant d'exécuter le script de calcul de recherche d'objectifs, les valeurs de données sont les suivantes :
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.58Exemple de script:
/* 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 effectue les calculs suivants :
-
Déclare les variables temporaires requises à l'aide de la commande VAR. Le cas échéant, les valeurs initiales sont définies.
-
Déclare un tableau unidimensionnel appelé Rollback pour stocker les valeurs Budget.
La taille de l'annulation (rollback) dépend du nombre de membres dans la dimension Measures.
-
Corrige les valeurs Jan -> Budget pour tous les membres Product et Market.
-
Vérifie que les commandes comprises entre LOOP et ENDLOOP sont cyclées 35 fois pour chaque combinaison de membres. Toutefois, si la variable Quit est définie sur 1, la boucle est interrompue et le calcul se poursuit après la commande ENDLOOP.
-
Parcourt les combinaisons de membres en effectuant les calculs suivants :
-
Place la valeur Budget -> Sales dans la variable de tableau temporaire Rollback.
-
Calcule l'erreur acceptable en multipliant la valeur cible (15000) par la valeur AcceptableErrorPercent (0.001). Le résultat est placé dans la variable AcceptableError.
-
Conserve la valeur Sales actuelle et place la valeur Sales de la combinaison de membres actuelle dans la variable temporaire PriorVar.
-
Conserve la valeur Profit actuelle et place la valeur Profit pour la combinaison de membres actuelle dans la variable temporaire PriorTar.
-
Calcule une nouvelle valeur Sales en multipliant la valeur PctNewVarChange (0,1) par la valeur Sales actuelle et en ajoutant la valeur Sales actuelle. Le résultat est placé dans Sales.
-
Calcule et consolide la dimension Mesures.
-
Soustrait la valeur PriorTar de la valeur PriorVar et place le résultat dans la variable temporaire DependencyCheck.
-
Vérifie que DependencyCheck n'est pas égal à 0 (zéro) (IF).
-
Si DependencyCheck n'est pas égal à 0, soustrait la valeur cible (15000) du profit actuel et place le résultat dans la variable temporaire CurTarDiff.
La commande IF vérifie si la valeur absolue (quel que soit le signe + ou -) de CurTarDiff est supérieure à la valeur absolue de AcceptableError :
-
Si la valeur est supérieure à AcceptableError, calcule les variables temporaires Slope, NxtVar et PctNewVarChange.
-
Si elle n'est pas supérieure à AcceptableError, la commande LOOP est interrompue en définissant la valeur Quit sur 1. Le calcul se poursuit après la commande ENDLOOP.
-
-
Si DependencyCheck a la valeur 0, la valeur du tableau d'annulation est placée dans Budget. Essbase rompt la commande LOOP en définissant la valeur Quit sur 1. Le calcul se poursuit après la commande ENDLOOP.
-
-
-
Calcule et consolide la dimension Mesures.
Les résultats pour le produit 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