Año calendario fiscal en 4-4-5 con edición de la semana 53

Un usuario Pregunto ✅

kelvinnvl

Me he estado refiriendo a la publicación dkay84_PowerBI sobre la creación de un calendario personalizado, pero necesito editarlo según los requisitos de nuestra organización. Esta es la primera vez que uso PowerBI, por lo tanto, necesito ayuda de los compañeros aquí.

Nuestro año fiscal termina el domingo más cercano al 30 de septiembre. Semana que comienza el lunes y termina el domingo. Estamos siguiendo un modo de calendario 4-4-5.

let
    DayCount = Duration.Days(Duration.From(EndDate - StartDate)), 
    Source = List.Dates(StartDate,DayCount,#duration(1,0,0,0)), 
    TableFromList = Table.FromList(Source, Splitter.SplitByNothing()),    
    ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type date}}), 
    RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "Date"}}), 
    InsertDayName = Table.AddColumn(RenamedColumns, "DayOfWeekName", each Date.ToText([Date], "dddd"), type text), 
    InsertDayWeek = Table.AddColumn(InsertDayName, "DayInWeek", each Date.DayOfWeek([Date],1)+1), 
    InsertWeekEnding = Table.AddColumn(InsertDayWeek, "WeekEndingSunday", each Date.EndOfWeek([Date],1)),    
    InsertCurrentMonday = Table.AddColumn(InsertWeekEnding, "CurrentMonday", each Date.AddDays([Date], -Date.DayOfWeek([Date],1))),
    DateOffset = Table.AddColumn(InsertCurrentMonday, "Offset", each Date.FromText(Number.ToText(Date.Year([CurrentMonday])) & "-09-30") - [CurrentMonday]),
    #"Changed Type" = Table.TransformColumnTypes(DateOffset,{{"Offset", Int64.Type}}),
    InsertISOWeekOct1 = Table.AddColumn(#"Changed Type", "ISOWeekOct1", each if [Offset] > 3 then Date.FromText(Number.ToText(Date.Year([CurrentMonday])-1) & "-10-01") else Date.FromText(Number.ToText(Date.Year([CurrentMonday])) & "-10-01")),
    InsertISOWeekYear = Table.AddColumn(InsertISOWeekOct1, "ISOWeekYear", each Date.Year([ISOWeekOct1])),
    InsertISOWeekFirstMon = Table.AddColumn(InsertISOWeekYear, "ISOWeekFirstMon", each if [CurrentMonday] < [ISOWeekOct1] 
        then Date.AddDays([CurrentMonday],0) 
        else Date.AddDays([ISOWeekOct1], - Date.DayOfWeek([ISOWeekOct1], 1) )),
    InsertFYWeekNum = Table.AddColumn(InsertISOWeekFirstMon, "ISOWeekNum", each Number.RoundUp(((Duration.Days(Duration.From([Date] - [ISOWeekFirstMon]))+1) /7 ))),
    FiscalYear = Table.AddColumn(InsertFYWeekNum, "FY", each [ISOWeekYear]+1),
    InsertFYWeekID = Table.AddColumn(FiscalYear, "ISOWeekID", each [FY] * 100 + [ISOWeekNum], type number), 
    InsertIFYWeekNameLong = Table.AddColumn(InsertFYWeekID, "ISOWeekNameLong", each Text.From([FY]) & "-W" & Text.End( "0" & Text.From([ISOWeekNum]),2) & "-" & Date.ToText([Date],"ddd")),
    #"Renamed Columns" = Table.RenameColumns(InsertIFYWeekNameLong,{{"ISOWeekNameLong", "FYWeekNameLong"}, {"ISOWeekID", "FYWeekID"}, {"ISOWeekNum", "FYWeekNum"}, {"ISOWeekFirstMon", "FYWeekFirstMon"}}),
    #"FY Quarter" = Table.AddColumn(#"Renamed Columns", "FY Quarter", each if [FYWeekNum] <= 13 then 1 else if [FYWeekNum] >= 14 and [FYWeekNum] <= 26 then 2 else if [FYWeekNum] >= 27 and [FYWeekNum] <= 39 then 3 else 4),
    #"Week of FY Quarter" = Table.AddColumn(#"FY Quarter", "Week of Quarter", each if [FYWeekNum] <> 53 then ([FYWeekNum] - (Number.RoundUp([FYWeekNum]/13)-1) * 13) else 14),
    #"Quarter Week ID" = Table.AddColumn(#"Week of FY Quarter", "QtrWeekID", each [FY Quarter]*100+[Week of Quarter]),
    #"FY Quarter ID" = Table.AddColumn(#"Quarter Week ID", "FYQtrID", each [FY]*100+[FY Quarter]),
    #"Changed Type1" = Table.TransformColumnTypes(#"FY Quarter ID",{{"FY Quarter", Int64.Type}, {"Week of Quarter", Int64.Type}, {"QtrWeekID", Int64.Type}, {"FYQtrID", Int64.Type}}),

    fnPeriod445a = (weekNum) => let 
      Periods = 
        { 
            {(x)=>x<5,  [P=1, M="Oct"]}, 
            {(x)=>x<9,  [P=2, M="Nov"]}, 
            {(x)=>x<14, [P=3, M="Dec"]}, 
            {(x)=>x<18, [P=4, M="Jan"]}, 
            {(x)=>x<22, [P=5, M="Feb"]}, 
            {(x)=>x<27, [P=6, M="Mar"]}, 
            {(x)=>x<31, [P=7, M="Apr"]}, 
            {(x)=>x<35, [P=8, M="May"]}, 
            {(x)=>x<40, [P=9, M="Jun"]}, 
            {(x)=>x<44, [P=10, M="Jul"]}, 
            {(x)=>x<48, [P=11, M="Aug"]}, 
            {(x)=>true, [P=12, M="Sep"]} 
        }, 
      Result = List.First(List.Select(Periods, each _{0}(weekNum))){1} 
    in 
      Result,

    InsertPeriod445 = Table.AddColumn(#"Changed Type1", "Period454Record", each fnPeriod445a([FYWeekNum])),
    #"Expanded Period445Record" = Table.ExpandRecordColumn(InsertPeriod445, "Period454Record", {"M", "P"}, {"M", "P"}),
    #"Renamed Columns1" = Table.RenameColumns(#"Expanded Period445Record",{{"M", "FY Month Name"}, {"P", "FY Month ID"}}),
    #"Removed Columns" = Table.RemoveColumns(#"Renamed Columns1",{"CurrentMonday", "Offset", "ISOWeekOct1", "ISOWeekYear", "FYWeekFirstMon"})
in
    #"Removed Columns"

Funciona bien si los años son de 52 semanas pero en el año que tiene 53 semanas el número de semana sale mal.

Calendario fiscal de PowerBI.PNG

La semana siguiente a la semana 53 debería restablecerse a 1, pero en este caso saltó la semana 1 directamente a la semana 2.

Creo que se debe hacer algo en el código a continuación, lo intenté pero fue en vano.

InsertISOWeekFirstMon = Table.AddColumn(InsertISOWeekYear, "ISOWeekFirstMon", each if [CurrentMonday] < [ISOWeekOct1] 
        then Date.AddDays([CurrentMonday],0) 
        else Date.AddDays([ISOWeekOct1], - Date.DayOfWeek([ISOWeekOct1], 1) )),

cs_skit

Ese sistema https://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar en el que el año fiscal comienza y termina no al comienzo/final de un mes es realmente un fastidio

Tengo una tabla separada para mis años fiscales (con inicio y fin) y solo tengo una relación con el Calendario. Luego, aún puede poner la semana en el año fiscal como columna de cálculo en el calendario fácilmente con RELATED ()

kelvinnvl

En respuesta a cs_skit

¿Significa que esto es imposible de crear dinámicamente? ¿Necesitamos crear los datos fuera de PowerBI e importarlos?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *