Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Don't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.

Reply
Syndicate_Admin
Administrator
Administrator

Calcule diferentes fechas de finalización.

Buen día a todos.

Tengo el siguiente código que agrega 20 días hábiles al código de stock "Primera fecha de entrada" y esto funciona muy bien. Necesito ayuda para agregar la siguiente condición al código.

Una vez que el código de stock se mueve a 'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK03", hay una escasez de componentes para completar el proyecto. Solo una vez que se reciba el último componente, el código de stock se moverá a 'vw_Rep_Inv_Movements' [NewWarehouse] = "JEMK04".

Lo que quiero lograr es que si los códigos de stock no se mueven a JEMK03, la fecha de finalización debe calcularse a partir de la "Primera fecha de entrada como se muestra a continuación", pero si el código de stock se mueve a JEMK03, la fecha de finalización debe calcularse a partir de la fecha en que el código de stock se movió de JEMK03 a JEMK04.

Fecha de finalización =
VAR Fecha de inicio = 'vw_Rep_Inv_Movements'[Fecha de primera entrada]
VAR DaysToAdd = 20
VAR Tabla de fechas =
FILTRO (
ADDCOLUMNS (
CALENDARIO (Fecha de inicio, Fecha de inicio + DaysToAdd + 30), -- Crear un rango de fechas
"Día de la semana", DÍA LABORABLE([Fecha], 2) -- 2 significa Lunes = 1, Domingo = 7
),
[Día de la semana] <= 5 -- Excluir fines de semana
)
VAR WorkingDaysTable =
ADDCOLUMNS (
Tabla de fechas,
"Rango de DíaTrabajo", RANKX ( Tabla de fechas, [Fecha], , ASC, DENSO )
)
DEVOLUCIÓN
BRIBONA (
FILTRO (
WorkingDaysTable,
[Rango de DíaTrabajo] = DaysToAdd
),
[Fecha]
)

Les agradezco a todos de antemano por su tiempo y ayuda
5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

@Matt_JEM

Código DAX actualizado:

Completion Date =
VAR StartDate = 'vw_Rep_Inv_Movements'[First Entry Date]
VAR DaysToAdd = 20

-- Check if the stock code moved into JEMK03
VAR JEMK03Date =
MINX(
FILTER(
'vw_Rep_Inv_Movements',
'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK03"
),
'vw_Rep_Inv_Movements'[Movement Date] -- Replace with the column that tracks movement dates
)

-- Check if the stock code moved into JEMK04 after JEMK03
VAR JEMK04Date =
MINX(
FILTER(
'vw_Rep_Inv_Movements',
'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK04" &&
'vw_Rep_Inv_Movements'[Movement Date] > JEMK03Date
),
'vw_Rep_Inv_Movements'[Movement Date]
)

-- Determine the adjusted start date
VAR AdjustedStartDate =
IF(
NOT ISBLANK(JEMK03Date) && NOT ISBLANK(JEMK04Date),
JEMK04Date,
StartDate
)

-- Create a table of working days
VAR DateTable =
FILTER (
ADDCOLUMNS (
CALENDAR (AdjustedStartDate, AdjustedStartDate + DaysToAdd + 30), -- Create a date range
"Weekday", WEEKDAY([Date], 2) -- 2 means Monday=1, Sunday=7
),
[Weekday] <= 5 -- Exclude weekends
)

-- Rank the working days
VAR WorkingDaysTable =
ADDCOLUMNS (
DateTable,
"WorkingDayRank", RANKX ( DateTable, [Date], , ASC, DENSE )
)

-- Return the calculated completion date
RETURN
MINX (
FILTER (
WorkingDaysTable,
[WorkingDayRank] = DaysToAdd
),
[Date]
)

¡Avísame si necesitas más aclaraciones!

💌 Si esto ayudó, ¡una marca de Kudos 👍 o Solution sería genial! 🎉
Bien
Kedar
Conéctate en LinkedIn

Syndicate_Admin
Administrator
Administrator

Hola @Matt_JEM Sin datos representativos, es difícil determinar una solución específica. Pero creo que hay que capturar la fecha en la que las existencias se movió de JEMK03 a JEMK04 y redefina EffectiveDate para verificar si la fecha está en blanco de las existencias movidas de JEMK03 a JEMK04, luego use First Entry Date, de lo contrario, el día en que se mueve. Por ejemplo, puedes probar esto para ajustar tu código:

--Replace 'vw_Rep_Inv_Movements'[Date] with column name which capture moving date from JEMK03 to JEMK04.

VAR JEMK04Date = 
    CALCULATE(
        MIN('vw_Rep_Inv_Movements'[Date]),
        'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK04"
    )
VAR EffectiveStartDate = 
    IF(
        ISBLANK(JEMK04Date),
        StartDate,
        JEMK04Date
    )

