Nur noch 400 Tassen Kaffee und dann ist schon wieder Wochenende
Ernst schickt mir eine Lösung zur korrekten Berechnung der Kalenderwoche nach ISO in Power Query:
Hallo Rene,
Du hast in letzter Zeit mehrere Beiträge zu Power Query gepostet.
Vor einiger Zeit habe ich eine Möglichkeit beschrieben, die Iso-Kalenderwoche mit WORD-Feldfunktionen zu berechnen. Nun habe ich den verwendeten Algorithmus auf Power Query „M“ übertragen.
Die benutzerdefinierte Funktion sieht sieht dann in der einfachen Variante wie folgt aus.
InputDaten as any) as any =>
let
Quelle = DateTime.Date(InputDaten),
Wochentag = Date.DayOfWeek(Quelle,Day.Monday)+1,
Jahr = Date.Year(Date.AddDays(Quelle, 4-Wochentag))-1
IsoKw = Number.IntegerDivide(Duration.Days(Quelle – #date(1901,1,1)) – Wochentag-Duration.Days(#date(Jahr,12,21) – #date(1901,1,1)),7)
in
IsoKw
In einer Version, in der eine Erläuterung mit angezeigt wird sieht sie wie folgt aus.
let
//Errechnet die Kalenderwoche nach ISO 8601 eines Datums.
ISOKW =
let
Function = (InputDaten as any) as any =>
let
Quelle = DateTime.Date(InputDaten),
Wochentag = Date.DayOfWeek(Quelle,Day.Monday)+1,
Jahr = Date.Year(Date.AddDays(Quelle, 4-Wochentag))-1,
FunctionResult = Number.IntegerDivide(Duration.Days(Quelle-#date(1901,1,1))-Wochentag-Duration.Days(#date(Jahr,12,21)-#date(1901,1,1)),7)
in
FunctionResult,
FunctionType = type function (InputDaten as any) as any
meta [
Documentation.Name = „ISOKW“,
Documentation.LongDescription = „Calculates the calendar week according to ISO 8601 of a date.“,
Documentation.Examples = {
[Description = „“, Code = „ISOKW(#date(2024,12,30)“, Result = „1“]
}
],
TypedFunction = Value.ReplaceType(Function, FunctionType)
in
TypedFunction
in
ISOKW
Was mir an dieser cleveren Lösung gut gefällt, ist der Teil der Metadaten. Diese Teile werden beim Selektieren der Funktion angezeigt. Große klasse!
Hallo Rene,
wie ich gesehen habe, hast Du meinen Beitrag zur Berechnung der Iso-Kalenderwoche veröffentlicht. Ich habe noch eine kurze Anmerkung zu dieser PQ-Funktion.
Die Zeile
FunctionResult = Number.IntegerDivide(Duration.Days(Quelle-#date(1901,1,1))-Wochentag-Duration.Days(#date(Jahr,12,21)-#date(1901,1,1)),7)
kann durch die kürzere Version
FunctionResult = Number.IntegerDivide(Duration.Days(Quelle-#date(Jahr,12,21))-Wochentag,7)
ersetzt werden.
Außerdem habe ich die Verwendung von Metadaten in eine weitere benutzerdefinierte Funktion (TrimAll) integriert.
Diese Funktion entfernt die führenden und nachfolgenden Leerzeichen aus einem Textwert und ersetzt alle Mehrfachleerzeichen durch ein einzelnes Leerzeichen.
___________________________
Let
// Erstellt von Ernst-A. Börgener
//Entfernt die führenden und nachfolgenden Leerzeichen aus einem Textwert und ersetzt alle mehrfachen Leerzeichen durch ein einzelnes Leerzeichen.
TrimAll =
let
Function = (InputDaten as any) as any =>
let
FunctionResult = try Text.Combine(List.RemoveItems(Text.Split(InputDaten, “ „),{„“}),“ „) otherwise InputDaten //Funktion TrimAll
in
FunctionResult,
FunctionType = type function (InputDaten as any) as any
meta [
Documentation.Name = „TrimAll“,
Documentation.LongDescription = „Removes the leading and trailing spaces from a text value and replaces all multiple spaces with a single space.“,
Documentation.Examples = {
[Description = „“, Code = „TrimAll(„“ Removes the leading and trailing spaces from a text value and replaces all multiple spaces with a single space. „“)“, Result = „““Removes the leading and trailing spaces from a text value and replaces all multiple spaces with a single space.“““]
}
],
TypedFunction = Value.ReplaceType(Function, FunctionType)
in
TypedFunction
in
TrimAll
_____________________
Um mit dieser Funktion eine ganze Tabelle zu bearbeiten reicht folgender Aufruf.
= Table.TransformColumns(Quelle,{}, TrimAll)
Durch die leere Liste als zweiten Parameter werden alle Spalten der Tabelle abgearbeitet.