My yield numbers are actually stored as a number between 0 and 100. And not between 0 and 1 which i guess are more common when expressed as percentage.
The reason for this is some limitations in our 3rd party reporting charts.
Any way this is how i made the custom aggregation function that will work with both variants:
Create a c# class library.
Add a reference to this dll (ADOMD.Net interfaces):
C:\Program Files\Microsoft Analysis Services\AS OLEDB\10\msmgdsrv.dll
Add a class named ASUtils with the following content:
namespace ASUtils { using System; using Microsoft.AnalysisServices.AdomdServer; public class Multiplication { [SafeToPrepare(true)] public static Nullable<double> Multiply(Set inputSet, Expression inputExpression, double divider, bool excludeZeroValues) { Nullable<double> num = null; bool first = true; foreach (Tuple tuple in inputSet.Tuples) { MDXValue mdxValue = inputExpression.Calculate(tuple); bool isEmpty = (mdxValue.ToChar() == 0x00); if (!isEmpty) { double value = mdxValue.ToDouble(); if (value != 0 || (value == 0 && excludeZeroValues == false)) { if (first == true) { num = value / divider; first = false; } else { num *= value / divider; } } } } return num * divider; } } }I did not find any built in functions that could check if a value was empty or not, but this seems to work:
bool isEmpty = (mdxValue.ToChar() == 0x00);
Any other solutions out there ?
Build the project, then in your AS2008 cube project, add a reference to the new class library.
In your cube, under calculations. Add a new calculated member named YieldM with this code:
ASUtils.Multiply([Process].[ProcessNoGroup].Children,[Measures].[Yield], 100.0, false)
[Process] = Dimension
[ProcessNoGroup] = Hierarchy
[Measures].[Yield] = Measure containg numbers between 0 and 100.
If the measure contains numbers beteen 0 and 1, then you can change the multiplyer to 1 like:
ASUtils.Multiply([Process].[ProcessNoGroup].Children,[Measures].[Yield], 1.0, false)
Empty values are always eliminated from the multiply.
You can also exclude 0 (zero) values by changing the last parameter to true.
So if we now look at the yield measure over time and process, we have this test data:
| 
Time Dimension | 
Process Dimension | 
Yield | 
| 
W01 | 
Process1 | 
94.88 | 
| 
W01 | 
Process2 | 
96.42 | 
| 
W01 | 
Process3 | 
95.03 | 
| 
W02 | 
Process1 | 
98.86 | 
| 
W02 | 
Process2 | 
96.42 | 
| 
W02 | 
Process3 | 
94.03 | 
When we aggregate this by week and look at our calculated YieldM measure:
| 
Time Dimension | 
YieldM | 
Formula | 
| 
W01 | 
86.93 | 
(94.88*96.42*95.03) | 
| 
W01 | 
89.63 | 
(98.86*96.42*94.03) | 
And voila, our custom aggregation is working as it should.
 
 
 
No comments:
Post a Comment