Nachdem es uns nun gelungen ist, eine Verbindung zwischen unserem lokalen Dateisystem und Azure herzustellen und den Inhalt unserer flachen Datei mit den Prognosewerten zu erhalten, wollen wir nun sehen, wie wir einen weiteren Schritt machen und die gesamte Lösung vervollständigen können.

Wir haben den ersten Teil in dem Wissen abgeschlossen, dass wir noch einige weitere Schritte hinzufügen müssen:

  • Hinzufügen einer Validierung zum Dateinamen, um unerwünschte Dateien herauszufiltern, die in unserem Ordner abgelegt werden und unsere Logic App auslösen
  • Konvertierung des Dateiinhalts in einen lesbaren JSON-Body, mit dem wir arbeiten können
  • Konvertierung von Wochennummern in Datumsangaben, die den ersten Arbeitstag der Woche darstellen, an dem eine Prognose für einen Artikel erstellt werden kann (der SAP Business One Service Layer kann nur Datumsangaben akzeptieren, wenn er die Aktualisierung der Wochenprognose aufruft, im Gegensatz zur B1-Benutzeroberfläche).
  • Generierung der Nutzlast für die Vorhersage und Einbindung der Vorhersagegenerierung in unsere Lösung
  • Abdeckung einiger Konzepte zur Fehlerbehandlung

 

Lassen Sie uns jeden dieser Schritte angehen und unsere Lösung fertigstellen.

 

Hinzufügen einer Validierung zum Dateinamen

Zunächst wollen wir eine Validierung hinzufügen, die den Dateinamen überprüft, der in unserem lokalen Ordner abgelegt wird, und sicherstellen, dass wir eine Namenskonvention einhalten.

Dies erspart uns unnötige Ausführungen für Dateinamen, die nicht dem entsprechen, was das Unternehmen beschlossen hat, einzuhalten.

Nehmen wir an, dass unser Dateiname zumindest die Zeichenfolge „Forecast“ enthalten soll. Wir würden einen Kontrollstecker hinzufügen, der dies überprüft:

 

Wenn die Prüfung ‚True‘ ergibt, tritt unser Ablauf in Kraft; andernfalls brechen wir den Lauf ab.

 

Konvertierung des Dateiinhalts in ein lesbares JSON

Der Ansatz wäre hier, ein JSON
Array
zu erstellen, das sowohl die CSV-Kopfzeilen als auch die Elemente enthält.

Der erste Schritt besteht darin, eine „Compose“-Aktion wie folgt hinzuzufügen:

Wichtiger Hinweis zu den Zeilenenden: Ich habe die
decodeUriComponent
Funktion verwendet, um die CSV zu teilen.

decodeUriComponent(‚%0A‘)

Dies stellt ein neues Zeilenvorschubzeichen (LF) dar, das oft als \n angezeigt wird. Dies ist der Unix-Standard.

 

CSV-Dateien, die unter Windows erstellt werden, können dieses Format verwenden, verwenden aber oft einen Wagenrücklauf und Zeilenvorschub (CR+LF). Dies wird als \r\n dargestellt.

Der obige Split-Ausdruck funktioniert auch mit CR+LF, aber es bleiben \r Zeichen in den Daten übrig. Der korrekte Ausdruck für die Aufteilung auf ein CR+LF ist:

decodeUriComponent(‚%0D%0A‘)

 

Wenn Sie Ihre CSV-Datei in Notepad laden, können Sie das Format Ihrer Datei in der unteren rechten Ecke leicht erkennen. Es wird entweder „Unix (LF)“ oder „Windows (CR LF)“ angezeigt.

Die Funktion „Split“ gibt ein Array zurück und erfordert einen String als erstes Argument. Wir verwenden diese Funktion häufig in dieser Lösung, da sie sehr leistungsfähig ist.

Die einzigartige Struktur unserer CSV-Datei erfordert, dass wir die Dateiköpfe und -elemente in zwei Arrays aufteilen.

Der Grund dafür ist, daß jeder Positionscode 12 Prognoseperioden hat, und wir für jede Periode eine andere Menge pflegen müssen.

Beachten Sie, dass ich die Funktion zuerst in meinem Ausdruck verwendet habe, um nur das erste Array-Element abzurufen, das durch die Funktion „Split“ erstellt wurde.

