on ‎2016 Aug 12 8:38 PM
Dear BPC Experts,
We are working on creating a logic script that allocates budget total figures of a year among months using actual figures of 3 years earlier. (Ex. Jan. 2017 budget data should be calculated using actual data of Jan.2016,Jan.2015 & Jan.2014 / Total actual Data in 2016,2015 & 2014
We have created the attached logic script which has 2 problems:
1. Previous year can not be determined dynamically as TMVL is generating incorrect results.
2. Allocation can be done using historical data of 1 year earlier only and not 3 years.
Please advice, How we can handle those two problems.
Thanks and Best Regards
Sara Kadry
Request clarification before answering.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Dear Vadim,
Thanks for letting me know the rules to ask a question related to script logic as it is my first time to post any question in the community so I wasn't aware of the existence of such rules.
On the other side telling me exactly what is incorrect in my logic will be much more helpful than just saying that it's incorrect specially that I already mentioned that the script is generating correct results and it has only the 2 problems mentioned above.
As requested below excel screenshot demonstrates the required calculation:
I have posted the rules to save my time asking all the questions described in the rules
For example: "6. Provide FULL script that is not working (showing only part of the script without some previous scope changes can lead to misunderstanding). It's better to use some fixed character width font like Courier New to format the code text."
You posted the screenshot! Do you want me to retype your script from the screenshot?
P.S. 7. For DM scripts define what user will select/enter for DM prompts.
You have variables in your script and I have no idea about the values passed!
Etc...
1. Our BPC Version & Support Package:
2.The K2 Calculation engine used is JAVESCRIPT
3.Sales Model consists of 8 dimensions :
Category
Channel (User Defined)
Input Currency
Location (User Defined)
Product (User Defined)
Profit Center (Entity)
Time
Vehicles Values(Account)
4.The Script is to be Launched by DM Package
5.Calculation Logic: Already Described in my 1st message
6. The script is shown below:
//TOTAL in channel and location are base level members containing the un-allocated figures
//ALL is a parent member grouping all sales channels (Retail, Wholesales...etc.)
//ALLHER is a parent member grouping all products of a certain type
*XDIM_MEMBERSET PRODUCT=BAS(ALLHER)
*SELECT(%TIMES%,[MONTHNUM],TIME,[YEAR]=$INPUT_YEAR$
*FOR %TIM%=%TIMES%
*RUNALLOCATION
*FACTOR=USING/TOTAL
*DIM CATEGORY WHAT=BUDGET; WHERE=BUDGET; USING=ACTUAL; TOTAL=<<<
*DIM LOCATION WHAT=TOTAL ;WHERE=<<<; USING=BAS(ALL);TOTAL=<<<
*DIM CHANNEL WHAT=TOTAL;WHERE=BAS(ALL);USING=<<<;TOTAL=<<<
*DIM TIME WHAT=$INPUT_YEAR$ ; WHERE=[YEAR]=$INPUT_YEAR AND [MONTHNUM]=%TIM% ; USING=[YEAR]="2016" AND [MONTHNUM]=%TIM% ; TOTAL=[YEAR]="2016"
*ENDALLOCATION
*NEXT
7.The user will input the target planning year (2017)
----------------------------------------------------------------------
What I mean by generating Correct results is that it generates correct results using 1 year not 3 years which means it's a correct logic script(From the technical point of view) but not satisfying all our requirements
And sorry, can you copy/paste you real script?
I see number of typing errors in the script you post here:
*SELECT(%TIMES%,[MONTHNUM],TIME,[YEAR]=$INPUT_YEAR$ -")" missing!
*DIM TIME WHAT=$INPUT_YEAR$ ; WHERE=[YEAR]=$INPUT_YEAR AND... = "$" missing!
...
P.S. Working with script logic you have to be precisely accurate
We created a dummy base level member 2017 to carry the total planned value and below is the complete time structure:
Below is the pasted script:
*XDIM_MEMBERSET PRODUCT = BAS(ALLHER)
*SELECT(%TIMES%,[MONTHNUM],TIME,[YEAR]=$INPUT_YEAR$)
*FOR %TIM% = %TIMES%
*RUNALLOCATION
*FACTOR = USING/TOTAL
*DIM CATEGORY WHAT=Budget; WHERE=Budget ; USING=Actual ; TOTAL = <<<
*DIM LOCATION WHAT=TOTAL ; WHERE=<<<
*DIM CHANNEL WHAT=TOTAL ; WHERE= bas(ALL) ; USING=<<
*DIM TIME WHAT=$INPUT_YEAR$ ; WHERE=[YEAR]="$INPUT_YEAR$" AND [MONTHNUM] = "%TIM%" ; USING= [YEAR]="2016" AND [MONTHNUM] = "%TIM%" ; TOTAL = [YEAR]="2016"
*ENDALLOCATION
*NEXT
There is a way to get a previous year from the current year without TMVL:
First - create YINP property (1 char) in TIME dimension and fill it with Y for Year input base members (2006,2007,2008,2009...)
Then look on the following script to get a previous year in the variable %PREVY%:
//$INPUT_YEAR$=2009
*SELECT(%TID%,[TIMEID],TIME,[ID]=$INPUT_YEAR$)
//%TID%=10090100
*SELECT(%TIDSBEFORE%,[TIMEID],TIME,[TIMEID]<%TID% AND [YINP]=Y)
//%TIDSBEFORE%=10060100,10070100,10080100 - 2006,2007,2008
*SELECT(%TSAFTERINCL%,[ID],TIME,[TIMEID]>=%TIDSBEFORE% AND [YINP]=Y)
//%TSAFTERINCL%=2008,2009,2010...
*SELECT(%PREVY%,[ID],TIME,[TIMEID]=%TIDSBEFORE% AND [ID]=%TSAFTERINCL%)
//%PREVY%=2008
*XDIM_MEMBERSET TIME=%PREVY%
Same calculations can be done to calculate %PREVPREVY% and %PREVPREVPREVY% ...
Then
*RUNALLOCATION
*FACTOR=USING/TOTAL
*DIM TIME WHAT=$INPUT_YEAR$; WHERE=$INPUT_YEAR$.%MNTH%; USING=%PREVY%.%MNTH%,%PREVPREVY%.%MNTH%,%PREVPREVPREVY%.%MNTH%; TOTAL=[YEAR]="%PREVY%" AND [YEAR]="%PREVPREVY%" AND [YEAR]="%PREVPREVPREVY%" AND [YINP]=""
*ENDALLOCATION
P.S.:
*SELECT(%TID1%,[TIMEID],TIME,[ID]=%PREVY%)
*SELECT(%TIDSBEFORE1%,[TIMEID],TIME,[TIMEID]<%TID1% AND [YINP]=Y)
*SELECT(%TSAFTERINCL1%,[ID],TIME,[TIMEID]>=%TIDSBEFORE1% AND [YINP]=Y)
*SELECT(%PREVPREVY%,[ID],TIME,[TIMEID]=%TIDSBEFORE1% AND [ID]=%TSAFTERINCL1%)
*SELECT(%TID2%,[TIMEID],TIME,[ID]=%PREVPREVY%)
*SELECT(%TIDSBEFORE2%,[TIMEID],TIME,[TIMEID]<%TID2% AND [YINP]=Y)
*SELECT(%TSAFTERINCL2%,[ID],TIME,[TIMEID]>=%TIDSBEFORE2% AND [YINP]=Y)
*SELECT(%PREVPREVPREVY%,[ID],TIME,[TIMEID]=%TIDSBEFORE2% AND [ID]=%TSAFTERINCL2%)
Just tested the full script and got absolutely correct figures in the report:
*SELECT(%TID%,[TIMEID],PERIODS,[ID]=$INPUT_YEAR$)
*SELECT(%TIDSBEFORE%,[TIMEID],PERIODS,[TIMEID]<%TID% AND [YINP]=Y)
*SELECT(%TSAFTERINCL%,[ID],PERIODS,[TIMEID]>=%TIDSBEFORE% AND [YINP]=Y)
*SELECT(%PREVY%,[ID],PERIODS,[TIMEID]=%TIDSBEFORE% AND [ID]=%TSAFTERINCL%)
*SELECT(%TID1%,[TIMEID],PERIODS,[ID]=%PREVY%)
*SELECT(%TIDSBEFORE1%,[TIMEID],PERIODS,[TIMEID]<%TID1% AND [YINP]=Y)
*SELECT(%TSAFTERINCL1%,[ID],PERIODS,[TIMEID]>=%TIDSBEFORE1% AND [YINP]=Y)
*SELECT(%PREVPREVY%,[ID],PERIODS,[TIMEID]=%TIDSBEFORE1% AND [ID]=%TSAFTERINCL1%)
*SELECT(%TID2%,[TIMEID],PERIODS,[ID]=%PREVPREVY%)
*SELECT(%TIDSBEFORE2%,[TIMEID],PERIODS,[TIMEID]<%TID2% AND [YINP]=Y)
*SELECT(%TSAFTERINCL2%,[ID],PERIODS,[TIMEID]>=%TIDSBEFORE2% AND [YINP]=Y)
*SELECT(%PREVPREVPREVY%,[ID],PERIODS,[TIMEID]=%TIDSBEFORE2% AND [ID]=%TSAFTERINCL2%)
*FOR %MNTH%=JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
*XDIM_MEMBERSET TITLES=1110
*XDIM_MEMBERSET BE=BE1000
*XDIM_MEMBERSET CORPDIR=DIRECT
*XDIM_MEMBERSET INACCT=106
*XDIM_MEMBERSET PLANTYPE=BUDGET
*RUNALLOCATION
*FACTOR=USING/TOTAL
*DIM PERIODS WHAT=$INPUT_YEAR$; WHERE=$INPUT_YEAR$.%MNTH%; USING=%PREVY%.%MNTH%,%PREVPREVY%.%MNTH%,%PREVPREVPREVY%.%MNTH%; TOTAL=[YEAR]="%PREVY%" AND [YEAR]="%PREVPREVY%" AND [YEAR]="%PREVPREVPREVY%" AND [YINP]=""
*ENDALLOCATION
*NEXT
P.S. My TIME dimension is named PERIODS
| User | Count |
|---|---|
| 15 | |
| 11 | |
| 11 | |
| 4 | |
| 2 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.