¡Espero que esto ayude!

Si esto resolvió su problema, ¡acéptelo como una solución y felicitaciones!

Saludos
Shahariar Hafiz

Syndicate_Admin
Administrator
Administrator

Hola @Matt_JEM ,

A continuación, se muestra cómo puede modificar la medida del DAX para incluir la lógica para determinar la fecha de finalización en función de si el código de acciones se mueve a JEMK03 y, posteriormente, a JEMK04:

Completion Date =
VAR StartDate = 'vw_Rep_Inv_Movements'[First Entry Date]
VAR DaysToAdd = 20

-- Find the date when the stock code moved to JEMK03
VAR JEMK03Date = 
    CALCULATE (
        MIN('vw_Rep_Inv_Movements'[Movement Date]), 
        'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK03"
    )

-- Find the date when the stock code moved to JEMK04 after JEMK03
VAR JEMK04Date =
    CALCULATE (
        MIN('vw_Rep_Inv_Movements'[Movement Date]),
        'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK04",
        'vw_Rep_Inv_Movements'[Movement Date] > JEMK03Date
    )

-- Determine the calculation start date based on the conditions
VAR CalculationStartDate =
    IF (
        NOT ISBLANK(JEMK03Date) && NOT ISBLANK(JEMK04Date),
        JEMK04Date, -- Use the date stock moved to JEMK04 if it passed through JEMK03
        StartDate   -- Otherwise, use the First Entry Date
    )

-- Create a table of dates considering only working days
VAR DateTable =
    FILTER (
        ADDCOLUMNS (
            CALENDAR (CalculationStartDate, CalculationStartDate + DaysToAdd + 30),  -- Create a date range
            "Weekday", WEEKDAY([Date], 2)  -- 2 means Monday=1, Sunday=7
        ),
        [Weekday] <= 5  -- Exclude weekends
    )

-- Rank the working days
VAR WorkingDaysTable =
    ADDCOLUMNS (
        DateTable,
        "WorkingDayRank", RANKX ( DateTable, [Date], , ASC, DENSE )
    )

-- Return the calculated completion date
RETURN
    MINX (
        FILTER (
            WorkingDaysTable,
            [WorkingDayRank] = DaysToAdd
        ),
        [Date]
    )
  1. JEMK03Date y JEMK04Date: Estas variables calculan las fechas de movimiento respectivas para JEMK03 y JEMK04.
    • JEMK03Date busca la primera fecha en la que el código de acciones se movió a JEMK03.
    • JEMK04Date busca la primera fecha después de JEMK03Date en la que el código de acciones se movió a JEMK04.
  2. CalculationStartDate: Determina la fecha de inicio del cálculo:
    • Si el código de acciones se movió a través de JEMK03 y JEMK04, el cálculo comienza desde JEMK04Date.
    • De lo contrario, comienza desde la "Primera fecha de entrada".
  3. Lógica de fecha de finalización: El resto del código permanece igual, calculando el día hábil número 20 desde la fecha de inicio seleccionada.

Caso de uso:

  • Si el código de acciones no se mueve a JEMK03, el cálculo comienza desde la "Primera fecha de entrada".
  • Si el código de acciones se mueve a JEMK03 y posteriormente a JEMK04, el cálculo comienza desde JEMK04Date.

Esta fórmula garantiza que la fecha de finalización refleje la lógica condicional especificada.

Saludos

@DataNinja777

He implementado el código a continuación y sigo recibiendo el siguiente error. ¿Tiene alguna sugerencia sobre cómo resolver esto? Le agradezco de antemano su tiempo.
"Se detectó una dependencia circular: vw_Rep_Inv_Movements[JEMK04Date], vw_Rep_Inv_Movements[Column], vw_Rep_Inv_Movements[JEMK04Date]".

Determino JEMK04Fecha =

CALCULAR (
MIN('vw_Rep_Inv_Movements'[EntryDate]),
'vw_Rep_Inv_Movements'[NuevoAlmacén] = "JEMK04",
'vw_Rep_Inv_Movements'[Almacén] = "JEMK03"
)

Entonces obtengo el siguiente resultado. El JEMK04DATE es la fecha correcta en la que el código de stock se ha movido de JEMK03 a JEMK04. Mi fecha prevista de finalización es el 11 NOv 2024

Fecha de primera entradaJEMK04FechaCódigo de acciones
2024-10-09 00:00:00 F00020-INC001-A01-L00-T00
2024-10-09 00:00:002024-10-14 00:00:00F00020-INC001-A01-L00-T00
2024-10-09 00:00:00 F00020-INC001-A01-L00-T07
2024-10-09 00:00:002024-10-14 00:00:00F00020-INC001-A01-L00-T07

