El enfoque Member Script and Value

Guardar datos entre data units en OneStream

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)
Filtro de tiempo en data units

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.

Cell status storage type en OneStream

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.