cancel
Showing results for 
Search instead for 
Did you mean: 

Prior December Period for Allocation

Former Member
0 Kudos

Hello Experts,

I am on BPC 10.1 Classic Environment NW Version.I have a requirement to allocate the data based on Prior Year December period.

User can select multiple time periods in the DM for the same year.I tested the below code in UJKT.It works fine when I pass single period say 2017.12 in the data region of UJKT

But if I pass multiple periods of the same year say TIME=2017.01,2017.12 in the data region, I get an exception message that 2017 member not defined.Please suggest for any changes to make it work for multiple Time periods.

*XDIM_ADDMEMBERSET ACCOUNT=OTHEXP.REDIST,ICREC,ICPAY

*XDIM_MEMBERSET CATEGORY=BUDGET

*XDIM_ADDMEMBERSET CATEGORY=%CATEGORY_SET%

*XDIM_MEMBERSET RPTCURRENCY=LC

*XDIM_MEMBERSET AUDITTRAIL=BAS(ALLAUDITTRAIL)

*XDIM_MEMBERSET CHANNEL=BAS(CHANNEL)

*XDIM_MEMBERSET DEPARTMENT=BAS(ALLDEPARTMENTS)

*XDIM_MEMBERSET DESTINATION=BAS(DESTINATION)

*XDIM_MEMBERSET INTERCO=BAS(ALLINTERCOMPANY)

*XDIM_MEMBERSET MARKET=BAS(MARKET)

*XDIM_MEMBERSET PRODUCTLINE=BAS(PRODUCTLINE)

*XDIM_MEMBERSET PRODUCTTYPE=BAS(PRODUCTTYPE)

*XDIM_MEMBERSET ENTITY=BAS(CP2154)

*XDIM_MEMBERSET TIME=%TIME_SET%

*SELECT(%YR1%,"[YEAR]",TIME,"[ID] = '%TIME_SET%'")

*XDIM_MEMBERSET TIME AS %PRIORDECEMBER% = TMVL(-12,%YR1%.12)

*XDIM_MEMBERSET TIME=%TIME_SET%,%PRIORDECEMBER%

*XDIM_MEMBERSET ACCOUNT=OTHEXP.REDIST,ICREC,ICPAY

*RUNALLOCATION

*FACTOR =USING/TOTAL

*DIM ACCOUNT WHAT=>>>; WHERE=OTHEXP.REDIST; USING=ICREC,ICPAY; TOTAL=ICREC,ICPAY

*DIM ENTITY WHAT=BAS(CP2154); WHERE=>>>; USING=BAS(CP2154); TOTAL=<<<

*DIM AUDITTRAIL WHAT=BAS(ALLAUDITTRAIL); WHERE=ALLOCIN; USING=BAS(ALLAUDITTRAIL); TOTAL=<<<

*DIM CATEGORY WHAT=%CATEGORY_SET%; WHERE=%CATEGORY_SET%;USING=BUDGET;TOTAL=BUDGET

*DIM TIME WHAT=%TIME_SET%; WHERE=%TIME_SET%;USING=%PRIORDECEMBER%;TOTAL=<<<

*ENDALLOCATION

Thanks

Accepted Solutions (1)

Accepted Solutions (1)

former_member186338
Active Contributor
0 Kudos

Hi Senoy,

The issue is in this line:

*SELECT(%YR1%,"[YEAR]",TIME,"[ID] = '%TIME_SET%'")

For %TIME_SET% containing 2017.01,2017.12

You will get in %YR1% 2017,2017 - 2 values!

And TMVL will not work for TMVL(-12,2017,2017.12)

Vadim

former_member186338
Active Contributor
0 Kudos