Fecha de finalización =
VAR Fecha de inicio = 'vw_Rep_Inv_Movements'[Fecha de primera entrada]
VAR DaysToAdd = 20

-- Determine la fecha de inicio del cálculo en función de las condiciones
VAR CalculationStartDate =
SI (
NO ISBLANK('vw_Rep_Inv_Movements'[JEMK04Fecha]),
'vw_Rep_Inv_Movements'[JEMK04Fecha] + 1, -- Utilice la fecha en que el stock se movió a JEMK04 y comience a partir del día siguiente
Fecha de inicio + 1 -- De lo contrario, use la primera fecha de entrada y comience a partir del día siguiente
)

-- Crear una tabla de fechas considerando solo los días hábiles
VAR Tabla de fechas =
FILTRO (
ADDCOLUMNS (
CALENDARIO (CalculationStartDate, CalculationStartDate + DaysToAdd + 30), -- Crear un rango de fechas
"Día de la semana", DÍA LABORABLE([Fecha], 2) -- 2 significa Lunes = 1, Domingo = 7
),
[Día de la semana] <= 5 -- Excluir fines de semana
)

-- Clasificar los días laborables
VAR WorkingDaysTable =
ADDCOLUMNS (
Tabla de fechas,
"Rango de DíaTrabajo", RANKX ( Tabla de fechas, [Fecha], , ASC, DENSO )
)

-- Devolver la fecha de finalización calculada
DEVOLUCIÓN
BRIBONA (
FILTRO (
WorkingDaysTable,
[Rango de DíaTrabajo] = DaysToAdd
),
[Fecha]
)

Hola @Matt_JEM ,

El error de dependencia circular se produce porque DAX está intentando evaluar una columna (JEMK04Date) mientras depende de los cálculos de la misma tabla (vw_Rep_Inv_Movements). Esto sucede debido a una cadena de dependencias que DAX no puede resolver.

A continuación, le indicamos cómo puede resolver este problema:

En lugar de calcular JEMK04Date en la misma tabla, cree una tabla calculada que calcule previamente JEMK03Date y JEMK04Date para cada código de acciones. Esto rompe el bucle de dependencia.

MovementDatesTable =
ADDCOLUMNS (
    SUMMARIZE (
        'vw_Rep_Inv_Movements',
        'vw_Rep_Inv_Movements'[StockCode],
        'vw_Rep_Inv_Movements'[First Entry Date]
    ),
    "JEMK03Date",
        CALCULATE (
            MIN('vw_Rep_Inv_Movements'[EntryDate]),
            'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK03"
        ),
    "JEMK04Date",
        CALCULATE (
            MIN('vw_Rep_Inv_Movements'[EntryDate]),
            'vw_Rep_Inv_Movements'[NewWarehouse] = "JEMK04",
            'vw_Rep_Inv_Movements'[Warehouse] = "JEMK03"
        )
)

Esto crea una tabla independiente (MovementDatesTable) con valores precalculados para cada código de stock.

Modifique la medida para que haga referencia a la tabla calculada en lugar de basarse en las columnas calculadas de la misma tabla.

Completion Date =
VAR StartDate = 
    CALCULATE (
        MIN('MovementDatesTable'[First Entry Date]),
        'MovementDatesTable'[StockCode] = SELECTEDVALUE('vw_Rep_Inv_Movements'[StockCode])
    )
VAR JEMK04Date =
    CALCULATE (
        MIN('MovementDatesTable'[JEMK04Date]),
        'MovementDatesTable'[StockCode] = SELECTEDVALUE('vw_Rep_Inv_Movements'[StockCode])
    )
VAR CalculationStartDate =
    IF (
        NOT ISBLANK(JEMK04Date),
        JEMK04Date + 1,
        StartDate + 1
    )
VAR DateTable =
    FILTER (
        ADDCOLUMNS (
            CALENDAR (CalculationStartDate, CalculationStartDate + 50),
            "Weekday", WEEKDAY([Date], 2)
        ),
        [Weekday] <= 5
    )
VAR WorkingDaysTable =
    ADDCOLUMNS (
        DateTable,
        "WorkingDayRank", RANKX (DateTable, [Date], , ASC, DENSE)
    )
RETURN
    MINX (
        FILTER (
            WorkingDaysTable,
            [WorkingDayRank] = 20
        ),
        [Date]
    )

Al mover los cálculos intermedios (JEMK03Date y JEMK04Date) a una tabla calculada independiente, se eliminan las dependencias dentro de la misma tabla.

A continuación, DAX puede hacer referencia a valores precalculados sin provocar una dependencia circular.

Saludos

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.

Jan25PBI_Carousel

Power BI Monthly Update - January 2025

Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.

Jan NL Carousel

Fabric Community Update - January 2025

Find out what's new and trending in the Fabric community.

Top Solution Authors