En el post de hoy vamos a ver un truquillo para generarnos una alerta en nuestra portada de un informe financiero cuando haya algún registro que no cumpla con los valores correctos.
En el ejemplo que vamos a ver, tenemos creadas 2 comprobaciones sobre nuestros datos contables:
1️⃣ Un control que indique si hay algún asiento descuadrado. En contabilidad es absolutamente esencial que se cumpla el principio de partida doble, es decir, que los importes que van al debe sean los mismos que los que van al haber. Haremos por tanto un chequeo de que todos los asientos cumplan esta regla.
2️⃣ Que todas las cuentas contables a 4 dígitos que usamos en nuestros apuntes contables las tengamos correctamente clasificadas en nuestro maestro de cuentas.
Como sabréis, el plan general contable (PGC) español, recoge únicamente determinadas cuentas a 4 dígitos.
Muestro a continuación una imagen de las cuentas registradas en el PGC para el subgrupo 10:

En mis modelos financieros, tengo clasificadas en mis dimensiones Balance y Cash Flow absolutamente todas las cuentas a 4 dígitos recogidas en el PGC (y en mi dimensión de Pérdidas y Ganancias únicamente las de los grupos 6 y 7 de gastos o ingresos).
Por ello, en el grupo 1, según la imagen anterior, tengo creados los siguientes registros de cuentas a 4 dígitos: 1000, 1010, 1020, 1030, 1034, 1040, 1044, 1080 y 1090.
No obstante, el PGC es una guía no estrictamente obligatoria, con lo que hay empresas que pueden usar cuentas a 4 dígitos que no estén reflejadas en el PGC. En ese caso, tendré que asegurarme de recoger esas cuentas a 4 dígitos que está utilizando la empresa por fuera del PGC y buscar un sistema para que mis tablas dimensionales clasifiquen correctamente esas cuentas.
Por ello, hago un chequeo de que si se utiliza en un apunte contable una nueva cuenta a 4 dígitos que yo no tenga mapeada, me genere un registro en una tabla que llamo “CuentasSinClasificar” (esto lo hago en la fase de ETL con Power Query normalmente).
Contado esto, os voy a enseñar cómo quedaría una hoja de check list en la que controlo las cuentas a 4 dígitos sin clasificar y los asientos descuadrados:

Como se puede apreciar, actualmente no habría nada fuera de control…. 🕵🏻♂️
En la tabla “Cuentas a 4D sin clasificar” únicamente tengo incluido el campo “Cuenta4D” que viene de la tabla que indiqué que trabajaba en Power Query para quedarme con cuentas a 4 dígitos utilizadas en los apuntes contables que no tenía clasificadas para representar en mis informes de PyG, balance y cash flow.
En la tabla “Asientos descuadrados” llevo el identificador de cada asiento y las medidas “Debe” (que suma los importes del debe de los apuntes), “Haber” (que suma los importes del haber de los apuntes) y “Saldo” (que realiza la diferencia entre las medidas “Debe” y “Haber”).
Por otro lado, os voy a enseñar una imagen de portada estándar, con unos KPIs y unos iconos en el margen izquierdo para navegar entre las distintas páginas del informe:

El primero de los iconos, es a través del cual navegaríamos a la anterior página de check list:

Lo que voy a explicar en este post, es cómo realizar una medida DAX con la que dar formato condicional al borde de esa imagen, de manera que si hay algo que resaltar en mi página de check list, me salga un borde rojo alrededor de ese icono a modo de alerta; y aparezca de esta forma:

