Zielsuche mit dem LOOP-Befehl

Dieses Beispiel für ein Essbase-Berechnungsskript zeigt, wie Sie den Umsatzwert berechnen, den Sie erreichen müssen, um einen bestimmten Gewinn für ein bestimmtes Produkt zu erzielen. In diesem Fall passt das Berechnungsskript den Budgetwert des Umsatzes an, um das Ziel von 15.000 Gewinn für Jan zu erreichen.

Wie in der folgenden Hierarchie dargestellt, wird davon ausgegangen, dass keine Elemente als Dynamische Berechnung gekennzeichnet sind und dass das Element "Gewinn pro Unze" (unter "Verhältnisse in der Measures-Dimension") nicht in der Berechnung enthalten ist.

Abbildung 24-4 Kennzahlendimension


Kennzahlendimension ähnlich der von Sample Basic, jedoch ohne Profit pro Unze und ohne dynamische Berechnung.

Angenommen, vor der Ausführung des Berechnungsskripts für die Zielsuche lauten die Datenwerte wie folgt:

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

Beispielskript:

/* 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 führt die folgenden Berechnungen aus:

  1. Deklariert die erforderlichen temporären Variablen mit dem Befehl VAR. Gegebenenfalls werden die Ausgangswerte festgelegt.

  2. Deklariert ein eindimensionales Array mit dem Namen Rollback, um die Budgetwerte zu speichern.

    Die Rollback-Größe basiert auf der Anzahl der Elemente in der Measures-Dimension.

  3. Behebt die Jan -> Budgetwerte für alle Produkt- und Marktmitglieder.

  4. Stellt sicher, dass die Befehle zwischen LOOP und ENDLOOP für jede Elementkombination 35 Mal neu gestartet werden. Wenn jedoch die Variable "Quit" auf 1 eingestellt ist, wird das LOOP unterbrochen, und die Berechnung wird nach dem ENDLOOP-Befehl fortgesetzt.

  5. Durchläuft die Elementkombinationen und führt folgende Berechnungen durch:

    1. Platziert den Wert "Budget -> Sales" in der temporären Array-Variablen "Rollback".

    2. Berechnet den zulässigen Fehler, indem der Zielwert (15000) mit dem Wert AcceptableErrorPercent (0,001) multipliziert wird. Das Ergebnis wird in die Variable AcceptableError eingefügt.

    3. Behält den aktuellen Umsatzwert bei und fügt den Umsatzwert für die aktuelle Elementkombination in die temporäre Variable PriorVar ein.

    4. Behält den aktuellen Gewinnwert bei und fügt den Gewinnwert für die aktuelle Elementkombination in die temporäre Variable PriorTar ein.

    5. Berechnet einen neuen Umsatzwert, indem der Wert für "PctNewVarChange" (0,1) mit dem aktuellen Umsatzwert multipliziert und der aktuelle Umsatzwert hinzugefügt wird. Das Ergebnis wird in Sales platziert.

    6. Berechnet und konsolidiert die Measures-Dimension.

    7. Subtrahiert den PriorTar-Wert vom PriorVar-Wert und platziert das Ergebnis in die temporäre Variable DependencyCheck.

    8. Prüft, ob DependencyCheck nicht 0 (Null) (IF) ist.

      • Wenn DependencyCheck nicht 0 ist, subtrahiert der Zielwert (15000) vom aktuellen Profit und platziert das Ergebnis in die temporäre Variable CurTarDiff.

        Der Befehl IF prüft, ob der absolute Wert (unabhängig vom Zeichen + oder –) von CurTarDiff größer als der absolute Wert von AcceptableError ist:

        • Wenn dieser Wert größer als AcceptableError ist, werden die temporären Variablen Slope, NxtVar und PctNewVarChange berechnet.

        • Wenn der Wert nicht größer als AcceptableError ist, wird der LOOP-Befehl unterbrochen, indem der Wert von Quit auf 1 gesetzt wird. Die Berechnung wird nach dem ENDLOOP-Befehl fortgesetzt.

      • Wenn DependencyCheck 0 ist, setzt der Wert im Rollback-Array in Budget. Essbase unterbricht den LOOP-Befehl, indem der Wert von "Beenden" auf 1 gesetzt wird. Die Berechnung wird nach dem ENDLOOP-Befehl fortgesetzt.

  6. Berechnet und konsolidiert die Measures-Dimension.

Die Ergebnisse für Produkt 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