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
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
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.
Recursos relacionados de OneStream
Continúe con qué es OneStream, consolidación en OneStream, listas de meses, progreso de Data Management y exportaciones CSV. Consulte la documentación oficial de OneStream para detalles específicos de la versión.
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.



