unidades de datos de OneStream requiere un enfoque controlado que preserve los datos, valide el destino y registre el resultado antes de la limpieza.

Cómo guardar entre unidades de datos de OneStream

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

Validación de escrituras entre unidades de datos

Al escribir entre unidades de datos de OneStream, valide cada member script antes de enviar la lista. Compruebe Cube, Entity, Scenario, Time, View, Account, Flow, Origin, IC y las dimensiones definidas por el usuario en la aplicación de destino. Una intersección inválida puede hacer que la llamada por lotes devuelva un error, por lo que conviene registrar el member script y el registro de origen relacionado.

Para cargas más grandes entre unidades de datos de OneStream, cree lotes de tamaño controlado, registre la cantidad de elementos y revise el XFResult. Pruebe con estados de workflow y roles de seguridad representativos antes de producción. Concilie las unidades de datos de OneStream afectadas con los totales de origen después de cada ejecución.

Proteja las unidades de datos de OneStream con los privilegios mínimos de la cuenta de servicio y supervise las unidades de datos de OneStream para detectar intersecciones rechazadas o cambios inesperados de NoData. Documente la recuperación de las unidades de datos de OneStream para resolver fallos parciales sin cambiar la lógica original.

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.