We have two TM1 remote servers running on the same admin server. We would like to read the data from a cube in remote server A and store it into a cube on Remote Server B.
At first, we considered replication. Several issues with that: 1) The replication architecture is less than 100% stable and reliable according to the scuttlebutt on both this Forum and others and 2) we really don't want to clutter up remote server B with copies of objects from remote server A. Some of the source cubes are extremely large (multiple GB) and we don't want to use up that much memory either. All we want to do is read the data (actually just a few slices) and store it in a cube on remote server B. (BTW, the cubes share common elements and where they are different, we have mappings we will use to translate.)
We've been playing around with TI ODBO. We've been able to build a TI process on remote server B which connects to a cube on remote server A and reads the data, but we're having issues with it.
As some of you may know, the settings on the first three tabs in the TI ODBO process (Connection, Load ODBO Cube and Cube Dimension) drive the contents of the 4th tab (MDX Query) and also create generated code in the Prolog, Metadata, Data and Epilog tabs of the TI process. Some settings also cause the dimensions and cubes from the source remote server (A) to be re-created in the target remote server (B), which we want to avoid. What we envision happening is reading a slice of a source cube and create some logic in the data tab to perform some element-mappings and then post the data to the target cube. This means we need the MDX query to return one row of data per combination of leaf level elements
From what I have been able to learn by playing around with the settings (the documentation leave much to be desired), the only way to avoid getting a lot of generated code and also avoid re-creating objects in the target server is to use the "No Action" setting on the Load ODBO cube tab and to use "Data Load Only" on the Cube Dimensions tab.
The default MDX statement initially generated by the process is as follows:
Code: Select all
WITH
SET [QuestScenario Set] AS
'{ [QuestScenario].DEFAULTMEMBER }'
SET [QuestAccount Set] AS
'{ [QuestAccount].DEFAULTMEMBER }'
SET [QuestActivityCenter Set] AS
'{ [QuestActivityCenter].DEFAULTMEMBER }'
SET [QuestEmployeeOpCenter Set] AS
'{ [QuestEmployeeOpCenter].DEFAULTMEMBER }'
SET [QuestPeriod Set] AS
'{ [QuestPeriod].DEFAULTMEMBER }'
SET [QuestProgram Set] AS
'{ [QuestProgram].DEFAULTMEMBER }'
SET [QuestProjectOpCenter Set] AS
'{ [QuestProjectOpCenter].DEFAULTMEMBER }'
SET [QuestProjectType Set] AS
'{ [QuestProjectType].DEFAULTMEMBER }'
SET [QueSTView Set] AS
'{ [QueSTView].DEFAULTMEMBER }'
SET [QuestSubmissionVersion Set] AS
'{ [QuestSubmissionVersion].DEFAULTMEMBER }'
SELECT NON EMPTY {
[QuestScenario Set] * [QuestAccount Set] * [QuestActivityCenter Set] * [QuestEmployeeOpCenter Set] * [QuestPeriod Set] * [QuestProgram Set] * [QuestProjectOpCenter Set] * [QuestProjectType Set] * [QueSTView Set]
* [QuestSubmissionVersion Set]
} ON COLUMNS FROM [QueSTAnalysis]
Code: Select all
WITH
SET [QuestScenario Set] AS
'{ FILTER( { [QuestScenario].MEMBERS }, ISLEAF( [QuestScenario].CURRENTMEMBER ) ) }'
SET [QuestAccount Set] AS
'{ FILTER( { [QuestAccount].MEMBERS }, ISLEAF( [QuestAccount].CURRENTMEMBER ) ) }'
SET [QuestActivityCenter Set] AS
'{ FILTER( { [QuestActivityCenter].MEMBERS }, ISLEAF( [QuestActivityCenter].CURRENTMEMBER ) ) }'
SET [QuestEmployeeOpCenter Set] AS
'{ FILTER( { [QuestEmployeeOpCenter].MEMBERS }, ISLEAF( [QuestEmployeeOpCenter].CURRENTMEMBER ) ) }'
SET [QuestPeriod Set] AS
'{ FILTER( { [QuestPeriod].MEMBERS }, ISLEAF( [QuestPeriod].CURRENTMEMBER ) ) }'
SET [QuestProgram Set] AS
'{ FILTER( { [QuestProgram].MEMBERS }, ISLEAF( [QuestProgram].CURRENTMEMBER ) ) }'
SET [QuestProjectOpCenter Set] AS
'{ FILTER( { [QuestProjectOpCenter].MEMBERS }, ISLEAF( [QuestProjectOpCenter].CURRENTMEMBER ) ) }'
SET [QuestProjectType Set] AS
'{ FILTER( { [QuestProjectType].MEMBERS }, ISLEAF( [QuestProjectType].CURRENTMEMBER ) ) }'
SET [QueSTView Set] AS
'{ FILTER( { [QueSTView].MEMBERS }, ISLEAF( [QueSTView].CURRENTMEMBER ) ) }'
SET [QuestSubmissionVersion Set] AS
'{ [QuestSubmissionVersion].[FY10 Provisional Submission Pass 3 Official] }'
SELECT NON EMPTY { [QuestScenario Set] * [QuestAccount Set] * [QuestActivityCenter Set] * [QuestEmployeeOpCenter Set] *
[QuestPeriod Set] * [QuestProgram Set] * [QuestProjectOpCenter Set] * [QuestProjectType Set] *
[QueSTView Set] * [QuestSubmissionVersion Set]
} ON COLUMNS FROM [QueSTAnalysis]
All of this to ask the following questions ...
1) Are we using the right settings on the TM1 ODBO tabs?
2) How can we get one record per cell value in the MDX query? We need each cell value from the source so that we can process the values through the mappings and then post the values to the target cube.
3) We have set local variables in the Prolog tab to control the data source settings for ODBC sources. ODBO sources have similar local variables with "ODBO" in their names. However, I cannot find a variable which allows you to set the MDX query string. Does an ODBO TI process use the same variable DataSourceQuery for MDX queries (this variable is used in ODBC TI processes).
4) Anyone have any alternate techniques to achieve the same overall results?