Accessing predefined substitution variables in Business Rules
Hi, I can't seem to find a method in the api that accepts a substitutionvariable object and returns the string value of that substitution variable. Or just get a dictionary of all predefined substitution variables and their values.
Thank you Jack, that is super useful! I also managed to find what I wanted based on that object you provided in the api details. Pasting a snippet below for anyone reading.
Unfortunately it didn't contain what I was searching for now. I was hoping a dynamic calc could somehow pull cube view substitution variables from the cube view it is calculated in, but seems that it is not the case.
Dim instance As New SubstVarSourceInfoFactory
Dim dbConnFW As DbConnInfo = BRApi.Database.CreateFrameworkDbConnInfo(si)
Dim dbConnAppOrFW As DbConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
Dim isSystemLevel As Boolean = False
Dim value As SubstVarSourceInfo
value = instance.GetOrCreateSubstVarSourceInfo(dbConnFW, dbConnAppOrFW, isSystemLevel)
If you're doing a Dynamic Calc, what you could do is actually using a custom GetDataCell function. This way, you don't need to worry about resolving expansions yourself - you just pass the variables you need as arguments.
This is a woefully undocumented corner of the platform, but it's actually quite cool. In a Finance BR (called "MyFinanceBR" in this case), use the relevant FinanceFunctionType block:
Case Is = FinanceFunctionType.DataCell
If args.DataCellArgs.FunctionName.XFEqualsIgnoreCase("MyFunction") Then
api.LogMessage(args.DataCellArgs.NameValuePairs.Keys(0))
api.LogMessage(args.DataCellArgs.NameValuePairs.Values(0))
Return 1
End If
Then in your CubeView, use the expanded syntax (sadly it doesn't seem to work with the condensed one)
Result:
note how I had to put square brackets around my variable, that's because otherwise spaces and special chars will wreak havoc on the expansion.
In terms of performance, I *think* this strategy might be a bit faster than opening db connections in XFBRs, but I could be wildly wrong.