Comprender el desafío del formato en la vista de cubo de OneStream

Formato de varianza de múltiples columnas en vista de cubo de OneStream

Caso de uso: Le han pedido dar formato al color de fondo de una columna dentro de una vista de cubo, en función de la variación entre los importes de las celdas de esa columna y los importes de otra columna de datos dentro de la misma vista. Usted piensa: “No hay problema, las vistas de cubo admiten formato condicional de celdas. Hay muchas opciones dentro del cuadro de selección Cell Format. Lo tengo.”

Luego empieza a revisar las opciones dentro del constructor de sentencias If para formato condicional y se da cuenta de que no hay opciones para comparar contra otra columna. “¿Qué? ¿Cómo es posible que esto no sea una funcionalidad incorporada?”, piensa. No, no existe una opción dentro del formato de la vista de cubo para seleccionar el importe de la celda de datos de otra columna. Entonces, ¿cómo puede hacerlo? Usando un XFBR.

La solución: Cree un XFBR que recupere los importes de las celdas de datos de las 2 columnas que desea usar como base para su análisis de varianza y devuelva todos los miembros de fila que necesitan formato. Combine esa lista de nombres de miembros de fila con la función de formato de celdas “If (RowE1MemberName in” y podrá tener un formato de celdas basado en la variación entre 2 celdas de datos.

1. Cree su vista de cubo. En este ejemplo tengo cuentas en las filas y 12 meses en las columnas. Quiero que el color de fondo de la columna 2 (febrero de 2021) cambie si el importe de la celda es menor que el de la columna 1 (enero de 2021).

Data Explorer de OneStream con columnas mensuales

2. Cree un XFBR que será llamado desde el formato de celdas de la columna 2 (febrero de 2021). Este XFBR debe recorrer todos los importes de la columna 1, compararlos con los importes de la columna 2 y devolver una lista de todas las cuentas donde los importes de la columna 1 sean menores que los de la columna 2.

3. El primer paso en el XFBR es definir la lista de cuentas que necesita recorrer.

Public Function CubeViewComponent(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardStringFunctionArgs) As String
Try
'Obtener la lista descendiente de cuentas (usada en la vista de cubo) que se usará para recorrer
Dim AcctList As List(Of MemberInfo) = BRApi.Finance.Metadata.GetMemberUsingFilter(si,"CanadaAccounts","A#Income_Statement.TreeDescendantsInclusive", True)

En este caso estoy usando GetMembersUsingFilter para devolver la misma lista de cuentas que en la vista de cubo. Esto devuelve un objeto MemberInfo para cada cuenta, que se utilizará más adelante en el XFBR para obtener los nombres de los miembros de cuenta.

4. Cree la variable que contendrá la lista separada por comas de nombres de cuentas que se devolverá a la función de formato de celdas de la vista de cubo.

' Variable que contendrá todas las cuentas con un valor mayor, esto es lo que se devuelve a la sentencia de formato de la vista de cubo
'Establezca el valor como un espacio en blanco para que, si ninguna cuenta tiene un valor mayor, se devuelva un espacio en blanco y la sentencia de formato no genere error.
Dim strVarianceOff As String = ""

5. Ahora recorra todos los objetos MemberInfo usando funciones GetDataCellUsingMemberScript para devolver los importes de las celdas de las 2 columnas para cada cuenta. Evalúe cada intersección para el mes 1 frente al mes 2 y, si el importe del mes 2 es menor que el del mes 1, agregue ese nombre de cuenta a la variable de cadena.

'Recorrer cada cuenta
For Each acct As MemberInfo In AcctList
 Dim strAcctName As String = acct.Member.Name.ToString
 'Obtener valor del mes 1
 Dim objMonth1 As DataCellInfoUsingMemberScript = BRApi.Finance.Data.GetDataCellUsingMemberScript(si, "CAN_ACT", E#ONT_County1:C#None:S#Actual:T#2021M1:V#Periodic:A#" & strAcctName & ":F#None:0#For"
 Dim decMonth1 As Decimal = objMonth1.DataCellEx.DataCell.CellAmount
 
 'Obtener valor del mes 2
 Dim objMonth2 As DataCellInfoUsingMemberScript = BRApi.Finance.Data.GetDataCellUsingMemberScript(si, "CAN_ACT", E#ONT_County1:C#None:S#Actual:T#2021M2:V#Periodic:A#" & strAcctName & ":F#None:0#For"
 Dim decMonth2 As Decimal = objMonth2.DataCellEx.DataCell.CellAmount
 
 'Comparar valores de cada cuenta, importes del mes 1 frente al mes 2.
 'Si el valor del mes 1 es mayor que el del mes 2, agréguelo a la cadena de retorno
 
 If decMonth1 > decMonth2 Then
    strVarianceOff = strVarianceOff & strAccntName & ","
 End If
Next

6. El paso final es eliminar la coma final de la variable que contiene las cuentas agregadas en el paso anterior.

'eliminar la coma final de la cadena de retorno
strVarianceOff = strVarianceOff.Substring(0,strVarianceOff.Length - 1)

7. El código completo.

Public Function CubeViewComponent(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardStringFunctionArgs) As String
Try
'Obtener la lista descendiente de cuentas (usada en la vista de cubo) que se usará para recorrer
Dim AcctList As List(Of MemberInfo) = BRApi.Finance.Metadata.GetMemberUsingFilter(si,"CanadaAccounts","A#Income_Statement.TreeDescendantsInclusive", True)

'Establezca el valor como un espacio en blanco para que, si ninguna cuenta tiene un valor mayor, se devuelva un espacio en blanco y la sentencia de formato no genere error.
Dim strVarianceOff As String = ""

'Recorrer cada cuenta
For Each acct As MemberInfo In AcctList
 Dim strAcctName As String = acct.Member.Name.ToString
 'Obtener valor del mes 1
 Dim objMonth1 As DataCellInfoUsingMemberScript = BRApi.Finance.Data.GetDataCellUsingMemberScript(si, "CAN_ACT", E#ONT_County1:C#None:S#Actual:T#2021M1:V#Periodic:A#" & strAcctName & ":F#None:0#For"
 Dim decMonth1 As Decimal = objMonth1.DataCellEx.DataCell.CellAmount
 
 'Obtener valor del mes 2
 Dim objMonth2 As DataCellInfoUsingMemberScript = BRApi.Finance.Data.GetDataCellUsingMemberScript(si, "CAN_ACT", E#ONT_County1:C#None:S#Actual:T#2021M2:V#Periodic:A#" & strAcctName & ":F#None:0#For"
 Dim decMonth2 As Decimal = objMonth2.DataCellEx.DataCell.CellAmount
 
 'Comparar los valores de cada cuenta
 If decMonth1 > decMonth2 Then
    strVarianceOff = strVarianceOff & strAccntName & ","
 End If
Next

'Eliminar la coma final de la cadena de retorno
strVarianceOff = strVarianceOff.Substring(0,strVarianceOff.Length - 1)

Return strVarianceOff
Catch ex As Exception
    Throw ErrorHandler.LogWrite(si, New XFException(si,ex))
End Try
End Function

8. Esto devolverá el valor de strVarianceOff, que será algo como “A_60000,A_6000A,A_6002A”.

9. Ahora necesita construir la función de formato de celdas en la vista de cubo usando “RowE1Member Name In”. Esto evaluará todos los nombres de miembros devueltos por el XFBR. En este caso cambiará el color de fondo a Aqua para todas las celdas de datos cuyo importe sea menor que el importe de la columna 1.

Formato de columna en OneStream Designer

Ahora el formato de varianza de celdas de su vista de cubo está comparando los importes de una columna de datos con los importes de otra columna de datos.

Resultado del análisis de varianza en OneStream Data Explorer

Contacto

MindStream Analytics

¿Quiere saber más sobre OneStream Software? Complete el siguiente formulario y nos pondremos en contacto con usted en breve.