Forum Discussion

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

Semana Fiscal

Hola

Tengo una tabla que me da el mes y el año fiscal, pero para el número de la semana fiscal solo tiene un número de índice que continúa creciendo en lugar de reiniciarse cada año. Obtengo estos números usando esto en el editor avanzado que encontré aquí, creo, pero no puedo encontrarlo de nuevo.

dejar
Ingrese la fecha en el Editor Avanzado para el primer día del primer año fiscal en formato #date (yyyy, m, d)
StartDate = #date(2021, 1, 3),
Introduzca el intervalo de años deseado como Lista en el Editor avanzado
YearRange = {2021..2050},
En advanced Editor, use una de las dos opciones para este paso (codifique la que no se usa con //) para codificar o calcular dinámicamente los años con 53 semanas. Sustituya un criterio de evaluación diferente según sea necesario.
YearsWith53Weeks = {2020},
YearsWith53Weeks = List.Select(YearRange, each Date.DayOfWeekName(#date(_,11,30)) = "Sábado"),
StartingTable = Table.FromColumns({YearRange}, {"Año"}),
AddNumberOfWeeksColumn = Table.AddColumn(StartingTable, "Weeks", cada uno if List.Contains(YearsWith53Weeks, [Year]) then 53 else 52),
#"Changed Type4" = Table.TransformColumnTypes(AddNumberOfWeeksColumn,{{"Year", Int64.Type}, {"Weeks", Int64.Type}}),
En el Editor avanzado, introduzca los dos patrones para los años de 52 y 53 semanas como una lista de semanas por mes fiscal
AddListOfMonthAndWeekCounts = Table.AddColumn(#"Changed Type4", "Custom", each if [Weeks] = 53 then List.Zip({{1..12}, {4,4,5,4,4,5,4,5,4,4,5,5,5}}) else List.Zip({{1..12}, {4,5,4,4,5,4,4,5,4,4,5,4}})),
#"Expanded Custom" = Table.ExpandListColumn(AddListOfMonthAndWeekCounts, "Custom"),
#"Valores extraídos" = Table.TransformColumns(#"Expanded Custom", {"Custom", each Text.Combine(List.Transform(_, Text.From), ";"), escriba texto}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Valores extraídos", "Custom", Splitter.SplitTextByDelimiter(";", QuoteStyle.csv), {"FM", "NumWeeks"}),
#"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"FM", Int64.Type}, {"NumWeeks", Int64.Type}}),
AddListOfWeeksColumn = Table.AddColumn(#"Changed Type", "WeekInFM", cada {1..[ NumWeeks]}),
#"Expanded Custom1" = Table.ExpandListColumn(AddListOfWeeksColumn, "WeekInFM"),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom1",{{"WeekInFM", Int64.Type}}),
AddWeekIndex = Table.AddIndexColumn(#"Changed Type1", "FW_Index", 1, 1, Int64.Type),
Add7DayListPerWeek = Table.AddColumn(AddWeekIndex, "WeekDay", cada uno {1..7}),
#"Expanded WeekDay" = Table.ExpandListColumn(Add7DayListPerWeek, "WeekDay"),
#"Changed Type2" = Table.TransformColumnTypes(#"Expanded WeekDay",{{"WeekDay", Int64.Type}}),
RemoveUnneededEdColumns = Table.RemoveColumns(#"Changed Type2",{"Weeks", "NumWeeks", "WeekDay"}),
AddDayIndex = Table.AddIndexColumn(RemoveUnneededEdColumns, "DayIndex", 0, 1, Int64.Type),
AddDatesBasedOnStartDateAndDayIndex = Table.AddColumn(AddDayIndex, "Date", cada Date.AddDays(StartDate, [DayIndex]), escriba date)
en
AddDatesBasedOnStartDateAndDayIndex

¿Alguien tiene una manera fácil de obtener el número de la semana fiscal que comienza de nuevo cada año?

Gracias

SG

  • StephenGW ,

    Pruebe el siguiente código:

    let
    // Enter the date in Advanced Editor for the first day of the earliest Fiscal Year in #date(yyyy,m,d) format
    StartDate = #date(2021, 1, 3),
    // Enter the desired range of years as List in Advanced Editor
    YearRange = {2021..2050},
    // In Advanced Editor, use one of the two options for this step (code out the one not used with //) to either hard code or dynamically calculate the years with 53 weeks. Substitute a different evaluation criterion as needed.
    YearsWith53Weeks = {2020},
    //YearsWith53Weeks = List.Select(YearRange, each Date.DayOfWeekName(#date(_,11,30)) = "Saturday"),
    StartingTable = Table.FromColumns({YearRange}, {"Year"}),
    AddNumberOfWeeksColumn = Table.AddColumn(StartingTable, "Weeks", each if List.Contains(YearsWith53Weeks, [Year]) then 53 else 52),
    #"Changed Type4" = Table.TransformColumnTypes(AddNumberOfWeeksColumn,{{"Year", Int64.Type}, {"Weeks", Int64.Type}}),
    // In the Advanced Editor, enter the two patterns for 52 and 53 week years as a list of weeks per fiscal month
    AddListOfMonthAndWeekCounts = Table.AddColumn(#"Changed Type4", "Custom", each if [Weeks] = 53 then List.Zip({{1..12}, {4,4,5,4,4,5,4,4,5,4,5,5}}) else List.Zip({{1..12}, {4,5,4,4,5,4,4,5,4,4,5,4}})),
    #"Expanded Custom" = Table.ExpandListColumn(AddListOfMonthAndWeekCounts, "Custom"),
    #"Extracted Values" = Table.TransformColumns(#"Expanded Custom", {"Custom", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "Custom", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"FM", "NumWeeks"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"FM", Int64.Type}, {"NumWeeks", Int64.Type}}),
    AddListOfWeeksColumn = Table.AddColumn(#"Changed Type", "WeekInFM", each {1..[NumWeeks]}),
    #"Expanded Custom1" = Table.ExpandListColumn(AddListOfWeeksColumn, "WeekInFM"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom1",{{"WeekInFM", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type1", {"Year"}, {{"All", each _, type table [Year=nullable number, Weeks=nullable number, FM=nullable number, NumWeeks=nullable number, WeekInFM=nullable number]}}),
        #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.AddIndexColumn([All], "New FW Index", 1)),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Year", "All"}),
        #"Expanded Custom2" = Table.ExpandTableColumn(#"Removed Columns", "Custom", {"Year", "Weeks", "FM", "NumWeeks", "WeekInFM", "New FW Index"}, {"Year", "Weeks", "FM", "NumWeeks", "WeekInFM", "New FW Index"}),
    AddWeekIndex = Table.AddIndexColumn(#"Expanded Custom2", "FW_Index", 1, 1, Int64.Type),
    Add7DayListPerWeek = Table.AddColumn(AddWeekIndex, "WeekDay", each {1..7}),
    #"Expanded WeekDay" = Table.ExpandListColumn(Add7DayListPerWeek, "WeekDay"),
    #"Changed Type2" = Table.TransformColumnTypes(#"Expanded WeekDay",{{"WeekDay", Int64.Type}}),
    RemoveUnneededColumns = Table.RemoveColumns(#"Changed Type2",{"Weeks", "NumWeeks", "WeekDay"}),
    AddDayIndex = Table.AddIndexColumn(RemoveUnneededColumns, "DayIndex", 0, 1, Int64.Type),
    AddDatesBasedOnStartDateAndDayIndex = Table.AddColumn(AddDayIndex, "Date", each Date.AddDays(StartDate, [DayIndex]), type date)
    in
    AddDatesBasedOnStartDateAndDayIndex

    Si el problema aún no se resuelve, proporcione información detallada sobre el error o el resultado esperado que espera. Hágamelo saber de inmediato, esperando su respuesta.
    Saludos
    Winniz
    Si esta publicación ayuda, considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

7 Replies

  • @amitchandak

    No pude entender cómo hacer que su DAX funcionara como lo necesitaba. Intenté agregar una columna a mi tabla existente usando este DAX,

    Week No = var _1=  QUOTIENT(DATEDIFF(STARTOFYEAR('Date'[Date]),'Date'[Date],DAY),7)+1 return if(_1<52,_1,52)

    Pero eso comienza de nuevo cada año calendario por lo que pude decir y mi calendario fiscal no comienza al comienzo del año calendario. Por ejemplo, este año comenzó el 1/2/22 en lugar de 1/1 y algunos años también tendrán 53 semanas. Creo que estuvieron cerca, pero está un poco apagado. ¿Alguna idea sobre lo que necesito modificar? ¿Habría un DAX fácil que mire mi mes fiscal y agregue uno cada vez que cambie y se restablezca cuando vuelva a llegar a 1?

    Gracias

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      @StephenGW , prueba como

      Semana No = var _1= COCIENTE(DATEDIFF(STARTOFYEAR('Fecha'[Fecha], "1/31"),'Fecha'[Fecha],DÍA),7)+1 retorno _1


      Semana No =
      Var _st = if(mes([Fecha]) <2 , fecha(año([Fecha])-1,2,1) , fecha(año([Fecha]),2,1) )
      var _1= COCIENTE(FECHAIFF(STARTOFYEAR('Fecha'[Fecha], "1/31"),'Fecha'[Fecha],DÍA,7)+1
      volver _1

  • ¿Alguien tiene alguna idea sobre cómo puedo solucionar esto? Tengo un informe que necesito sacar, pero las semanas fiscales están un poco apagadas.

    Gracias

  • StephenGW ,

    Pruebe el siguiente código:

    let
    // Enter the date in Advanced Editor for the first day of the earliest Fiscal Year in #date(yyyy,m,d) format
    StartDate = #date(2021, 1, 3),
    // Enter the desired range of years as List in Advanced Editor
    YearRange = {2021..2050},
    // In Advanced Editor, use one of the two options for this step (code out the one not used with //) to either hard code or dynamically calculate the years with 53 weeks. Substitute a different evaluation criterion as needed.
    YearsWith53Weeks = {2020},
    //YearsWith53Weeks = List.Select(YearRange, each Date.DayOfWeekName(#date(_,11,30)) = "Saturday"),
    StartingTable = Table.FromColumns({YearRange}, {"Year"}),
    AddNumberOfWeeksColumn = Table.AddColumn(StartingTable, "Weeks", each if List.Contains(YearsWith53Weeks, [Year]) then 53 else 52),
    #"Changed Type4" = Table.TransformColumnTypes(AddNumberOfWeeksColumn,{{"Year", Int64.Type}, {"Weeks", Int64.Type}}),
    // In the Advanced Editor, enter the two patterns for 52 and 53 week years as a list of weeks per fiscal month
    AddListOfMonthAndWeekCounts = Table.AddColumn(#"Changed Type4", "Custom", each if [Weeks] = 53 then List.Zip({{1..12}, {4,4,5,4,4,5,4,4,5,4,5,5}}) else List.Zip({{1..12}, {4,5,4,4,5,4,4,5,4,4,5,4}})),
    #"Expanded Custom" = Table.ExpandListColumn(AddListOfMonthAndWeekCounts, "Custom"),
    #"Extracted Values" = Table.TransformColumns(#"Expanded Custom", {"Custom", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "Custom", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"FM", "NumWeeks"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"FM", Int64.Type}, {"NumWeeks", Int64.Type}}),
    AddListOfWeeksColumn = Table.AddColumn(#"Changed Type", "WeekInFM", each {1..[NumWeeks]}),
    #"Expanded Custom1" = Table.ExpandListColumn(AddListOfWeeksColumn, "WeekInFM"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom1",{{"WeekInFM", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type1", {"Year"}, {{"All", each _, type table [Year=nullable number, Weeks=nullable number, FM=nullable number, NumWeeks=nullable number, WeekInFM=nullable number]}}),
        #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.AddIndexColumn([All], "New FW Index", 1)),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Year", "All"}),
        #"Expanded Custom2" = Table.ExpandTableColumn(#"Removed Columns", "Custom", {"Year", "Weeks", "FM", "NumWeeks", "WeekInFM", "New FW Index"}, {"Year", "Weeks", "FM", "NumWeeks", "WeekInFM", "New FW Index"}),
    AddWeekIndex = Table.AddIndexColumn(#"Expanded Custom2", "FW_Index", 1, 1, Int64.Type),
    Add7DayListPerWeek = Table.AddColumn(AddWeekIndex, "WeekDay", each {1..7}),
    #"Expanded WeekDay" = Table.ExpandListColumn(Add7DayListPerWeek, "WeekDay"),
    #"Changed Type2" = Table.TransformColumnTypes(#"Expanded WeekDay",{{"WeekDay", Int64.Type}}),
    RemoveUnneededColumns = Table.RemoveColumns(#"Changed Type2",{"Weeks", "NumWeeks", "WeekDay"}),
    AddDayIndex = Table.AddIndexColumn(RemoveUnneededColumns, "DayIndex", 0, 1, Int64.Type),
    AddDatesBasedOnStartDateAndDayIndex = Table.AddColumn(AddDayIndex, "Date", each Date.AddDays(StartDate, [DayIndex]), type date)
    in
    AddDatesBasedOnStartDateAndDayIndex

    Si el problema aún no se resuelve, proporcione información detallada sobre el error o el resultado esperado que espera. Hágamelo saber de inmediato, esperando su respuesta.
    Saludos
    Winniz
    Si esta publicación ayuda, considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      @v-kkf-msft

      ¡Eso funcionó perfectamente hasta donde puedo ver en mi calendario! ¡Muchas gracias por la gran respuesta!

  • Utilizo este código, la solución de la semana fiscal puede ser diferente a la que usas, pero es interesante comparar

    dejar
        Inicio de las configuraciones
        Today = Date.From(DateTime.LocalNow()),
        Fecha de hoy
        DesdeAño = 2013,
        Establezca el año de inicio de la dimensión de fecha. las fechas comienzan a partir del 1 de enero de este año
        ToAño = 2033,
        Establezca el año final de la dimensión Fecha. las fechas terminan el 31 de diciembre de este año
        IniciodeAño Fiscal = 4,
        Establezca el número de mes que es el inicio del año financiero. ejemplo; si el inicio del año fiscal es julio, el valor es 7
        firstDayofWeek = Día.Lunes,
        establecer el día de inicio de la semana, valores: Día.Lunes, Día.Domingo....
        Fin de la configuración
        FromDate = #date(FromYear, 1, 1),
        ToDate = #date(ToYear, 12, 31),
        Source = List.Dates(FromDate, Duration.Days(ToDate - FromDate) + 1, #duration(1, 0, 0, 0)),
        #"Convertido en tabla" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"columnas renombradas" = Table.RenameColumns(#"Convertido en tabla", {{"Column1", "Fecha"}}),
        #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns", {{"Date", type date}}),
        FiscalMonthBaseIndex = 13 - StartofFiscalYear,
        adjustedFiscalMonthBaseIndex =
            if (FiscalMonthBaseIndex >= 12 o FiscalMonthBaseIndex < 0) then
                0
            más
                FiscalMonthBaseIndex,
        #"Added Custom" = Table.AddColumn(
            #"Changed Type", "FiscalBaseDate", each Date.AddMonths([Date], adjustedFiscalMonthBaseIndex)
        ),
        #"Changed Type1" = Table.TransformColumnTypes(#"Added Custom", {{"FiscalBaseDate", type date}}),
        #"Año insertado1" = Table.AddColumn(
            #"Changed Type1", "Fiscal Year", each Date.Year([FiscalBaseDate]), Int64.Type
        ),
        #"Insertado Quarter1" = Table.AddColumn(
            #"Año insertado1",
            "Trimestre fiscal",
            cada "FY" & Text.End(Text.From([Año fiscal]), 2) & "Q" & Text.From(Date.QuarterOfYear([FiscalBaseDate]))
        ),
        #"Mes insertado1" = Table.AddColumn(
            #"Cuarto insertado1",
            "Mes fiscal",
            cada
                "FY"
                    & Text.End(Text.From([Año fiscal]), 2)
                    & "m"
                    & (Text.PadStart(Text.From(Date.Month([FiscalBaseDate])), 2, "0"))
        ),
        #"Columnas eliminadas" = Table.RemoveColumns(#"Mes insertado1", {"FiscalBaseDate"}),
        #"Added Custom4" = Table.AddColumn(#"Columnas eliminadas", "Año-Mes", cada Date.ToText([Date], "yy-MM")),
        getISO8601Week = (someDate as date) =>
            dejar
                getDayOfWeek = (d como fecha) => let result = 1 + Date.DayOfWeek(d, Day.Monday) in result,
                getNaiveWeek = (inDate as date) =>
                    dejar
                        Lunes = 1, Domingo = 7
                        weekday = getDayOfWeek(inDate),
                        weekdayOfJan4th = getDayOfWeek(#date(Date.Year(inDate), 1, 4)),
                        ordinal = Date.DayOfYear(inDate),
                        naiveWeek = Number.RoundDown((ordinal - día de la semana + 10) / 7)
                    en
                        ingenuWeek,
                thisYear = Date.Year(someDate),
                previoYear = thisYear - 1,
                nwn = getNaiveWeek(someDate),
                lastWeekOfPriorYear = getNaiveWeek(#date(priorYear, 12, 28)),
                lastWeekOfThisYear = getNaiveWeek(#date(thisYear, 12, 28)),
                weekYear = if nwn < 1 then priorYear else if nwn > lastWeekOfThisYear then thisYear + 1 else thisYear,
                weekNumber = if nwn < 1 then lastWeekOfPriorYear else if nwn > lastWeekOfThisYear then 1 else nwn,
                week_dateString = Text.PadStart(Text.From(Number.RoundDown(weekNumber)), 2, "0")
            en
                Text.End(Text.From(weekYear), 2) & "W" & week_dateString,
        Custom1 = Table.AddColumn(#"Added Custom4", "Day Name", each Date.DayOfWeekName([Date]), escriba text),
        #"Added custom1" = Table.TransformColumnTypes(
            Table.AddColumn(Custom1, "Year-Week", each getISO8601Week([Date])), {{"Year-Week", type text}}
        ),
        #"Added Custom1" = Table.AddColumn(
            #"Añadido personalizado1",
            "Semana Fiscal",
            cada
                dejar
                    fiscalStartWeek = Number.FromText(Text.End(getISO8601Week(#date(Date.Year([Date]), 4, 1)), 2)),
                    semana = Number.FromText(Text.End([#"Año-Semana"], 2)),
                    lastWeekOfFiscalYear = Number.FromText(
                        Text.End(getISO8601Week(#date(Date.Year([Date]) - 1, 12, 28)), 2)
                    ),
                    lastfiscalStartWeek = Number.FromText(Text.End(getISO8601Week(#date(Date.Year([Date]) - 1, 4, 1)), 2)),
                    fiWeek =
                        if [Date] < #date(Date.Year([Date]), 4, 1) then
                            if week < fiscalStartWeek then
                                lastWeekOfFiscalYear + semana - lastfiscalStartWeek + 1
                            else if week = fiscalStartWeek then
                                if [Date] < #date(Date.Year([Date]), 4, 1)then
                                    lastWeekOfFiscalYear + semana - lastfiscalStartWeek + 1                            más
                                    semana - fiscalStartWeek + 1
                            más
                                semana - fiscalStartWeek
                        más
                            semana - fiscalStartWeek + 1
                en
                    "FY" & Text.End(Text.From([#"Año fiscal"]), 2) & "w" & Text.End(Text.From(fiWeek), 2)
        )
    en
        #"Añadido personalizado1"