El otro día me encontré con un problema que merece la pena comentar. Intentaba escribir en una intersección de miembros, desde un paso de cálculo de datos personalizado, que estaba fuera de la unidad de datos definida en dicho paso.
La regla de negocio financiera que se estaba ejecutando utilizaba un enfoque api.data.calculate, que lamentablemente falla cuando se intenta escribir fuera de la unidad de datos.
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 utilizar 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)
Paso 1. Atenúe la lista de MemberScriptAndValue. Esta contendrá todas las combinaciones de MemberScript y Value en las que desea escribir.
Atenúe 1stMemScriptAndValue como nueva lista (de MemberScriptAndValue)
Paso 2. Atenúe el objeto MemberScriptAndValue. Este objeto tiene varias propiedades que se usarán para definir el MemberScript, la cantidad (valor) y si contiene datos.
Atenúe msvMemScriptandValue como nuevo MemberScriptAndValue
Paso 3. Defina las propiedades del objeto MemberScriptAndValue que ha instanciado. IsNoData es una propiedad interesante; si se establece en "True", se borra la cantidad de la celda de datos.
msvMemScriptandValue.IsNoData = False ' Si se establece en Verdadero, borrará los datos de la intersección de datos.
msvMemScriptandValue.Amount = 700 'Script del miembro objetivo que se escribirá en
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 al objeto de lista MemberScriptAndValue que creó en el paso 1. Si tiene varios scripts, puede iterar entre las combinaciones de scripts de miembros y agregar cada una a su objeto de lista. Puede contener más de una definición de MemberScriptAndValue. He usado esto para almacenar cientos de combinaciones de MemberScriptAndValue definidas.
1stMemScriptAndValue.Add(msvMemScriptAndValue)
Paso 5. Escriba la lista MemberScriptAndValue en el cubo usando BRApi.Finance.Data.SetDataCellsUsingMemberScript. Tenga en cuenta que el "if then" del código a continuación devolverá un error si alguno de sus scripts de miembro es inexacto.
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 de script de miembro y valor en el cubo; sin embargo, lo usé para cargar el contenido de un archivo CSV cargado por el usuario. El archivo CSV se cargó primero en una tabla SQL personalizada en la base de datos de la aplicación. Posteriormente, el contenido de esa tabla SQL se recuperó en una tabla de datos de VB.NET almacenada en memoria. A continuación, se recorrieron las filas de la tabla de datos, generando un objeto de script de miembro y valor con las propiedades Script, Amount e isNoData definidas para cada fila de la tabla de datos. El objeto MemberScriptAndValue se agregó a la lista de objetos MemberScriptAndValue. Una vez que la tabla de datos se recorrió por completo, la lista de objetos MemberScriptAndValue se escribió en el cubo OneStream.
Tenga en cuenta que MemberScripAndValue escribe en O#Forms y tiene un tipo de almacenamiento de entrada, aunque sea el resultado de un cálculo.
A continuación se muestra la regla de negocio completa, con una sección adicional que muestra cómo escribir el contenido de su lista MemberScriptAndValue en el registro de errores.
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
¿Quiere saber más sobre OneStream Software? Los consultores de MindStream Analytics están aquí para ayudarle a optimizar sus consolidaciones e informes.
Únase a nosotros en un interesante seminario web en el que profundizaremos en las capacidades revolucionarias de OneStream Software para la gestión del rendimiento corporativo (CPM).
OneStream: El poder de una plataforma para la inteligencia financiera
OneStream CPM
OneStream se alinea con las necesidades de su negocio y cambia más rápida y fácilmente que cualquier otro producto al ofrecer una plataforma y un modelo para todas las soluciones financieras de CPM. OneStream emplea guiado Flujos de trabajo, validaciones y mapeo flexible para brindar confianza en la calidad de los datos para todas las recopilaciones y análisis al tiempo que se reduce el riesgo a lo largo de todo el proceso financiero auditable.