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.
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?