The solution is to pass to DM not only the set of TIME members but also a text variable $CURYEAR$ or $PREVYEAR$ (from PROMT(COMBOBOX...)

Then you can use this var in script.

Vadim

Former Member
0 Kudos

Hello Vadim,

Thanks for the explanation.I understood the problem.

So how can I make this work for multiple periods.

I tried using for loop too but still giving me the same exception

//Defined all other member scope

*XDIM_MEMBERSET TIME=%TIME_SET%

*FOR %T%=%TIME_SET%

*SELECT(%YR1%,"[YEAR]",TIME,"[ID] = '%T%'")

*XDIM_MEMBERSET TIME AS %PRIORDECEMBER% = TMVL(-12,%YR1%.12)

*XDIM_MEMBERSET TIME=%T%,%PRIORDECEMBER%

//ALLOCATION LOGIC

*NEXT

Thanks

former_member186338
Active Contributor
0 Kudos

You can't use the following statements inside FOR/NEXT loop:

*SELECT(...

*XDIM_MEMBERSET SOMEDIM AS %SOMEVAR%=...

The mentioned statements are processed BEFORE FOR/NEXT is processed!

Vadim

Former Member
0 Kudos

Hello Vadim,

Thanks a lot.I tried below code in the DM and is working fine.I am using $PREV_YEAR$ in the BPC script.

Any suggestion or improvement on this?

PROMPT(TEXT,%PREV_YEAR%,"Enter Previous Year",)

PROMPT(SELECTINPUT,,,,"%CATEGORY_DIM%,%TIME_DIM%")

INFO(%EQU%,=)

INFO(%TAB%,;)

TASK(/CPMB/ICDATA_LOGIC,TAB,%TAB%)

TASK(/CPMB/ICDATA_LOGIC,EQU,%EQU%)

TASK(/CPMB/ICDATA_LOGIC,SUSER,%USER%)

TASK(/CPMB/ICDATA_LOGIC,SAPPSET,%APPSET%)

TASK(/CPMB/ICDATA_LOGIC,SAPP,%APP%)

TASK(/CPMB/ICDATA_LOGIC,SELECTION,%SELECTION%)

TASK(/CPMB/ICDATA_LOGIC,REPLACEPARAM,PREV_YEAR%EQU%%PREV_YEAR%)

TASK(/CPMB/ICDATA_LOGIC,LOGICFILENAME,TEST.LGF)

Thanks,

Senoy

former_member186338
Active Contributor
0 Kudos

By the way your script is dangerous in case user will select months from different years...

If you ask user to select current year in $CURYEAR$ you can add some protection inside script logic:

User selected:

$CURYEAR$=2012

TIME=2012.02,2012.08,2013.05

Then the script will process only months in 2012

*SELECT(%CURMEMBERS%,"[ID]",TIME,"[ID]=%TIME_SET% AND [YEAR]=$CURYEAR$")

*XDIM_MEMBERSET TIME = %CURMEMBERS%

// result *XDIM_MEMBERSET TIME = 2012.02,2012.08

*XDIM_MEMBERSET TIME AS %PRIORDECEMBER% = TMVL(-12,$CURYEAR$.12)

*XDIM_MEMBERSET TIME = %PRIORDECEMBER% //just to show in UJKT the value of %PRIORDECEMBER%

// result *XDIM_MEMBERSET TIME = 2011.12

Vadim

former_member186338
Active Contributor
0 Kudos

Better to use COMBOBOX (you can provide long enough list of years):

PROMPT(COMBOBOX,%CURYEAR%,"Enter Current Year",0,,{2012,2013,2014,2015,2016,2017,2018,2019,2020})

...

TASK(/CPMB/ICDATA_LOGIC,REPLACEPARAM,CURYEAR%EQU%%CURYEAR%)

$CURYEAR$ is better for additional member restriction in my prev post.

Vadim

Former Member
0 Kudos

Hello Vadim,

I totally agree that we should have some check in the script.

I tried your solution and is working fine in all conditions.Thanks a Lot

Thanks,

Senoy

former_member186338
Active Contributor
0 Kudos

Please read additional info about PROMPT(COMBOBOX... behavior here:

Vadim

former_member186338
Active Contributor
0 Kudos

likes from topic author are useless in term of points. If some answer was useful - mark it useful!

Answers (0)