Logic Apps: Tipps und Best Practice

post-thumb

Mithilfe von Logic Apps können schnell und einfach auch komplexere und umfangreiche Verarbeitungsprozesse abgebildet werden. Dabei stellen Logic Apps eine Reihe an Aktionen (engl. Actions) und somit Konnektoren für eine viele unterschiedliche Systeme (u.a. HTTP-Anfragen, SFTP, SharePoint, Excel, SQL-Server usw.) und Verarbeitungsschritte (u.a. Definition von Variablen, IF-Bedingung, Schleifen usw.) bereit. Allerdings fehlten mir in der Vergangenheit Funktionen, welche sich durch die Verwendung von Aktionen und Workflowausdrucksfunktionen ergänzen lässt. Diese Tipps und Best Practices möchte ich in diesem Blogbeitrag genauer vorstellen.

In diesem Beitrag gehe ich nicht auf die genaue Funktionsweise einzelner Aktionen ein, oder wie eine Logic App im allgemeinen erstellt bzw. entwickelt oder provisioniert (CI) werden kann. Teile der hier vorgestellten Lösungen lassen sich Grundsätzlich auch in Power Automate umsetzen, wurden hierfür aber nicht primär entwickelt/ erprobt.

Variablen in einer Schleife

Bei der Verwendung von Variablen in einer Schleife erhält man oft nicht das gewünschte Verhalten, da die Schleife Standardmäßig nicht Sequentiell sondern parallel ausgeführt wird. Eine parallele Ausführung hat den Vorteil, dass die Gesamtausführungszeit zwar reduziert wird, der Wert der Variablen allerdings nicht für den jeweiligen Durchlauf/ Iteration die korrekten Daten hält, wenn diese innerhalb der Schleife zugewiesen wird. Dies liegt daran, dass die Variable außerhalb der Schleife initialisiert wird und somit global zur Verfügung steht.

Um jedoch trotzdem Variablen innerhalb einer Schleife zuweisen zu können und den Wert des jeweiligen Schleifendurchlaufs zu erhalten, gibt es zwei Lösungsmöglichkeiten:

  1. Zum einen lässt sich eine sogenannte „Concurrency Control“ aktivieren und auf 1 setzen. Dies hat zwar den Vorteil, dass der Variablenwert immer dem korrekten Durchlauf zugeordnet wird, allerdings verlängert das so aber auch die Gesamtlaufzeit der Logic App. Die Gesamtausführungszeit wird damit deutlich verlängert.

  1. Eine weitere Möglichkeit ist es die Compose-Aktion zu verwenden. Hierbei kann innerhalb der Schleife ein JSON-Compose aufgebaut werden, um auf die gewünschten Werte aus z.B. HTTP-Aufrufen zuzugreifen, diese zu modifizieren und innerhalb der Schleife verwenden zu können. Hierbei kann die volle Parallelisierung der Schleife angewandt werden.

Logging von Entitäten

Bei der Verarbeitung von Datensätzen und dem Anwenden von den ETL-Typischen Transformationen bis hin zum letztlichen Speichern in ein Zielsystem, kann ein umfangreiches Logging sehr von Vorteil sein. Hierbei sind insbesondere fachliche Einblicke interessant (aktuelles Element in der Verarbeitung in der Schleife usw.). Allerdings bietet Logic Apps z.B. bei einem Schleifendurchlauf keinerlei weitere Infos zum jeweiligen Element, durch welches gerade durchiteriert wurde.

Um eine bessere Übersicht zu erhalten empfiehlt es sich hier zu Beginn einer Schleife eine Compose-Aktion mit dem Inhalt des aktuellen Elements auszuführen. Hierdurch sieht man im jeweiligen lauf direkt, welche Werte dieses Element vorwies.

Falls innerhalb einer Schleife eine IF-Bedingung angewandt wird, um beispielsweise importierende Daten vorher zu validieren bzw. zu prüfen, empfiehlt es sich auch hier diese vor der Bedingung in einer Compose-Aktion ausgeben zu lassen. Bei deinem späteren durchlauf hat man lediglich das evaluierte Ergebnis der Werte (true oder false).