Lo primero que vamos a hacer es construir una medida que me indique el número de cuentas sin clasificar a 4 dígitos. Como habíamos dicho que teníamos construida una tabla en fase de ETL que ya me daba esos registros, simplemente será contar las filas de esa tabla:
#CuentasSinClasificar = COUNTROWS(CuentasSinClasificar)
A continuación, haremos una nueva medida DAX con la que obtener el número de asientos descuadrados. Esta nueva medida no es tan básica como la anterior, pero vamos a explicarla paso a paso para entenderla.
La medida sería la siguiente:
#AsientosDescuadrados =
CALCULATE (
COUNTROWS (
FILTER (
ADDCOLUMNS (
SUMMARIZE ( factDiario, factDiario[id Asiento] ),
«@Saldo», [Saldo]
),
[@Saldo] <> 0
)
),
ALL ()
)
NOTA: Si tenemos el dato del idAsiento únicamente en una dimensión degenerada de apuntes (en lugar de en la tabla de hechos del libro diario), tendremos que hacer el SUMMARIZE de esa tabla dimApuntes.
Y ahora vamos a explicarla (de adentro hacia afuera):
Lo que estamos haciendo es una tabla virtual que nos devuelve los valores únicos del campo idAsiento, con la función SUMMARIZE, y añadimos a esa tabla virtual el saldo de cada asiento con la función ADDCOLUMNS.
Con ello, obtenemos una tabla con las columnas idAsiento y Saldo.
Nos quedaría una tabla similar a esta:
idAsiento | Saldo |
1-2023-1 | 0 |
1-2023-2 | 0 |
1-2023-3 | 0 |
1-2023-4 | 0 |
1-2023-5 | 0 |
A continuación, con la función FILTER, filtramos la tabla por los registros que tengan el saldo distinto de cero ,es decir, los asientos que estén descuadrados.
En el siguiente paso, con la función COUNTROWS, contamos el número de registros que han quedado en nuestra tabla virtual ya filtrada.
Por último, hacemos una modificación del contexto de evaluación con CALCULATE y la función ALL() para eliminar el efecto de los segmentadores de año, mes y empresa que tenemos en la parte superior de la hoja de Inicio (ver imagen anterior).
Este paso es necesario porque queremos que se nos resalte en rojo cuando haya cualquier registro fuera de lo normal, independientemente de los filtros aplicados. Es decir, si hay un asiento descuadrado que es del año 2022 pero yo tengo filtrado el año 2023, si no incluyo el CALCULATE(…….ALL()) no se me resaltará el borde del icono en rojo como un error ese asiento descuadrado; ya que identificaría que para el año filtrado 2023 todo está correcto.
En caso de que esté todo OK (todos los asientos cuadrados) esta medida debería devolver un resultado de cero.
Por último, vamos a hacer la medida DAX con la que vamos a dar el formato condicional al borde de nuestra imagen:
Icono Check List =
IF (
[#CuentasSinClasificar] + [#AsientosDescuadrados] > 0,
«Red»,
«White»
)
En caso de que haya algún caso problemático, nos devolverá el borde en rojo, y en caso contrario en blanco (como el fondo que tiene la imagen).
Ahora lo que nos toca es ir al formato de la imagen que tiene nuestro icono de check list y configurar el formato condicional del borde de la siguiente manera:

Al estar todos los datos comprobados en el check list correctos no notamos ninguna diferencia, pero vamos a ver lo que pasa si fuerzo a que un asiento esté descuadrado…
Voy a modificar el asiento 50 de la empresa 1 del ejercicio 2022 (en el modelo se correspondería con el identificador de asiento 1_2022_50):

Y mirad el efecto que tiene sobre el icono del check list cuando actualizamos los datos:

Nuestro icono se ha resaltado con un borde rojo.
Y si pincho sobre el icono para realizar la navegación entre páginas y que vaya a la página de check list, encontramos el detalle de lo que está generando la alerta:

Nos aparece el asiento 1_2022_50 descuadrado, con lo que tendremos que corregirlo en el ERP (o en el origen que corresponda) para que los informes vuelvan a salir correctos.
Es una técnica que estoy incorporando en todos mis informes financieros y que los usuarios finales agradecen mucho para no tener que estar pendientes de entrar a la hoja de check list, ya que en la propia página de inicio ya tienen el chivato si hay algún error en los datos 😁
Seguimos!!! 👊