Procurando objetivo usando o comando LOOP

Este exemplo de script de cálculo do Essbase mostra como calcular o valor de vendas que você deve alcançar para obter um determinado lucro em um produto específico. Nesse caso, o script de cálculo ajusta o valor do Orçamento de Vendas para atingir uma meta de 15.000 Lucros para Jan.

Conforme mostrado na hierarquia abaixo, suponha que nenhum membro esteja marcado como Cálculo Dinâmico e que o membro Lucro por Onça (em Índices na dimensão Medidas) não esteja incluído no cálculo.

Figura 24-4 Dimensão de Medidas


Dimensão de medidas semelhante à da Amostra Básica, mas sem Lucro por Onça e sem Cálculo Dinâmico.

Suponha que, antes de executar o script de cálculo de busca de metas, os valores de dados sejam:

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

Exemplo 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

O Essbase executa os seguintes cálculos:

  1. Declara as variáveis temporárias necessárias usando o comando VAR. Quando apropriado, os valores iniciais são definidos.

  2. Declara uma matriz unidimensional denominada Rollback para armazenar os valores de Orçamento.

    O tamanho do Rollback é baseado no número de membros na dimensão Medidas.

  3. Correções nos valores Jan -> Budget para todos os membros Product and Market.

  4. Garante que os comandos entre LOOP e ENDLOOP sejam reiniciados 35 vezes para cada combinação de membros. Se, no entanto, a variável Quit for definida como 1, o LOOP será quebrado e o cálculo continuará após o comando ENDLOOP.

  5. Alterna entre as combinações de membros, realizando os seguintes cálculos:

    1. Coloca o valor Budget -> Sales na variável de array temporário Rollback.

    2. Calcula o erro aceitável, multiplicando o valor de Destino (15000) pelo valor AcceptableErrorPercent (0,001). O resultado é colocado na variável AcceptableError.

    3. Retém o valor de Vendas atual e coloca o valor de Vendas para a combinação de membros atual na variável temporária PriorVar.

    4. Retém o valor de Lucro atual e insere o valor de Lucro para a combinação de membros atual na variável temporária PriorTar.

    5. Calcula um novo valor de Vendas multiplicando o valor de PctNewVarChange (0.1) pelo valor de Vendas atual e adicionando o valor de Vendas atual. O resultado é colocado em Vendas.

    6. Calcula e consolida a dimensão Medidas.

    7. Subtrai o valor PriorTar do valor PriorVar e insere o resultado na variável temporária DependencyCheck.

    8. Verifica se DependencyCheck não é 0 (zero) (IF).

      • Se DependencyCheck não for 0, subtrairá o valor Alvo (15000) do Lucro atual e colocará o resultado na variável temporária CurTarDiff.

        O comando IF verifica se o valor absoluto (independentemente do sinal de + ou –) do CurTarDiff é maior que o valor absoluto do AcceptableError:

        • Se maior que AcceptableError, calcula as variáveis temporárias Slope, NxtVar e PctNewVarChange.

        • Se não for maior que AcceptableError, quebra o comando LOOP definindo o valor de Quit como 1. O cálculo continua após o comando ENDLOOP.

      • Se DependencyCheck for 0, coloque o valor no array Rollback no Orçamento. O Essbase quebra o comando LOOP definindo o valor de Sair como 1. O cálculo continua após o comando ENDLOOP.

  6. Calcula e consolida a dimensão Medidas.

Resultados para o produto 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