Um für die spätere Übersicht einfach eine Liste aller erfolgreicher und nicht erfolgreicher Import-Vorgänge für die Basisdaten eingesehen werden kann, kann eine Array-Variable verwendet werden. Diese können zu Beginn der Logic App erstellt werden und Elemente werden dann innerhalb der Schleife zugewiesen. Wenn man dann z.B. eine IF-Bedingung für die Prüfung der Validierung verwendet, kann im jeweiligen Fall (valider oder invalider Datensatz) das Element der entsprechender Array-Variable zugewiesen werden. Hierbei ist darauf zu achten, dass die Run-After-Bedingung der entsprechenden Aktionen korrekt gesetzt sind. Hierzu müssen alle Fälle angehakt sein, damit dieser Schritt (Element dem Array Hinzufügen) auch durchgeführt wird. Am Ende des Durchlaufes muss das jeweilige Array noch via Compose-Aktion ausgegeben werden. Auch hier ist das korrekte Setzen der Run-After-Bedingung notwendig, um eine Ausführung sicherzustellen. Wenn nun ein weiterer Logic App-Durchlauf stattfindet kann sowohl im Schleifendurchlauf, als auch am Ende des Logic-App-Durchlaufs eine Ergebnis-Liste für Positiv- und Negativ-Fälle betrachtet werden.

Unterschiedliche Trigger bei Recurrent-Trigger

Logic Apps bieten mehrere Arten von Trigger (Auslöser). So können wiederkehrende Aufgaben eingeplant und ausgeführt werden. Es können unterschiedliche Tage und Uhrzeiten ausgewählt werden. Der Nachteil eines solchen Triggers ist u.a. die mangelnde Flexibilität einer Abweichenden Uhrzeit.

Wenn ich z.B. die Ausführung montags, mittwochs und freitags ausführen möchte, und hierzu für Montag und Mittwoch lediglich 18 Uhr eingeplant habe, für Freitag aber die Ausführung auf 14 Uhr einstellen möchte, so ist dies nicht ohne weiteres (oder durch komplexe Angabe der Trigger-Parameter) möglich. Die Konfiguration wird stets als UND interpretiert, d.h. im Standard wäre die Ausführung montags, mittwochs und freitags um 14 Uhr UND 18 Uhr, jeweils an den angegeben Tagen also zwei Mal pro Tag.

Dieses Verhalten kann umgangen werden, indem die Ausführungslogik von der Trigger-Logik getrennt wird. Man benötigt also zwei Trigger-Logic-Apps und die Logic App, welche die Verarbeitungslogik beinhaltet. So definiert man in den Trigger-Logic-Apps die jeweiligen Tage und Uhrzeit und fügt eine Logic App-Aktion, womit man eine weitere Ausführung einer Logic App triggert. In unserem Beispiel existiert also eine Trigger-Logic App mit den Tagen für Montag und Mittwoch für 18 Uhr und eine weitere für Freitag um 14 Uhr.

| | |

Verwendung von Workflowausdrucksfunktionen (Workflow Expression Functions)

Mit den Workflowausdrücken können inline in Aktionen Modifikationen für Werte durchgeführt werden. So existieren einige hilfreiche Funktionen wie z.B. die setProperty()-Funktion, welche eine Eigenschaft samt Wert einem bestehenden JSON-Objekt hinzufügt. Im weiteren Verlauf gehe ich auf besondere Anwendungsfälle ein und zeige welche Kombination solcher Workflowausdrucksfunktionen verwendet werden können, um Anforderungen hiermit umzusetzen.

Ausgabe eines nicht leeren Strings

Wenn man in einem Verarbeitungsprozess der Logic App bestimmte Werte ermitteln muss, welche z.B. importiert werden sollen, eignen sich hierzu einige Funktionen hierzu. Wenn man beispielsweise Werte aus einer Excel-Tabelle importieren möchte und die Basis z.B. drei Spalten die mögliche Quelle für einen Wert im Zielsystem sind, sollte hier nach der Reihe geprüft werden, ob die Spalte einen Wert besitzt. Falls dies nicht der Fall ist, sollte zur nächsten Spalte gegangen werden, bis hin zum setzen des NULL-Wertes, wenn keine der drei Spalten einen Wert geführt hat.

