Ricerca di obiettivi mediante il comando LOOP

In questo esempio di script di calcolo Essbase viene illustrato come calcolare il valore di vendita che è necessario raggiungere per ottenere un determinato profitto su un prodotto specifico. In questo caso, lo script di calcolo regola il valore del budget delle vendite per raggiungere un obiettivo di 15.000 profitti per gennaio.

Come mostrato nella gerarchia riportata di seguito, si supponga che nessun membro sia contrassegnato come Calcolo dinamico e che il membro Profitto per oncia (sotto Rapporti nella dimensione Misure) non sia incluso nel calcolo.

Figura 24-4 Misure Dimensione


Misura la dimensione simile a quella di Sample Basic, ma senza Profit Per Oncia e senza Dynamic Calc.

Si supponga che, prima di eseguire lo script di calcolo per la ricerca di obiettivi, i valori dei dati siano i seguenti:

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

Script di esempio:

/* 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 esegue i calcoli riportati di seguito.

  1. Dichiara le variabili temporanee obbligatorie utilizzando il comando VAR. Se del caso, vengono impostati i valori iniziali.

  2. Dichiara un array unidimensionale denominato Rollback per memorizzare i valori del budget.

    La dimensione del rollback si basa sul numero di membri nella dimensione Misure.

  3. Correzioni sui valori Jan -> Budget per tutti i membri Product e Market.

  4. Garantisce che i comandi tra LOOP e ENDLOOP vengano eseguiti in cicli per 35 volte per ogni combinazione di membri. Tuttavia, se la variabile Quit è impostata su 1, il LOOP viene interrotto e il calcolo continua dopo il comando ENDLOOP.

  5. Esegue il ciclo delle combinazioni di membri eseguendo i calcoli riportati di seguito.

    1. Posiziona il valore Budget -> Vendite nella variabile array temporanea Rollback.

    2. Calcola l'errore accettabile moltiplicando il valore Target (15000) per il valore AcceptableErrorPercent (0,001). Il risultato viene inserito nella variabile AcceptableError.

    3. Conserva il valore di vendita corrente e inserisce il valore di vendita per la combinazione di membri corrente nella variabile temporanea Valore precedente.

    4. Conserva il valore Profitto corrente e inserisce il valore Profitto per la combinazione di membri corrente nella variabile temporanea PriorTar.

    5. Calcola un nuovo valore di vendita moltiplicando il valore PctNewVarChange (0,1) per il valore di vendita corrente e aggiungendo il valore di vendita corrente. Il risultato viene inserito in Vendite.

    6. Calcola e consolida la dimensione Misure.

    7. Sottrae il valore PriorTar dal valore PriorVar e inserisce il risultato nella variabile temporanea DependencyCheck.

    8. Verifica che DependencyCheck non sia 0 (zero) (IF).

      • Se DependencyCheck non è 0, sottrae il valore Target (15000) dal Profitto corrente e inserisce il risultato nella variabile temporanea CurTarDiff.

        Il comando IF controlla se il valore assoluto (indipendentemente dal segno + o –) di CurTarDiff è maggiore del valore assoluto di AcceptableError:

        • Se è maggiore di AcceptableError, calcola le variabili temporanee Slope, NxtVar e PctNewVarChange.

        • Se non è maggiore di AcceptableError, interrompe il comando LOOP impostando il valore Quit su 1. Il calcolo continua dopo il comando ENDLOOP.

      • Se DependencyCheck è 0, il valore dell'array Rollback viene inserito in Budget. Essbase interrompe il comando LOOP impostando il valore Esci su 1. Il calcolo continua dopo il comando ENDLOOP.

  6. Calcola e consolida la dimensione Misure.

I risultati del prodotto 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