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







Kommentare

Beliebte Posts aus diesem Blog

Vergleich mit 2 Bedingungen, INDEX(), VERGLEICH()

Dropdown Liste mit Mehrfachauswahl

nützliche Text Funktionen in Power Query