Ok final attempt, seems to work
As prior setup I have a number of cubes that are relevant to the process
• LU_View_Control cube which defines the current version (essentially the source version)
• ZZ_Dimension_Use for reference to see where dimensions are used based on
http://cubewise.co.uk/tech-archive-46.p ... 8b7d125327
I also have a control cube that utilises the a parameter TI rule to pass the cube name run the generic process then loop through again . The versioncopy_control is a separate TI process with prolog:
Code: Select all
#pTargetVersion target version copy control cube
#Current version is always source for all version copy
#Executes TI process zUpdateCube_ZZ_Dimension_Use to update 'ZZ_Dimension_Use' cube
#Loops through all cubes (based on control dim }Cubes)
#Looks for cubes with Budget _Version dimension based on 'ZZ_Dimension_Use' cube
#If cube with Budget_Version dim then executes VersionCopy_BU_ALL
DimUseCube = 'ZZ_Dimension_Use';
dimname = 'Budget_Version';
TIProcess = 'VersionCopy_BU_TEST';
#Update 'ZZ_Dimension_Use' cube
ExecuteProcess('zUpdateCube_ZZ_Dimension_Use');
i = 1;
While (i<= DIMSIZ('}Cubes'));
mycubename= DIMNM('}Cubes', i);
#IGNORE control cubes
IF(subst(mycubename,1,1) @<> '}');
#Values are strings as both dims in cube are referenced as STRING
IF(stringtonumber(CellGetS(DimUseCube,mycubename,dimname)) >=1);
ExecuteProcess(TIProcess, 'pCubename', mycubename, 'pTargetVersion', pTargetVersion);
ENDIF;
ENDIF;
i=i+1;
END;
The main generic VersionCopy_BU_Test
Have maximum 6 dims for a cube. So use one of the cubes with 6 dims for ‘Datasource’ and ‘Variables’. Call all variables vDim1, vDim2…vDim6 and make sure the ‘Value’ is a string.
PROLOG
Code: Select all
myTarget = pTargetVersion;
mycubename = pCubeName;
mydimVer = 'Budget_Version';
mysourceview = 'ztmp_Source';
mytargetview = 'zTmp_Target';
mysourceversion =CellGetS('LU_View_Control','String','Current Version');
mysourcesub = 'zTmp_src'|SUBST(mycubename, 3,LONG(mycubename)-3 );
mytargetsub ='zTmp_tgt'|SUBST(mycubename, 3,LONG(mycubename)-3 );
#maximum 6 dimensions in a cube
#Find DimMax for current cube
###1. Get the Budget Version dimension's position in this cube #############
Budget_Version_Pos=0;
DimMax = 1;
DimLast = TabDim ( mycubename , 1 );
While ( DimLast @<> '' );
IF(DimLast @= 'Budget_Version');
Budget_Version_Pos=DimMax;
ENDIF;
DimMax = DimMax +1 ;
DimLast = TabDim( mycubename , DimMax);
End;
DimMax = DimMax -1;
###1. check all the versions exist################
#source version
IF(DIMIX(mydimVer,mysourceversion)=0);
PROCESSQUIT;
ENDIF;
#Target Version
IF(DIMIX(mydimVer,pTargetVersion)=0 % DTYPE(mydimVer,pTargetVersion)@='C');
PROCESSQUIT;
ENDIF;
###2. Create SOURCE view and ensure all SOURCE data is in view######################
If(ViewExists(mycubename, mysourceview)=1);
ViewDestroy(mycubename, mysourceview);
endif;
VIEWCREATE(mycubename, mysourceview);
DataSourceType = 'VIEW';
DatasourceNameForServer = mycubename;
DatasourceCubeview = mysourceview;
VIEWSETSKIPCALCS(myCubeName,mysourceview,1);
VIEWSETSKIPRULEVALUES(myCubeName,mysourceview,1);
IF (subsetexists(myDimVer,mysourcesub )=1);
subsetdestroy(myDimVer,mysourcesub );
endif;
SUBSETCREATE(myDimVer,mysourcesub);
SubsetElementInsert(myDimVer, mysourcesub, mysourceversion, 1);
VIEWSUBSETASSIGN(mycubename, mysourceview, myDimVer, mysourcesub);
###3. Create TARGET view######################
If(ViewExists(mycubename, mytargetview)=1);
ViewDestroy(mycubename, mytargetview);
endif;
VIEWCREATE(mycubename, mytargetview);
IF (subsetexists(myDimVer,mytargetsub )=1);
subsetdestroy(myDimVer,mytargetsub);
endif;
SUBSETCREATE(myDimVer,mytargetsub);
SubsetElementInsert(myDimVer, mytargetsub, pTargetVersion, 1);
VIEWSUBSETASSIGN(mycubename, mytargetview, myDimVer, mytargetsub);
###4 .Zero TARGET view ######################
###Turn logging off, zero N level values in View, Turn logging on##
CubeSetLogChanges( mycubename, 0);
ViewExtractSkipCalcsSet ( mycubename, mytargetview, 1);
ViewZeroOut( mycubename, mytargetview);
CubeSetLogChanges(mycubename, 1);
###Will want to delete VIEW and TEMP SUBSETS in Epilog#########
DATA
Code: Select all
#now use dimmax again
IF(Budget_Version_Pos = 1);
vDim1 = myTarget;
elseif(Budget_Version_Pos = 2);
vDim2 = myTarget;
elseif(Budget_Version_Pos = 3);
vDim3 = myTarget;
elseif(Budget_Version_Pos = 4);
vDim4 = myTarget;
elseif(Budget_Version_Pos = 5);
vDim5 = myTarget;
elseif(Budget_Version_Pos = 6);
vDim6 = myTarget;
ENDIF;
IF(DimMax = 3);
IF( VALUE_IS_STRING = 1 );
CellPutS( vDim4, mycubename, vDim1, vDim2, vDim3);
ELSE;
CellPutN( StringToNumber( vDim4), mycubename, vDim1, vDim2, vDim3);
ENDIF;
ELSEIF(DimMax = 4);
IF( VALUE_IS_STRING = 1 );
CellPutS( vDim5, mycubename, vDim1, vDim2, vDim3, vDim4);
ELSE;
CellPutN( StringToNumber( vDim5), mycubename, vDim1, vDim2, vDim3, vDim4 );
ENDIF;
ELSEIF(DimMax = 5);
IF( VALUE_IS_STRING = 1 );
CellPutS( vDim6, mycubename, vDim1, vDim2, vDim3, vDim4, vDim5 );
ELSE;
CellPutN(StringToNumber( vDim6), mycubename, vDim1, vDim2, vDim3, vDim4, vDim5 );
ENDIF;
ELSEIF(DimMax = 6);
IF( VALUE_IS_STRING = 1 );
CellPutS( vDim7, mycubename, vDim1, vDim2, vDim3, vDim4, vDim5,vDim6 );
ELSE;
CellPutN( StringToNumber( vDim7), mycubename, vDim1, vDim2, vDim3, vDim4, vDim5,vDim6 );
ENDIF;
ENDIF;
EPILOG
Code: Select all
######Destroy zTMP Views and SUBSETS############
mycubename = pCubeName;
mydimVer = 'Budget_Version';
mysourceview = 'ztmp_Source';
mytargetview = 'zTmp_Target';
mysourcesub = 'zTmp_src'|SUBST(mycubename, 3,LONG(mycubename)-3 );
mytargetsub ='zTmp_tgt'|SUBST(mycubename, 3,LONG(mycubename)-3 );
If(ViewExists(mycubename, mysourceview)=1);
ViewDestroy(mycubename, mysourceview);
endif;
IF (subsetexists(myDimVer,mysourcesub )=1);
subsetdestroy(myDimVer,mysourcesub );
endif;
If(ViewExists(mycubename, mytargetview)=1);
ViewDestroy(mycubename, mytargetview);
endif;
IF (subsetexists(myDimVer,mytargetsub )=1);
subsetdestroy(myDimVer,mytargetsub);
endif;