Um nur die Zeilen zu erhalten, habe ich die Funktion „Skip“ in meiner „Compose“-Aktion verwendet und meinen Konnektor gezwungen, das erste Element (= die Kopfzeilen) zu ignorieren, so dass ich nur die Zeilen habe.

Wenn wir unseren Ablauf ausführen, werden wir sehen, dass die letzte Zeile eine leere Zeichenkette zurückgibt:

Um die Ausgabe zu bereinigen, würden wir eine „Filter Array“-Aktion hinzufügen und sicherstellen, dass die Funktion „length“ nur Elemente auswählt, die größer als Null (0) sind:

Unsere folgende Aktion wäre „Auswählen“, wobei die Quelle das Array „FilterRows“ wäre.

Beachten Sie, dass die Aktion „Auswählen“ nur Arrays als Eingabe akzeptiert und diese in einer internen Schleife durchläuft, um alle Vorkommen eines bestimmten Elements anzuzeigen:

Die obige Aktion „Auswählen“ ist der eigentliche Clou. Wir müssen die Nutzlast so umgestalten, dass wir für jeden Artikelcode die prognostizierte Menge für jede Wochennummer erhalten, wobei wir in unserem Szenario insgesamt 12 Wochen haben.

Das ist genau der Grund, warum ich die Kopfzeile von den Elementen entkoppelt habe – wir müssen die Position jeder Periode in unserem Kopfzeilen-Array zählen und ihr die entsprechende Menge aus dem Element-Array zuordnen und nebenbei einige „Datenbereinigungen/-umwandlungen“ vornehmen:

  • Unsere Wochennummern haben ein unerwünschtes Zeichen (‚W‘), das wir loswerden müssen
  • Unsere Wochennummern können nicht so verwendet werden, wie sie in der Datei erscheinen, da SAP Business One erwartet, für eine
    wöchentliche Prognose

    Modus
    den
    ersten Arbeitstag
    für jede Woche, die in unserer flachen Datei enthalten ist.

Sehen Sie sich die Ausgabe unserer Aktion „FilterRows“ an:

Wir müssen die Position jedes Elements bestimmen, aber nicht bevor wir jede Iteration der Aktion „Auswählen“ in ein Array verwandeln.

Der „Item Code“ ist der erste, also ist die Position 0. Sie wird dann wie folgt aussehen:

trim(split(item(), ‚,‘)
[0]
)

Dasselbe gilt für die Menge:

split(item(), ‚,‘)
[

2………13

]

Die Ausgabe unserer „Select“-Anweisung würde wie folgt aussehen:

 

Wir haben es geschafft, ein aussagekräftiges JSON-Array zu erstellen, mit dem wir erfolgreich arbeiten können!

