Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
2 years ago
Solved

Dependencia circular

Tengo un problema de dependencia con mis medidas de DAX; Esencialmente, una medida necesita que se calcule la otra. Sin embargo, no está relacionado con el tiempo; Necesito el valor del mes anterior de una medida para calcular la actual, y esto está causando un error.

Tenemos dos medidas, Saldo de Caja Inicial y Saldo de Caja Final. La inicial de enero se da para la base, y la final es la suma de 5 cuentas, incluida la inicial. Para el próximo mes, tenemos la inicial de febrero, que es igual a la final del mes anterior, y la final de nuevo es la suma de 5 cuentas, incluida la inicial.

Básicamente, mi problema gira en torno a los valores del saldo de efectivo inicial que no existen en la tabla; tenemos que calcularlos. Sin embargo, el saldo de caja final también requiere que se calcule el inicial. ¿Cómo puedo resolver esto?

Se nota que uno depende del otro para ser calculado. Sin embargo, podemos establecer

una secuencia de pasos que, de ser ordenados, nos permitirían calcular hasta el mes de diciembre sin ningún problema.

Aquí está el código para ambas medidas:

=============================================================

Saldo inicial de caja =

VAR varInicial =
CALCULAR(
[Importe de la moneda],
dimCashFlowAccount[H1] = "5 Saldo de efectivo inicial"
)

VAR varFinal =

CALCULAR(
[Saldo final de caja],
DATEADD(dimCalendar[Date], -1, MONTH)
)

DEVOLUCIÓN
IF(varInitial <> 0, varInitial, varFinal)

=============================================================

Saldo final de caja =
VAR varFinal =

CALCULAR(
[Importe de la moneda],
dimCashFlowAccount[H1] = "1 Operando " ||
dimCashFlowAccount[H1] = "2 Financiamiento" ||
dimCashFlowAccount[H1] = "3 Inversión"||
dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo"
)

RETURN varFinal + [Saldo de caja inicial]

=============================================================


Actualmente, mi matriz se ve así:

CuentaEneFebMarAbr
1 Funcionamiento-45.069.886,14-38.754.603,82-746.247,7310.903.513,73
2 Financiación-1.339.127,96-705.556,47-25.845.105,76-225.528,30
3 Inversión-33.875.353,61-10.865.816,03-9.160.827,52-2.430.627,32
4 Variación del cambio de efectivo-2.077.440,021.349.943,37-1.081.836,0547.619,05
5 Saldo inicial de efectivo773.156.021,79690.794.214,06641.818.181,11
6 Saldo final de caja690.794.214,06641.818.181,11604.984.164,05

8.294.977,16


Sin embargo, el valor que pretendo lograr es este:

CuentaEneFebMarAbr
1 Funcionamiento-45.069.886,14-38.754.603,82-746.247,7310.903.513,73
2 Financiación-1.339.127,96-705.556,47-25.845.105,76-225.528,30
3 Inversión-33.875.353,61-10.865.816,03-9.160.827,52-2.430.627,32
4 Variación del cambio de efectivo-2.077.440,021.349.943,37-1.081.836,0547.619,05
5 Saldo inicial de efectivo773.156.021,79690.794.214,06641.818.181,11604.984.164,05
6 Saldo final de caja690.794.214,06641.818.181,11604.984.164,05613.279.141,21

