In the rules for many cubes we work with there are conditional feeders. These often cause us problems where the evaluated value changes from a zero to a non-zero value and the fed cell does not get initiated and therefore the rule does not calculate.
Background on Feeders
As you would undoubtedly be aware, TM1 is an in memory application and extremely efficient with utilising that memory. It is also blindingly fast. one of the primary reasons for this is that after Skipcheck is enabled, only cells that are required are initiated for use. This happens when either an n level cell has data loaded into it, or a rollup occurs of a cell with data in it or when a feeder opens a cell so a rule can calculate into it.
Usually where we have a conditional rule, we need to have the inverse of that as a conditional feeder. For example you might have a rule in a SalesCommission cube like:
[‘Commissions’] = N:[‘Sales’] * db(‘CommissionRates’, !product, !month);
Here Commissions should be fed from Sales, but only if the commission rate for the product in the month where the sale occurs is non-zero.
This can be accomplished by a feeder of the form:
[‘Sales’] => db( cubename, !salesperson, !product, !month, ‘Commissions’);
Here, cubename needs to be a conditional expression that results in a blank if the corresponding commission rate is zero. Since a blank cube name causes the feeder to be ignored, the required effect is produced.
Thus, if we insert a conditional expression in place of cubename, then the complete feeder would read:
[‘Sales’] => db( if( db(‘CommissionRates’, !product, !month ) = 0, ‘ ‘, ‘SalesBySalesperson’), !salesperson, !product, !month, ‘Commissions’);
The problem arises when the commission rates change. If a commission rate were to change from zero to a non-zero value, the required feeder would not be initiated, resulting in a cell that should have a value being left as zero.
This could be overcome by writing a feeder in the CommissionRates cube that fed all sales people, however this would result in over feeding.
Another alternative is to either:
- resave the rules for the SalesCommission cube
- executing a CubeProcessFeeders for the Sales cube from a Turbo Integrator process
- restarting the TM1 server
The most efficient of these is the CubeProcessFeeders TI process.
For further discussion on conditional feeders please see this post.
Syntax of CubeProcessFeeders
CubeProcessFeeders ( cubename ); where:
cubename is the name of your cube.
Example of CubeProcessFeeders
CubeProcessFeeders ( ‘SalesCommission ‘);