Wenn Sie die SAP Business One Service Layer API-Referenz lesen (gehen Sie zu https://<hostname>:50000) wobei <Hostname> der Name des Servers ist, auf dem Sie Ihre SAP Business One Server Components installiert haben, werden Sie feststellen, dass Sie ein MRP weekly Forecast-Objekt erfolgreich patchen könnenmüssen Sie die folgende Nutzlast in den Anfragekörper aufnehmen:

Hier müssen wir unserer Lösung mehr Magie verleihen, um dies zu erreichen.

Unsere Datei enthält 13 Perioden, die die Woche # repräsentieren, so dass wir eine Schleife durch jedes unserer Elemente durchlaufen müssten, aber wir müssen auch eine weitere Schleife verschachteln, die 13 Mal läuft und die Prognosewerte für jede der Perioden # zuweisen.

Zu diesem Zweck erstellen wir eine globale Variable namens
varIDStep
die als Zähler in unserem Szenario dienen wird in unserem Szenario dient, und setzen sie auf ‚1‘.
:

Fügen wir nun zwei verschachtelte Schleifen hinzu – eine „Do-Until“-Schleife und eine „For each“-Schleife:

Das bedeutet, dass wir für jeden Artikelcode 12 Mal iterieren müssten, um die Werte zuzuweisen.

Jedes Mal, wenn die innere Schleife („For each“) die Ausführung beendet (denken Sie daran, dass sie jeden unserer Elementcodes durchläuft!), wird unsere Variable mit der Aktion „Increment variable“ inkrementiert:

Wenn der Zählerstand 13 ist, existiert auch die äußere Schleife („Until-Do“).

Um unsere Lösung weiter zu optimieren und unnötige Ausführungen zu vermeiden, würde ich empfehlen, eine Bedingung hinzuzufügen, die Iterationen ignoriert, bei denen die Menge gleich „null“ ist:

Beachten Sie, wie ich die Funktion „concat“ verwendet habe, um die „Menge“ und den aktuellen Iterationswert unserer Variablen (Zähler) aneinanderzureihen, so dass es unserer obigen „Select“-Definition entspricht:

items(‚For_each‘)?[concat(‚Quantity‘,variables(‚varIDStep‘))]

Damit wird sichergestellt, dass ich immer auf die
aktuellen
Wert von „Menge“ oder „Zeitraum“ verweisen.

Mit dieser Methode wird die folgende Aktion darin bestehen, die Wochendarstellung, die in unsere Datei geschrieben wurde, in ein Datum umzuwandeln, das SAP Business One für die Buchung der Prognosewerte verwenden kann (denken Sie daran, es ist der erste Arbeitstag der Woche).

Ich werde nicht zu sehr in die Tiefe gehen, wie diese Umwandlung erfolgt, aber Sie können sich gerne an mich wenden, wenn Sie mehr über diese zusätzliche Logik erfahren möchten.

Ich werde kurz erwähnen, wie man „Relative Pfade“ verwendet, um einen anderen Sub-Workflow aufzurufen und einen Parameter an diesen Ablauf zu übergeben.

Beachten Sie, wie ich den relativen Pfad auf dem Konnektor definiert habe:

/Periode/{Period}

Der Parameter wird über einen HTTP-Aufruf von unserem Haupt-Workflow auf folgende Weise übergeben:

Auch hier verwenden wir die Methode „concat“, um auf die
aktuellen
Periode innerhalb der Schleife, die wir in ein Datum umwandeln wollen.

Sobald das Datum konvertiert ist, können wir die Ausgabe vorbereiten und die Änderung auslösen:

Das Endergebnis ist, dass die Prognosewerte in den SAP Business One Client übertragen werden:

Wir könnten möglicherweise (hauptsächlich für eine produktive Lösung) einige Benutzerinteraktionsschritte hinzufügen, die den Einreicher am Ende des Laufs über einen Erfolg/Misserfolg informieren und unsere Lösung etwas „benutzerfreundlicher“ machen.

Eine Möglichkeit besteht darin, eine Array-Variable zu verwenden, die zur Laufzeit aus der Schleife heraus aufgefüllt wird, sobald wir einen Aufruf an die Dienstebene tätigen:

Wir können dann den Statuscode der erhaltenen Antwort überprüfen und entscheiden, welches Array wir auffüllen wollen:

Wir könnten dann den „Send an email (V2)“-Konnektor in Kombination mit der „length“-Funktion verwenden, um die Länge jedes Arrays außerhalb der äußeren Schleife zu bestimmen (was der Anzahl der erfolgreichen/fehlgeschlagenen Datensätze entspricht):

Zusammenfassung

Nun, da wir haben unsere Lösung fertiggestellt haben, können wir können weiter Erweiterungsszenarien erstellen die diese „Legacy“-Ansätze für die Arbeit mit lokalen Dateisystemen mit neueren Ansätzen kombinieren, die uns helfen, eine erfolgreiche Integration in unsere SAP Business One-Systeme aufzubauen.

Sie können die von uns erstellte Vorlage verwenden, um auf ähnliche Fälle zu reagieren, in denen ein Benutzer ein Ereignis auslöst, das mit geringem Aufwand weiter genutzt und in unser ERP eingebettet wird.

Mit diesem Setup können Sie entkoppelte Geschäftserweiterungen entwickeln mit
Logic Apps
mit allen Tools und Diensten, die von der
Microsoft Azure-Plattform
in der Sprache, die Sie oder Ihr Anwendungsfall am besten passt.

Wenn Sie an weiteren Anwendungsfällen interessiert sind, die von einem solchen entkoppelten Setup profitieren könnten, wenden Sie sich bitte an mich, und ich würde mich freuen, auch von Ihren Ideen zu hören.

 

Schließen Sie sich der SAP Business One Community an und fügen Sie Ihre Gedanken, Kommentare und Ideen hinzu!