LOOP 명령을 사용하여 목표 찾기

Essbase 계산 스크립트 예에서는 특정 제품에 대한 특정 이익을 얻기 위해 도달해야 하는 판매 값을 계산하는 방법을 보여줍니다. 이 경우 계산 스크립트는 1월의 15,000 Profit 목표에 도달하도록 Sales의 예산 값을 조정합니다.

아래 계층에 표시된 것처럼 동적 계산 태그가 지정된 멤버가 없으며 측정항목 차원의 비율 아래에 있는 온스당 이익 멤버가 계산에 포함되지 않는다고 가정합니다.

그림 24-4 측정 치수


Sample Basic과 유사하지만 온스당 이익 및 동적 계산이 없는 차원을 측정합니다.

목표 탐색 계산 스크립트를 실행하기 전에 데이터 값은 다음과 같다고 가정합니다.

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

예제 스크립트:

/* 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는 다음 계산을 수행합니다.

  1. VAR 명령을 사용하여 필요한 임시 변수를 선언합니다. 해당되는 경우 초기 값이 설정됩니다.

  2. 예산 값을 저장하기 위해 롤백이라는 1차원 배열을 선언합니다.

    롤백 크기는 측정항목 차원의 멤버 수를 기반으로 합니다.

  3. 모든 제품 및 시장 구성원에 대한 1월 -> 예산 값에 대한 수정입니다.

  4. LOOP와 ENDLOOP 사이의 명령이 각 멤버 조합에 대해 35배 순환되도록 합니다. 그러나 Quit 변수를 1로 설정하면 LOOP가 손상되고 ENDLOOP 명령 이후에 계산이 계속됩니다.

  5. 다음 계산을 수행하여 멤버 조합을 순환합니다.

    1. 임시 배열 롤백 변수에 Budget -> Sales 값을 배치합니다.

    2. 대상 값(15000)에 AcceptableErrorPercent 값(0.001)을 곱하여 허용 가능한 오류를 계산합니다. 결과는 AcceptableError 변수에 배치됩니다.

    3. 현재 Sales 값을 유지하고 PriorVar 임시 변수에 현재 멤버 조합의 Sales 값을 배치합니다.

    4. 현재 Profit 값을 유지하고 PriorTar 임시 변수에 현재 멤버 조합의 Profit 값을 배치합니다.

    5. PctNewVarChange 값(0.1)에 현재 판매 값을 곱한 다음 현재 판매 값을 추가하여 새 판매 값을 계산합니다. 그 결과는 Sales에 있습니다.

    6. 측정항목 차원을 계산하고 통합합니다.

    7. PriorVar 값에서 PriorTar 값을 빼고 결과를 DependencyCheck 임시 변수에 배치합니다.

    8. DependencyCheck가 0(영)(IF)이 아닌지 확인합니다.

      • DependencyCheck가 0이 아닌 경우 현재 Profit에서 대상 값(15000)을 빼고 결과를 CurTarDiff 임시 변수에 배치합니다.

        IF 명령은 CurTarDiff의 절대값(+ 또는 – 기호와 무관)이 AcceptableError의 절대값보다 큰지 확인합니다.

        • AcceptableError보다 크면 경사, NxtVar 및 PctNewVarChange 임시 변수를 계산합니다.

        • AcceptableError보다 크지 않은 경우 Quit 값을 1로 설정하여 LOOP 명령을 중단합니다. ENDLOOP 명령 이후에 계산이 계속됩니다.

      • DependencyCheck가 0이면 롤백 배열의 값을 Budget에 배치합니다. Essbase는 [종료] 값을 1로 설정하여 LOOP 명령을 중단합니다. ENDLOOP 명령 이후에 계산이 계속됩니다.

  6. 측정항목 차원을 계산하고 통합합니다.

제품 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