Lambda Expressions in Power Query - Teil 2 - Kontext Interaktion

Lambda Expressions in Power Query - Teil 2 - Kontext Interaktion

Lambda Expressions in Power Query - Teil 2 - Kontext Interaktion

Teil 2 dieser Serie beschäftigt sich mit der Frage, wie äußere Power Query Funktion und Lambda Expression miteinander interagieren.

Globale Syntax:

<outer_powerquery_function> ( ( <variable>, n ) => <lambda_expression> )

Die Details der Interaktion zwischen äußerer und innerer Funktion sind nicht Teil der MSDN Power Query Dokumentation und es liegt an Ihnen als Power Query Entwickler, sich eine Vorstellung davon zu machen, was diese unsichtbare Interaktion jeweils sein könnte. Nachdem Sie ein Vorstellung entwickelt haben, müssen sie diese verifizieren, um Schritt für Schritt zu einem tieferen Verständnis zu gelangen. Wenn Sie das Gefühl haben, die Funktion verstanden zu haben, sollten Sie in der Lage sein, die folgenden vier Fragen zu beantworten:

  1. Welche Daten werden durch die äußere Funktion zurückgegeben? (Diese Frage wird durch die MSDN-Syntax Dokumentation beantwortet)
  2. Welche Daten werden von der äußeren Funktion an die Lambda Variable übergeben?
  3. Welche Art von Daten werden seitens der äußeren Funktion als Rückgabewert der Lambda Expression erwartet?
  4. Wie ist die Lambda Expression in die Interna der äußeren Funktion eingebettet? Oder anders ausgedrückt: was "macht" die äußere Funktion mit den Daten der Lambda Expression?

In diesem Artikel werden drei Power Query Funktionen für die Demonstration benutzt. Alle Funktionen haben Eines gemeinsam: Sie alle wenden Transformations-Logik auf die Input-Daten an:

  • List.Transform
  • Table.TransformRows
  • Record.TransformFields

Allgemeines

MSDN-Syntax Hilfe:


List.Transform (
   list as list,
   transform as function) as list
Table.TransformRows(
   table as table,
   transform as function) as list
Record.TransformFields(
   record as record,
   transformOperations as list) as record
Transformation

Alle drei oben erwähnten Power Query Funktionen führen ETL Aufgaben durch. "ETL" steht für "Extract / Transform / Load":

  • E(xtract). Extraktion der Daten aus der Quelle.
  • T(ransform). Anwenden von Logik zur Modifikation der Daten. Ableiten von neuen Daten auf Grund der Quell-Daten.
  • L(oad). Ablegen der Daten in das Ziel.

Die Lambda Expression innerhalb des Power Query Codes ist für den Transformations-Teil verantwortlich.

Iteration

Alle drei Funktionen sind Iteratoren. Aus der OOP-Sicht implementieren sie alle eine Schleife:

  • List.Transform(). Foreach ( item i in <list> ) { … }
  • Table.TransformRows(). Foreach ( Row r in <table>.Rows ) { … }
  • Record.TransformFields(). Foreach ( Field f in <record>.Fields)
Result of type “Iterable”

Alle drei Funktionen liefern ein Objekt vom Typ "iterable" zurück:

  • List.Transform() as list
  • Table.TransformRows() as list
  • Record.TransformFields() as record. A record ist eine Liste von Feldern
Argument vom Typ “function”

Alle drei Funktionen verfügen über ein Argument vom Typ "function":

  • List.Transform( … , transform as function ). Einzelne Funktion oder Lambda Expression.
  • Table.TransformRows ( … , transform as function ). Einzelne Funktion oder Lambda Expression.
  • Record.TransformFields ( …, transformOperations as list, … ). Mehrere Funktionen oder Lambda Expressions.

List.Transform

Beispiel 1
Schritt 1

Eine Liste von drei Nummern wird deklariert.

Schritt 2

Auf der linken Seite: Jede Nummer der Liste wird succesive der Lambda Variablen zugewiesen. Auf der rechten Seite: die Lambda Expression multipliziert die Nummer mit 10. Das Ergebnis wird in das Result Set eingefügt.

Abbildung 1 - List.Transform mit einfachem Lambda-Ausdruck
Abbildung 2 - List.Transform mit einfachem Lambda-Ausdruck - Ergebnis
Beispiel 2

