El enfoque Member Script and Value
Me encontré con un problema el otro día que vale la pena documentar. Intentaba escribir en una intersección de miembros, desde un Custom Calculate Data Management Step, que estaba fuera de la Data Unit definida en ese paso de cálculo personalizado. Cuando se intenta escribir fuera de esa data unit, aparecen limitaciones que obligan a usar un enfoque distinto.
Dim strSource As String = "Cb#CAN_ACT:E#ONT_County1:C#None:S#Actual:T#2021M2:V#Periodic:A#A_69010:F#None:0#Forms:I#None"
api.Data.Calculate("Cb#CAN_ACT:E#ONT_County1:C#None:S#Actual:T#2021M3:V#Periodic:A#A_69010:F#None:0#Forms:I#None = " & strSource, True)
Si intenta usar api.Data.SetDataCell, obtendrá el mismo error.
api.Data.Calculate("Cb#CAN_ACT:E#ONT_County1:C#None:S#Actual:T#2021M3:V#Periodic:A#A_69010:F#None:0#Forms:I#None = " & strSource, True)
Solución: usar BRApi.Finance.Data.SetDataCellsUsingMemberScript
Paso 1. Declare una lista de MemberScriptAndValue. Esta contendrá todas las combinaciones de Member Script y valor que desea escribir.
Dim 1stMemScriptAndValue As New List(Of MemberScriptAndValue)
Paso 2. Declare un objeto MemberScriptAndValue. Este objeto tiene varias propiedades que se usarán para definir el Member Script, el importe y si contiene datos.
Dim msvMemScriptandValue As New MemberScriptAndValue
Paso 3. Defina las propiedades del objeto MemberScriptAndValue que acaba de crear. IsNoData es una propiedad interesante: si la establece en True, limpia el importe de la celda de datos.
msvMemScriptandValue.IsNoData = False ' If Set to True it will clear the data from the data intersection
msvMemScriptandValue.Amount = 700 'Target Member Script to be written to
msvMemScriptandValue.Script = 'Cb#CAN_ACT:E#ONT_County1:C#None:S#Actual:T#2021M3:V#Periodic:A#A_69010:F#None:0#BeforeAdj:I#None'
Paso 4. Agregue el objeto MemberScriptAndValue que acaba de definir a la lista de MemberScriptAndValue creada en el Paso 1. Si tiene múltiples scripts, puede iterar y agregarlos todos a la lista.
1stMemScriptAndValue.Add(msvMemScriptAndValue)
Paso 5. Escriba la lista de MemberScriptAndValue al cubo usando BRApi.Finance.Data.SetDataCellsUsingMemberScript. Tenga en cuenta que si alguno de sus member scripts es inválido, el proceso devolverá error.
If 1stMemScriptAndValue.Count > 0 Then
Dim objXFResult As XFResult = BRApi.Finance.Data.SetDataCellsUsingMemberScript(si, 1stMemScriptAndValue)
If Not objXFResult.BoolValue Then
Throw ErrorHandler.LogWrite(si,objXFResult.Message,String.empty))
End If
End If
Este ejemplo solo escribe una combinación única de member script y valor al cubo, sin embargo yo también lo he usado para cargar el contenido de un archivo CSV cargado por un usuario. Primero ese CSV se cargó a una tabla SQL personalizada en la base de datos de la aplicación y luego se transformó en múltiples objetos MemberScriptAndValue.
La business rule completa, con una sección adicional que muestra cómo escribir el contenido de su lista MemberScriptAndValue en el error log, se muestra a continuación.
Public Function MSV(ByVal si As SessionInfo, ByVal globals as BRGlobals, ByVal api As FinanceRuleApi, ByVal args As FinanceRulesArgs)
Try
Dim 1stMemScriptAndValue As New List(Of MemberScriptAndValue)
Dim msvMemScriptandValue As New MemberScriptAndValue
msvMemScriptandValue.IsNoData = False ' If Set to True it will clear the data from the data intersection
msvMemScriptandValue.Amount = 700 'Target Member Script to be written to
msvMemScriptandValue.Script = 'Cb#CAN_ACT:E#ONT_County1:C#None:S#Actual:T#2021M3:V#Periodic:A#A_69010:F#None:0#BeforeAdj:I#None'
1stMemScriptAndValue.Add(msvMemScriptAndValue)
If 1stMemScriptAndValue.Count > 0 Then
Dim objXFResult As XFResult = BRApi.Finance.Data.SetDataCellsUsingMemberScript(si, 1stMemScriptAndValue)
If Not objXFResult.BoolValue Then
Throw ErrorHandler.LogWrite(si, NewXFException(si,objXFResult.Message,String.empty))
End If
End If
'Write MemberScriptAndValue contents to error log
Dim logger As New Text.StringBuilder
For Each msv In 1stMemScriptAndValue
logger. AppendLine("MSV Script = " & msv.Script & " Amount = " & msv.Amount & " IsNoData = " & msv.IsNoData)
Next
brapi.ErrorLog.LogMessage(si, logger.ToString)
Return Nothing
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si,ex))
End Try
End Function
Contacto
MindStream Analytics
¿Quiere saber más sobre OneStream Software? Los consultores de MindStream Analytics están aquí para ayudarle a llevar sus consolidaciones y reportes al siguiente nivel.