¿Podrías ayudarme?

  • La solución la encontré justo debajo:

    Saldo inicial de caja =

    VAR varNum =
    INTERRUPTOR (
    MONTH(MAX('dimCalendar'[Fecha])),
    1, 0,
    2, -1,
    3, -2,
    4, -3,
    5, -4,
    6, -5,
    7, -6,
    8, -7,
    9, -8,
    10, -9,
    11, -10,
    12, -11
    )

    VAR varMonth = MONTH(MAX('dimCalendar'[Date]))

    VAR varInicial =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "5 Saldo de efectivo inicial"
    )

    FEBRERO
    VAR X =
    CALCULAR(
    [DefaultCase],
    DATEADD(dimCalendar[Fecha], varNum, MES)
    )

    VAR Y =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 1, MONTH)
    ) + X

    MARZO
    VAR X1 = Y

    VAR Y1 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 2, MES)
    ) + X1

    ABRIL
    VAR X2 = Y1

    VAR Y2 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 3, MES)
    ) + X2

    MAYO
    VAR X3 = Y2

    VAR Y3 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 4, MONTH)
    ) + X3

    JUNIO
    VAR X4 = Y3

    VAR Y4 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 5, MONTH)
    ) + X4

    JULIO
    VAR X5 = Y4

    VAR Y5 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 6, MES)
    ) + X5

    // AUGUST
    VAR X6 = Y5

    VAR Y6 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 7, MONTH)
    ) + X6

    SEPTIEMBRE
    VAR X7 = Y6

    VAR Y7 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 8, MONTH)
    ) + X7

    OCTUBRE
    VAR X8 = Y7

    VAR Y8 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 9, MONTH)
    ) + X8

    NOVIEMBRE
    VAR X9 = Y8

    VAR Y9 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 10, MONTH)
    ) + x9

    DICIEMBRE
    VAR X10 = Y9

    VAR Y10 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 11, MES)
    ) + X10

    Resultado del VAR =
    INTERRUPTOR(
    varMonth,
    2, X, // Si CurrentMonth es 2 (febrero), devuelve X
    3, X1, // Si CurrentMonth es 3 (marzo), devuelve X1
    4, X2, // Si CurrentMonth es 4 (abril), devuelve X2
    5, X3, // Si CurrentMonth es 5 (mayo), devuelve X3
    6, X4, // Si CurrentMonth es 6 (junio), devuelve X4
    7, X5, // Si CurrentMonth es 7 (julio), devuelve X5
    8, X6, // Si CurrentMonth es 8 (agosto), devuelve X6
    9, X7, // Si CurrentMonth es 9 (septiembre), devuelve X7
    10, X8, // Si CurrentMonth es 10 (octubre), devuelve X8
    11, X9, // Si CurrentMonth es 11 (noviembre), devuelve X9
    12, X10, // Si CurrentMonth es 12 (diciembre), devuelve X10
    BLANK() // Mayúsculas y minúsculas por defecto
    )

    DEVOLUCIÓN
    IF(varInitial <> 0, varInitial, Result)


    ========================================================

    Saldo final de caja =

    VAR varNum =
    INTERRUPTOR (
    MONTH(MAX('dimCalendar'[Fecha])),
    1, 0,
    2, -1,
    3, -2,
    4, -3,
    5, -4,
    6, -5,
    7, -6,
    8, -7,
    9, -8,
    10, -9,
    11, -10,
    12, -11
    )

    VAR varMonth = MONTH(MAX('dimCalendar'[Date]))

    VAR varInicial =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "5 Saldo de efectivo inicial"
    )

    VAR varFinal =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "6 Saldo de efectivo final"
    )

    FEBRERO

    VAR X =
    CALCULAR(
    [DefaultCase],
    DATEADD(dimCalendar[Fecha], varNum, MES)
    )

    VAR Y =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +1, MONTH)
    ) + X

    MARZO

    VAR X1 = Y

    VAR Y1 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +2, MONTH)
    ) + X1

    ABRIL

    VAR X2 = Y1

    VAR Y2 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +3, MONTH)
    ) + X2

    MAYO
    VAR X3 = Y2

    VAR Y3 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +4, MONTH)
    ) + X3

    JUNIO
    VAR X4 = Y3

    VAR Y4 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +5, MONTH)
    ) + X4

    JULIO
    VAR X5 = Y4

    VAR Y5 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +6, MONTH)
    ) + X5

    // AUGUST
    VAR X6 = Y5

    VAR Y6 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +7, MONTH)
    ) + X6


    SEPTIEMBRE
    VAR X7 = Y6

    VAR Y7 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +8, MONTH)
    ) + X7

    OCTUBRE
    VAR X8 = Y7

    VAR Y8 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +9, MONTH)
    ) + X8

    NOVIEMBRE
    VAR X9 = Y8

    VAR Y9 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +10, MONTH)
    ) + x9

    DICIEMBRE
    VAR X10 = Y9

    VAR Y10 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +11, MONTH)
    ) + X10

    Resultado del VAR =
    INTERRUPTOR(
    varMonth,
    2, Y, // Si CurrentMonth es 2 (febrero), devuelve X
    3, Y1, // Si CurrentMonth es 3 (marzo), devuelve X1
    4, Y2, // Si CurrentMonth es 4 (abril), devuelve X2
    5, Y3, // Si CurrentMonth es 5 (mayo), devuelve X3
    6, Y4, // Si CurrentMonth es 6 (junio), devuelve X4
    7, Y5, // Si CurrentMonth es 7 (julio), devuelve X5
    8, Y6, // Si CurrentMonth es 8 (agosto), devuelve X6
    9, Y7, // Si CurrentMonth es 9 (septiembre), devuelve X7
    10, Y8, // Si CurrentMonth es 10 (octubre), devuelve X8
    11, Y9, // Si CurrentMonth es 11 (noviembre), devuelve X9
    12, Y10, // Si CurrentMonth es 12 (diciembre), devuelve X10
    BLANK() // Mayúsculas y minúsculas por defecto
    )

    DEVOLUCIÓN
    IF(varInitial <> 0, varFinal, Result)


    Si alguien encuentra una simplificación del código, agradecería mucho mejoras y consejos. Muchas gracias por el apoyo de la comunidad !!