Die Eingabe ist eine Liste mit Nummern, die Schleife läuft drei Mal. In jedem Schleifen-Durchgang wird der konstante Wert "test" in das Result Set eingefügt.

Abbildung 3 - List.Transform mit einem konstanten Ausdruck
Abbildung 4 - List.Transform mit einem konstanten Ausdruck - Ergebnis
Beispiel 3

Die Eingabe besteht aus einer Liste von Nummern, das Ergebnis ist eine Liste von Records. Abbildung 7 zeigt Record 1.

Abbildung 5 - List.Transform: Ergebnis ist eine Liste von Datensätzen
Abbildung 6 - Liste der Datensätze
Abbildung 7 - Datensatz 1
Beispiel 4

Die Eingabe ist eine Liste von Records. Unter Berücksichtigung dieser Tatsache wird die Lambda Variable "record" genannt. Die Lambda Expression auf der rechten Seite gibt ebenfalls einen Wert vom Typ Record zurück. Beides - "Id" und "Name" sind vom Eingabe-Record abgeleitet.

Abbildung 8 - List.Transform: Die Eingabe ist eine Liste von Datensätzen
Abbildung 9 - List.Transform: Die Ausgabe ist eine Liste von Datensätzen
Abbildung 10 - Datensatz 1
Beispiel 5

Die Eingabe besteht aus einer Liste von Listen. Unter Berücksichtigung dieser Tatsache ist der Name "list" für die Lambda Variable vergeben. Die Lambda Expression auf der rechten Seite berechnet die Anzahl der Elemente für jede Liste. Das erste Element ist eine Liste mit Nummern zwischen 1 und 3, das zweite Element ist eine Liste mit Buchstaben von "A" bis "G" und das dritte Element ist eine Liste mit Datums-Werten zwischen 01.07.2022 bis 10.07.2022.

Abbildung 11 - List.Transform: Die Eingabe ist eine Liste von Listen
Abbildung 12 - List.Transform: Die Ausgabe ist eine Liste von Einzelwerten, die jeweils die Anzahl der Listenelemente darstellen

Table.TransformRows

Beispiel 1

Die Eingabe besteht aus einer Tabelle mit ihren Zeilen. Man könnte an dieser Stelle auch sagen: Die Eingabe besteht aus einer Liste von Records. Allerdings würde eine Liste von Records nicht verlangen, dass die Records das gleiche Layout haben. Grundsätzlich kann eine Liste ja sogar Elemente von unterschiedlichen Typen beinhalten. Bei einer Tabelle dagegen ist durch das Tabellen-Schema das gleiche Layout für jede Zeile festgelegt:

Abbildung 13 - Table.TransformRows: Die Eingabe ist eine Tabelle mit ihren Zeilen
Schritt 1 / Inhalt von table0:
Abbildung 14 - Table.TransformRows: Inhalt der Variablen "table0"
Schritt 2 / list0.

Für jede Zeile wird ein neuer Record in das Result Set eingefügt. Das Ergebnis ist also eine Liste von Records:

Abbildung 15 - Table.TransformRows: Das Ergebnis ist eine Liste von Datensätzen

Inhalt der ersten Zeile:

Abbildung 16 - Table.TransformRows: erster Datensatz
Schritt 3 / table 1.

Eine Herausforderung bei der Verwendung von "Table.TransformRows" besteht darin, die Liste der Records zurück zu konvertieren in eine Tabelle. Diese Aufgabe wird mit "Table.FromRecords" gelöst:

Abbildung 17 - Table.TransformRows: Datensatzliste in Tabelle umwandeln

Record.TransformFields

Beispiel 1

Schritt 1

Ein Record mit dem Namen "record0" mit vier Spalten wird deklariert.

Schritt 2

Das zweite Argument für "Record.TransformFields" ist eine Liste von Funktionen bzw. Lambda Expression. Im folgenden Beispiel werden zwei Lambda Expression zugewiesen, eine für die Spalte "Amount" und eine weitere für die Spalte "Date". Jede Spalte des Eingabe-Records, die nicht in der Liste der Transformationen erwähnt wird, wird in den Ergebnis-Record ohne Änderung übernommen. Dies trifft auf "CustId" und "CustName" zu. Jede Spalte, die in der Liste der Transformation erwähnt ist, wird zunächst transformiert und dann in den Ergebnis-Record eingefügt.

