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


Dimension Mesures similaire à celle de Sample Basic, mais sans profit par once et sans calcul dynamique.

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.58

Exemple 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);
ENDFIX

Essbase effectue les calculs suivants :

  1. Déclare les variables temporaires requises à l'aide de la commande VAR. Le cas échéant, les valeurs initiales sont définies.

  2. 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.

  3. Corrige les valeurs Jan -> Budget pour tous les membres Product et Market.

  4. 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.

  5. Parcourt les combinaisons de membres en effectuant les calculs suivants :

    1. Place la valeur Budget -> Sales dans la variable de tableau temporaire Rollback.

    2. 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.

    3. Conserve la valeur Sales actuelle et place la valeur Sales de la combinaison de membres actuelle dans la variable temporaire PriorVar.

    4. Conserve la valeur Profit actuelle et place la valeur Profit pour la combinaison de membres actuelle dans la variable temporaire PriorTar.

    5. 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.

    6. Calcule et consolide la dimension Mesures.

    7. Soustrait la valeur PriorTar de la valeur PriorVar et place le résultat dans la variable temporaire DependencyCheck.

    8. 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.

  6. 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