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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.