Hierzu eignet sich zum einen die Funktion coalesce, welche immer den ersten Nicht-NULL-Wert der Eingabewerte ausgibt. Dabei können beliebig viele Eingaben an die Funktion zur Prüfung übergeben werden.

Wenn wir erneut unser Beispiel mit drei Spalten betrachten kann eine mögliche Lösung so aussehen:

coalesce(if(not(empty(items('forEachExcelItem')?['Spalte1'])), items('forEachExcelItem')?['Spalte1'], null), if(not(empty(items('forEachExcelItem')?['Spalte2'])), items('forEachExcelItem')?['Spalte2'], null), if(not(empty(items('forEachExcelItem')?['Spalte3'])),items('forEachExcelItem')?['Spalte3'], null))

Es wird mit der Funktion if, not und empty geprüft, ob die Eingabe Leer ist. Falls dies der Fall ist, wird hier ein NULL-Wert gesetzt, falls nicht, wird der Wert ausgegeben. Die Coalesce-Funktion gibt dann entsprechend den ersten Wert aus, welcher nicht NULL ist.

Ermittlung des aktuellen Quartals

Wenn man bei der Verarbeitung in der Logic App mit Datums und Quartalswerten arbeiten möchte hat man im Wesentlichen zwei Optionen: entweder man erstellt einen Endpunkt (z.B. mit Azure Functions), welche entsprechende Quartal für ein Quelldatum ermittelt und zurückliefert, oder man errechnet den Wert via Workflowausdrucksfunktion.

Wir möchten uns hier einen umfangreichen Ausdruck betrachten, welcher als Eingabe einen Monat erwartet. Dieser kann z.B. durch die Funktion int(utcNow(‚MM‘)) ermittelt und in eine Variable (month) geschrieben werden.

if(and(greaterOrEquals(variables('month'),1), lessOrEquals(variables('month'),3)), 1, if(and(greaterOrEquals(variables('month'),4), lessOrEquals(variables('month'),6)), 2, if(and(greaterOrEquals(variables('month'),7), lessOrEquals(variables('month'),9)), 3, if(and(greaterOrEquals(variables('month'),10), lessOrEquals(variables('month'),12)),4,0))))

Im Prinzip werden hier in einem verschachtelten IF-Ausdruck die Quartalsunter- und -obergrenzen verglichen (mithilfe von „greaterOrEquals“ und „lessOrEquals“). Dies wird für jeweils 4 Quartale durchgeführt. Falls der Monat fälschlicherweise kleiner als 1 oder größer als 12 angegeben wurde, wird das Quartal als 0 gesetzt (Fehlerhafter Wert). Das Ergebnis kann man nun erneut in eine Variable speichern und im weiteren Verlauf der Logic App wiederverwenden.

Fazit

Diese Beispiele sollen als Grundlage dienen, um die unterschiedlichen Möglichkeiten von Logic Apps aufzuzeigen. Natürlich stellt diese Übersicht nur einen Bruchteil der Funktionen dar. Außerdem wollte ich durch die Darstellung der Workflowausdrucksfunktionen zeigen, das vermeintliche einfache Funktionen (z.B. ermitteln des aktuellen Quartals) einen umfangreichen Ausdruck erfordern. Hierbei sollte man die Wartbarkeit im Auge behalten, denn desto verschachtelter Ausdrücke verwendet werden, desto schwieriger wird es diese später zum einen zu Warten und zum anderen evtl. zu erweitern (siehe Beispiel der Ausgabe eines nicht leeren Strings). Dennoch bieten Workflowausdrucksfunktionen eine sehr gute Möglichkeit Operationen direkt in der Logic App durchzuführen, ohne direkt einen externen (REST-) Endpunkt implementieren zu müssen.

Der Objektkultur-Newsletter

Mit unserem Newsletter informieren wir Sie stets über die neuesten Blogbeiträge,
Webcasts und weiteren spannende Themen rund um die Digitalisierung.

Newsletter abonnieren