Power Query, List.Accumulate, For-Next Schleifen
Mit List.Accumulate() kann eine For-Next Schleife mit der Sprache Language M erstellt werden.
Eine For-Next Schleife ist eine Schleifen-Anweisung, mit deren Hilfe eine darin enthaltene Anweisung eine festgelegte Anzahl von Malen wiederholt / ausgeführt wird. Die Anzahl der Ausführungen ist somit vor dem Start der Ausführung bekannt bzw. berechenbar.
In Visual Basic for Applications sieht eine For-Next Schleife wie folgt aus:
For counter = start to end
[Anweisung(en)]
Next counter
Ein ähnliches Verhalten kann mit List.Accumulate() erzeugt werden.
Die Syntax lautet dabei wie folgt:
List.Accumulate(list as list, seed as any, accumulator as any) as any
Parameter 1 list
Als ersten Parameter erwartet die Funktion eine Liste. Hier wird über die Anzahl der Listen Elemente die Anzahl der Schleifendurchläufe festgelegt.
Parameter 2 seed
seed ist der Startwert der Schleife. Da er (seed) vom Typ Any ist, kann er neben Zahlen beliebige andere Werte (Tables, List, Records) als Startwert aufnehmen.
Parameter 3 accumulator
Der letzte Parameter von List.Accumulate() ist eine Funktion. Hier wird der eigentliche Ausdruck hinterlegt, der bei jedem Schleifendurchlauf ausgeführt wird.
Die Funktion accumulate weißt dabei 2 Parameter auf:
state := es wird das Zwischenergebnis jedes vorangegangenen Schleifendurchlaufs je Iteration gespeichert.
current := enthält den aktuellen Wert (Listen Element) der übergebenen Liste (Parameter 1) der jeweiligen Iteration.
Die Funktion List.Accumulate() ist ebenfalls vom Typ Any, d.h. sie kann neben Zahlen auch komplexe Datentypen wie zB Tables, Lists oder Records zurückgeben.
Praxisbeispiel, wofür kann man List.Accumulate() nutzen ?
Ermittlung von Wochentagen
--- SCHNIPP
(weekday as text) =>
let
ListOfDates=List.Dates(#date(2010, 1, 1),
Duration.Days(Duration.From(#date(2018, 6, 17)-#date(2010, 1, 1))),
#duration(1, 0, 0, 0)
),
Loop=List.Accumulate(ListOfDates,
0,
(state, current) => if Date.DayOfWeekName(current) = weekday
then state + 1
else state
)
in
Loop
--- SCHNAPP
siehe auch Anzahl Zeichen in einem Text ermitteln
weiterführende Informationen
Eine For-Next Schleife ist eine Schleifen-Anweisung, mit deren Hilfe eine darin enthaltene Anweisung eine festgelegte Anzahl von Malen wiederholt / ausgeführt wird. Die Anzahl der Ausführungen ist somit vor dem Start der Ausführung bekannt bzw. berechenbar.
In Visual Basic for Applications sieht eine For-Next Schleife wie folgt aus:
For counter = start to end
[Anweisung(en)]
Next counter
Ein ähnliches Verhalten kann mit List.Accumulate() erzeugt werden.
Die Syntax lautet dabei wie folgt:
List.Accumulate(list as list, seed as any, accumulator as any) as any
Parameter 1 list
Als ersten Parameter erwartet die Funktion eine Liste. Hier wird über die Anzahl der Listen Elemente die Anzahl der Schleifendurchläufe festgelegt.
Parameter 2 seed
seed ist der Startwert der Schleife. Da er (seed) vom Typ Any ist, kann er neben Zahlen beliebige andere Werte (Tables, List, Records) als Startwert aufnehmen.
Parameter 3 accumulator
Der letzte Parameter von List.Accumulate() ist eine Funktion. Hier wird der eigentliche Ausdruck hinterlegt, der bei jedem Schleifendurchlauf ausgeführt wird.
Die Funktion accumulate weißt dabei 2 Parameter auf:
state := es wird das Zwischenergebnis jedes vorangegangenen Schleifendurchlaufs je Iteration gespeichert.
current := enthält den aktuellen Wert (Listen Element) der übergebenen Liste (Parameter 1) der jeweiligen Iteration.
Die Funktion List.Accumulate() ist ebenfalls vom Typ Any, d.h. sie kann neben Zahlen auch komplexe Datentypen wie zB Tables, Lists oder Records zurückgeben.
Praxisbeispiel, wofür kann man List.Accumulate() nutzen ?
Ermittlung von Wochentagen
--- SCHNIPP
(weekday as text) =>
let
ListOfDates=List.Dates(#date(2010, 1, 1),
Duration.Days(Duration.From(#date(2018, 6, 17)-#date(2010, 1, 1))),
#duration(1, 0, 0, 0)
),
Loop=List.Accumulate(ListOfDates,
0,
(state, current) => if Date.DayOfWeekName(current) = weekday
then state + 1
else state
)
in
Loop
--- SCHNAPP
siehe auch Anzahl Zeichen in einem Text ermitteln
weiterführende Informationen
Kommentare
Kommentar veröffentlichen