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

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.58Exemplo 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);
ENDFIXO Essbase executa os seguintes cálculos:
-
Declara as variáveis temporárias necessárias usando o comando VAR. Quando apropriado, os valores iniciais são definidos.
-
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.
-
Correções nos valores Jan -> Budget para todos os membros Product and Market.
-
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.
-
Alterna entre as combinações de membros, realizando os seguintes cálculos:
-
Coloca o valor Budget -> Sales na variável de array temporário Rollback.
-
Calcula o erro aceitável, multiplicando o valor de Destino (15000) pelo valor AcceptableErrorPercent (0,001). O resultado é colocado na variável AcceptableError.
-
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.
-
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.
-
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.
-
Calcula e consolida a dimensão Medidas.
-
Subtrai o valor PriorTar do valor PriorVar e insere o resultado na variável temporária DependencyCheck.
-
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.
-
-
-
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