12 Replies

  • Proporcione datos de muestra que cubran su problema o pregunta por completo, en un formato utilizable (no como una captura de pantalla).

    No incluya información confidencial ni nada que no esté relacionado con el problema o la pregunta.

    Si no está seguro de cómo cargar datos, consulte https://community.fabric.microsoft.com/t5/Community-Blog/How-to-provide-sample-data-in-the-Power-BI-Forum/ba-p/963216

    Muestre el resultado esperado en función de los datos de muestra que proporcionó.

    ¿Quieres respuestas más rápidas? https://community.fabric.microsoft.com/t5/Desktop/How-to-Get-Your-Question-Answered-Quickly/m-p/1447523

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Lbendlin, agradezco su atención de antemano.

      ¡Tengo problemas para adjuntar el archivo .pbix!

      Creé un modelo específicamente para su comprensión; sin embargo, devuelve el mensaje "El tipo de archivo (.pbix) no es compatible", aunque el archivo solo tenga 89 KB.

      Os dejo algunas imágenes de mi modelo y de lo que espero conseguir!!

      Saldo de efectivo inicial = Saldo de efectivo final del mes pasado

      Saldo final de caja = (cuenta) 1 + 2 + 3 + 4 + 5

      Si tienes alguna duda, ¡estoy a tu disposición!

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Ashish_Mathur, muchas gracias por la respuesta!!

      Pasé un tiempo mirando sus archivos y noté que usa un método para rangos de fechas para calcular valores usando BETWEEN, además de usar MIN y ALLEXCEPT para evitar posibles errores que CALCULATE pueda generar.

      Honestamente, no pude entender completamente cómo estas fórmulas pueden ayudarme a evitar dependencias circulares.

      ¿Podría darme una breve explicación de cuál fue su problema y cómo logró resolverlo?

      Si es posible, ¿podría proporcionar los archivos de antes y después?

      Agradezco su atención de antemano.

      • Syndicate_Admin's avatar
        Syndicate_Admin
        Icon for Administrator rankAdministrator

        De nada. Su tarea simple es calcular el saldo de cierre y ese es exactamente el problema que he resuelto en esos 2 archivos.

  • @Gabriel_Pedri ,

    En función de la información proporcionada, las dependencias circulares se pueden resolver mediante SUMMARIZE para crear una tabla que contenga los valores necesarios para cada fecha y, a continuación, mediante COALESCE para controlar las dependencias circulares. Consulte el código modificado a continuación:

    Initial Cash Balance = 
    VAR InitialTable =
        SUMMARIZE(
            dimCalendar,
            dimCalendar[Date],
            "varInitial",
            CALCULATE(
                [Currency Amount],
                dimCashFlowAccount[H1] = "5 Initial Cash Balance"
            )
        )
    
    VAR varFinal =
        CALCULATE(
            [Final Cash Balance],
            DATEADD(dimCalendar[Date], -1, MONTH)
        )
    
    RETURN
        IF(
            HASONEVALUE(dimCalendar[Date]),
            COALESCE(
                SELECTCOLUMNS(InitialTable, [varInitial]),
                varFinal
            )
        )

    Saludos
    Adamk Kong

    Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

  • La solución la encontré justo debajo:

    Saldo inicial de caja =

    VAR varNum =
    INTERRUPTOR (
    MONTH(MAX('dimCalendar'[Fecha])),
    1, 0,
    2, -1,
    3, -2,
    4, -3,
    5, -4,
    6, -5,
    7, -6,
    8, -7,
    9, -8,
    10, -9,
    11, -10,
    12, -11
    )

    VAR varMonth = MONTH(MAX('dimCalendar'[Date]))

    VAR varInicial =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "5 Saldo de efectivo inicial"
    )

    FEBRERO
    VAR X =
    CALCULAR(
    [DefaultCase],
    DATEADD(dimCalendar[Fecha], varNum, MES)
    )

    VAR Y =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 1, MONTH)
    ) + X

    MARZO
    VAR X1 = Y

    VAR Y1 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 2, MES)
    ) + X1

    ABRIL
    VAR X2 = Y1

    VAR Y2 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 3, MES)
    ) + X2

    MAYO
    VAR X3 = Y2

    VAR Y3 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 4, MONTH)
    ) + X3

    JUNIO
    VAR X4 = Y3

    VAR Y4 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 5, MONTH)
    ) + X4

    JULIO
    VAR X5 = Y4

    VAR Y5 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 6, MES)
    ) + X5

    // AUGUST
    VAR X6 = Y5

    VAR Y6 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 7, MONTH)
    ) + X6

    SEPTIEMBRE
    VAR X7 = Y6

    VAR Y7 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 8, MONTH)
    ) + X7

    OCTUBRE
    VAR X8 = Y7

    VAR Y8 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 9, MONTH)
    ) + X8

    NOVIEMBRE
    VAR X9 = Y8

    VAR Y9 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Date], varNum + 10, MONTH)
    ) + x9

    DICIEMBRE
    VAR X10 = Y9

    VAR Y10 =
    CALCULAR(
    [Importe de la moneda],
    (dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo") &&
    DATEADD(dimCalendar[Fecha], varNum + 11, MES)
    ) + X10

    Resultado del VAR =
    INTERRUPTOR(
    varMonth,
    2, X, // Si CurrentMonth es 2 (febrero), devuelve X
    3, X1, // Si CurrentMonth es 3 (marzo), devuelve X1
    4, X2, // Si CurrentMonth es 4 (abril), devuelve X2
    5, X3, // Si CurrentMonth es 5 (mayo), devuelve X3
    6, X4, // Si CurrentMonth es 6 (junio), devuelve X4
    7, X5, // Si CurrentMonth es 7 (julio), devuelve X5
    8, X6, // Si CurrentMonth es 8 (agosto), devuelve X6
    9, X7, // Si CurrentMonth es 9 (septiembre), devuelve X7
    10, X8, // Si CurrentMonth es 10 (octubre), devuelve X8
    11, X9, // Si CurrentMonth es 11 (noviembre), devuelve X9
    12, X10, // Si CurrentMonth es 12 (diciembre), devuelve X10
    BLANK() // Mayúsculas y minúsculas por defecto
    )

    DEVOLUCIÓN
    IF(varInitial <> 0, varInitial, Result)


    ========================================================

    Saldo final de caja =

    VAR varNum =
    INTERRUPTOR (
    MONTH(MAX('dimCalendar'[Fecha])),
    1, 0,
    2, -1,
    3, -2,
    4, -3,
    5, -4,
    6, -5,
    7, -6,
    8, -7,
    9, -8,
    10, -9,
    11, -10,
    12, -11
    )

    VAR varMonth = MONTH(MAX('dimCalendar'[Date]))

    VAR varInicial =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "5 Saldo de efectivo inicial"
    )

    VAR varFinal =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "6 Saldo de efectivo final"
    )

    FEBRERO

    VAR X =
    CALCULAR(
    [DefaultCase],
    DATEADD(dimCalendar[Fecha], varNum, MES)
    )

    VAR Y =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +1, MONTH)
    ) + X

    MARZO

    VAR X1 = Y

    VAR Y1 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +2, MONTH)
    ) + X1

    ABRIL

    VAR X2 = Y1

    VAR Y2 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +3, MONTH)
    ) + X2

    MAYO
    VAR X3 = Y2

    VAR Y3 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +4, MONTH)
    ) + X3

    JUNIO
    VAR X4 = Y3

    VAR Y4 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +5, MONTH)
    ) + X4

    JULIO
    VAR X5 = Y4

    VAR Y5 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +6, MONTH)
    ) + X5

    // AUGUST
    VAR X6 = Y5

    VAR Y6 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +7, MONTH)
    ) + X6


    SEPTIEMBRE
    VAR X7 = Y6

    VAR Y7 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +8, MONTH)
    ) + X7

    OCTUBRE
    VAR X8 = Y7

    VAR Y8 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +9, MONTH)
    ) + X8

    NOVIEMBRE
    VAR X9 = Y8

    VAR Y9 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +10, MONTH)
    ) + x9

    DICIEMBRE
    VAR X10 = Y9

    VAR Y10 =
    CALCULAR(
    [Importe de la moneda],
    dimCashFlowAccount[H1] = "1 OCF - Operativa [NIIF]" ||
    dimCashFlowAccount[H1] = "2 FCF - Financiación" ||
    dimCashFlowAccount[H1] = "3 ICF - Inversión" ||
    dimCashFlowAccount[H1] = "4 Variación de cambio de efectivo",
    DATEADD(dimCalendar[Date], varNum +11, MONTH)
    ) + X10

    Resultado del VAR =
    INTERRUPTOR(
    varMonth,
    2, Y, // Si CurrentMonth es 2 (febrero), devuelve X
    3, Y1, // Si CurrentMonth es 3 (marzo), devuelve X1
    4, Y2, // Si CurrentMonth es 4 (abril), devuelve X2
    5, Y3, // Si CurrentMonth es 5 (mayo), devuelve X3
    6, Y4, // Si CurrentMonth es 6 (junio), devuelve X4
    7, Y5, // Si CurrentMonth es 7 (julio), devuelve X5
    8, Y6, // Si CurrentMonth es 8 (agosto), devuelve X6
    9, Y7, // Si CurrentMonth es 9 (septiembre), devuelve X7
    10, Y8, // Si CurrentMonth es 10 (octubre), devuelve X8
    11, Y9, // Si CurrentMonth es 11 (noviembre), devuelve X9
    12, Y10, // Si CurrentMonth es 12 (diciembre), devuelve X10
    BLANK() // Mayúsculas y minúsculas por defecto
    )

    DEVOLUCIÓN
    IF(varInitial <> 0, varFinal, Result)


    Si alguien encuentra una simplificación del código, agradecería mucho mejoras y consejos. Muchas gracias por el apoyo de la comunidad !!

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Entiendo que no había dinamismo en el código, que podría haberse calculado fácilmente usando YTD o BETWEEN. Sin embargo, en este caso, existe una dependencia circular en las medidas, por lo que tuve que optar por un método más estático, tratando de calcular mes a mes, haciendo posible calcular el mes actual.

      En mi caso, tendríamos el valor del Saldo de Caja Inicial solo para el mes de enero. Debido a esto, ¡lo saqué al principio del código para poder calcular los demás!