Abbildung 17 - Record.TransformFields: eine Liste von Lambda-Ausdrücken wird angewendet
Abbildung 18 - Record.TransformFields: eine Liste von Lambda-Ausdrücken wird angewendet
Abbildung 19 - Record.TransformFields: 2 Felder wurden umgewandelt (Amount := Bruttobetrag, Date := Fälligkeitsdatum)

Die Syntax-Hilfe der MSDN enthält ein Beispiel, in dem die Funktion "Record.TransformFields" benutzt wird, um die Typen von Spalten zu modifizieren:

Abbildung 20 - MSDN-Syntaxhilfe für "Record.TransformFields"

Bezüglich des MSDN-Beispiels kann man sich vorstellen, dass der Ausdruck "Number.FromText" von der Power Query Engine zunächst expandiert wird zu der Lambda Expression "(fieldValue) => Number.FromText (fieldValue)".

Mein Beispiel oben ist generischer. Es zeigt, dass die BuiltIn Funktion "Record.TransformFields" nicht nur dazu gedacht ist, Spalten-Typen zu transformieren, sondern dass Lambda Expressions - zusammen mit "Record.TransformFields" - alle mögliche Transformationen bewerkstelligen können.

Im Allgemeinen könnte das Beispiel auch dazu anregen, grundsätzlich darüber nachzudenken, welches Potential die Kombination von BuiltIn-Funktionen und Lambda Expressions abseits der vorkonfigurierten Beispiele bietet.
Artikel und Copyright von Lukas Hillesheim (https://blog.n-dimensions.de)

Wenn Sie weitere Informationen wünschen, empfehlen wir:

Ihr Kommentar zum Artikel

"Lambda Expressions in Power Query - Teil 2 - Kontext Interaktion"

Wir freuen uns über Ihren Kommentar und antworten so schnell es geht!

Das Angebot von "HECKER CONSULTING" richtet sich ausschließlich an Unternehmen und Behörden (iSv § 14 BGB). Verbraucher (§ 13 BGB) sind vom Vertragsschluss ausgeschlossen. Mit Absendung der Anfrage bestätigt der Anfragende, dass er nicht als Verbraucher, sondern in gewerblicher Tätigkeit handelt. § 312i Abs. 1 S. 1 Nr. 1-3 und S. 2 BGB (Pflichten im elektronischen Geschäftsverkehr) finden keine Anwendung.

Vielen Dank, Ihr Kommentar wurde empfangen!
Beim Absenden des Formulars ist etwas schief gelaufen.
Unsere Beratungs-Leistungen für Das Thema

Power Platform

Wir erweitern ständig unser Beratungsportfolio. Über 300 Beratungsleistungen haben wir für Sie im Programm. Selbstverständlich lassen sich die einzelnen Themen kombinieren. So erhalten Sie genau die Beratung, die Sie wünschen und brauchen

Mehr IT-, Online-, Digital-Beratungsleistungen anzeigen >>
Mehr IT-, Online-, Digital-Beratungsleistungen anzeigen >>

Kontaktanfrage

Das Angebot von "HECKER CONSULTING" richtet sich ausschließlich an Unternehmen und Behörden (iSv § 14 BGB). Verbraucher (§ 13 BGB) sind vom Vertragsschluss ausgeschlossen. Mit Absendung der Anfrage bestätigt der Anfragende, dass er nicht als Verbraucher, sondern in gewerblicher Tätigkeit handelt. § 312i Abs. 1 S. 1 Nr. 1-3 und S. 2 BGB (Pflichten im elektronischen Geschäftsverkehr) finden keine Anwendung.

Vielen Dank, Ihre Nachricht wurde empfangen!
Beim Absenden des Formulars ist etwas schief gelaufen.
WEITERE INFORMATIONEN AUS UNSEREM BLOG ZUM THEMA

Power Platform

Aktuelle und interessante Themen und Beiträge für Sie zusammengetragen und aufbereitet.

Mehr IT-, Online-, Digital-Neuigkeiten anzeigen >>
Nach oben