Für jeden Eintrag wiederholen (Schleife)

Siehe auch: Schleife abbrechen

Ereignisaktion - Kurzfassung

Zweck: Wiederholt einen Block von Ereignisaktionen für eine Liste von Einträgen oder eine bestimmte Anzahl von Wiederholungen.

Die Ereignisaktion Für jeden Eintrag wiederholen (Schleife) wiederholt einen Block von Ereignisaktionen entweder für eine Liste von Einträgen oder für eine durch einen Zahlenwert definierte Anzahl von Wiederholungen.

Für die Ereignisaktionen stehen innerhalb der Schleife folgende Variablen zur Verfügung, denen das System zu Beginn jeder Iteration automatisch Werte zuweist:

Variablenname

Typ

automatische Wertzuweisung am Beginn einer Iteration

$index

Integer

der aktuelle Iterationsindex beginnend bei 0

$length

Integer

die Anzahl der geplanten Wiederholungen (abhängig vom Parameter Wertauflöser für Einträge)

$first

Boolean

true in der ersten Iteration ($index=0), sonst false

$last

Boolean

true in der letzten planmäßigen Iteration, sonst false

HINWEISE

  • Innerhalb der Schleife können diesen Variablen durch Ereignisaktionen (z. B. Setze Wert oder Wert als Variable speichern) abweichende Werte zugewiesen werden.

  • Am Ende einer Iteration wird der aktuelle Wert für den Iterationsindex ($index) mit dem zu Beginn der Iteration gültigen Wert verglichen. Sollte der aktuelle Wert den vorherigen unterschreiten, wird der Variablen der vorherige höhere Wert zugewiesen. Der Iterationsindex kann also nur vorwärts und nicht rückwärts "versetzt" werden, was eine Endlosschleife bewirken könnte.

  • Wertzuweisungen an die Variable $length während einer Iteration gehen am Ende der Iteration grundsätzlich "verloren". Sofern eine Schleife über eine Liste von Einträgen ausgeführt wird, wird der Wert für $length nur einmalig (vor Beginn der ersten Iteration) ermittelt. Manipulationen der Liste durch das Entfernen oder Hinzufügen von Einträgen während der Iterationen ist zwar grundsätzlich möglich, verändert aber den Wert von $length nicht (s. u.: Parameter Liste klonen zum Manipulieren).

  • Solange der aktuelle (ggf. manipulierte) Iterationsindex beim Abschluss die Bedingung $index < ($length - 1) erfüllt, wird die Schleife mit einer neuen Iteration mit einem um 1 erhöhten Iterationsindex fortgesetzt.

    • Eine Schleife kann daher nach dem Abschluss der aktuellen Iteration abgebrochen werden, indem als Iterationsindex ein Wert zugewiesen wird, der die Bedingung $index < ($length - 1) nicht erfüllt. Unter pragmatische Gesichtspunkten wird dazu häufig der Wert $length verwendet.

    • Um eine Schleife "sofort" (ohne Beendigung der der aktuellen Iteration) abzubrechen, kann die Ereignisaktion Schleife abbrechen ausgeführt werden.

  • Die vom System verwalteten Variablen gelten ausschließlich innerhalb der Schleife. Eine Ereignisbehandlung, die auf eine Für jeden Eintrag wiederholen (Schleife) folgt, kann also z. B. nicht über die Variable $length auf die Anzahl der ausgeführten Wiederholungen zugreifen. Damit eine entsprechende Information nach Abschluss der Schleife zur Verfügung steht, muss der entsprechende Wert durch eine Ereignisaktion innerhalb der Schleife explizit einer Variablen zugewiesen werden, die das System nicht automatisch belegt.

Konfiguration

images/download/attachments/177911614/image-2024-9-16_15-43-15-version-1-modificationdate-1726494194494-api-v2.png

Über den optionalen Parameter Objekt in Variable speichern kann der Name einer Variablen definiert werden, die den Zugriff auf das äußere Bezugsobjekt, in dessen Kontext die Für jeden Eintrag wiederholen (Schleife)-Ereignisaktion insgesamt ausgeführt wird, innerhalb der Schleife ermöglicht.

  • Die entsprechende Wertzuweisung gilt nur innerhalb der Schleife. Eine ggf. bestehende Zuweisung für dieselbe Variable außerhalb der Schleife wird dadurch nur vorübergehend überlagert.

  • Der Parameter ist nur relevant, wenn die Schleife über eine Liste von Einträgen iterieren soll, da dann innerhalb der Schleife in jeder Iteration ein anderer Eintrag als Bezugsobjekt gilt.

  • Soll dagegen lediglich eine vorgegebene Anzahl von Wiederholungen (s. Parameter Wertauflöser für Einträge) ausgeführt werden, dann gilt das äußere Bezugsobjekt auch innerhalb der Schleife als Bezugsobjekt.

Der optionale Parameter Wertauflöser für Einträge legt das Iterationsschema für die Schleife fest. Dabei sind folgende Fälle zu unterscheiden:

  1. Der Parameter definiert einen Wertauflöser, der zur Laufzeit einen Zahlenwert (>0) zurückgibt. Dann bestimmt dieser Wert - ggf. nach Abrunden zur Ganzzahl - die Anzahl der auszuführenden Iterationen der Schleife. In allen Iterationen gilt das äußere Bezugsobjekt als Bezugsobjekt.

  2. Der Parameter definiert einen Wertauflöser, der zur Laufzeit eine Liste von Einträgen zurückgibt. Dann iteriert die Schleife über diese Einträge. Innerhalb der Schleife gilt in jeder Iteration ein anderer Eintrag als Bezugsobjekt.

  3. Der Parameter definiert keinen Wertauflöser ("kein Wert"). Dann wird das äußere Bezugsobjekt an die Schleife übergeben. Handelt es sich dabei um eine Liste von Einträgen, iteriert die Schleife über diese Einträge.

HINWEIS◄ Handelt es sich im Fall 3 beim äußeren Bezugsobjekt nicht um eine Liste, wird die Schleife nicht ausgeführt. Der Versuch einen einzelnen Zahlenwert (im Sinn von Fall 1) als äußeres Bezugsobjekt an eine Schleife zu übergeben scheitert sogar mit einer Fehlermeldung.

Die Option Liste klonen zum Manipulieren sollte verwendet werden, wenn sich die Schliefe auf eine Liste von Einträgen (Fall 2 oder 3) bezieht, die im Zuge der Iterationen manipuliert werden soll, indem Einträge entfernt oder hinzugefügt werden:

  • Ist die Option gesetzt, dann wird vor dem Beginn der Schleife ein "Klon" der Liste erstellt, über den dann iteriert wird. Manipulationen an der Liste durch das Hinzufügen oder Entfernen von Einträgen (s. Liste modifizieren bzw. Listenwert) haben dann keinen Einfluss auf das Iterationsschema.

  • Ist die Option nicht gesetzt, dann sind Listenmanipulationen ebenfalls möglich. Sie können aber zu unerwarteten Ergebnissen oder Fehlern beim Verarbeiten der Schleife führen, weil das Iterationsschema durch Veränderungen an der Liste beeinträchtigt werden kann. Das Hinzufügen oder Entfernen von Einträgen verschiebt bestehende Einträge und ändert ggf. die "Länge" der Liste, während weder der Iterationsindex ($index) noch die Anzahl der geplanten Wiederholungen ($length) automatisch auf solche Veränderungen eingehen. Werden z. B. mehr Einträge einer Liste entfernt als hinzugefügt, greift das Iterationsschema irgendwann ins Leere, wenn der nächste Eintrag für eine neue Iteration zugewiesen werden soll, was einen Fehler verursacht. Dieser kann zwar abgefangen werden, in dem die Schleife durch eine Anpassung des Iterationsindex (z. B. Zuweisung $index=$length per Setze Wert) vorzeitig beendet wird. Allerdings ist es nicht möglich die Anzahl der auszuführenden Iterationen per Zugriff auf $length gezielt zu erhöhen, wenn innerhalb der Schleife mehr Einträge hinzugefügt als entfernt werden sollten.

Unterhalb der Parameter können die Ereignisaktionen, die in der Schleife ausgeführt werden sollen, über das images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/add.svg -Symbol hinzugefügt werden.

Beispiele

Schleife über eine vorgegebene Anzahl von Wiederholungen

Innerhalb einer Schleife soll ein Eigenes Aktionsevent "Container belegen" für eine gegebene Sendung so oft ausgelöst werden, dass die Anzahl der dadurch belegten Container zur Anzahl der für die Sendung ermittelten Euro-Paletten passt.

Die Ereignisaktion Für jeden Eintrag wiederholen (Schleife) wird innerhalb einer Ereignisbehandlung für das Geschäftsobjekt "Sendung" wie rechts abgebildet parametriert:

  • Im Parameter Wertauflöser für Einträge wird ein Berechne Wert-Wertauflöser verwendet, um die hier sehr einfache Formel zur Berechnung der Anzahl der benötigten Container festzulegen. Der Wert einer Variablen pallets, die hier die Anzahl der Euro-Paletten in der Sendung definiert, wird durch die Anzahl der Paletten pro Container (hier: 11) dividiert und das Ergebnis per ceil()-Funktion aufgerundet.

    WICHTIG◄ Per Verkettung muss über einen Objekt-Feld-Wertauflöser auf das Feld "Wert" (value) aus dem berechneten Datentyp "Zahl mit Einheit" abgestellt werden, da die "Zahl mit Einheit" nicht automatisch in eine Ganzzahl (für die Iterationen) umgewandelt wird.

  • Im Block für die Ereignisaktionen wird eine Eigenes Aktionsevent auslösen (Aktion)-Ereignisaktion für das Ereignis "Container belegen" ausgeführt. Als Bezugsobjekt gilt innerhalb der Schleife das äußere Bezugsobjekt, hier die "Sendung", die hier auch an das Ereignis weitergegeben werden soll.

images/download/attachments/177911614/image-2024-9-17_7-50-31-version-1-modificationdate-1726552231323-api-v2.png

Schleife über eine Liste von Einträgen

Wenn einer Sendung ein bestimmter Arbeitsstatus zugeordnet wird, soll eine Ereignisbehandlung die Namen aller für diese Sendung gesetzten Kennzeichenattribute in je einer Benachrichtigung anzeigen.

Innerhalb einer Ereignisbehandlung, die durch den betreffenden Arbeitsstatus ausgelöst wird, wird eine Für jeden Eintrag wiederholen (Schleife)-Ereignisaktion wie rechts abgebildet konfiguriert:

  • Der Parameter Sendung in Variable speichern wird verwendet, damit über den Variablennamen shipment beim Erstellen der Benachrichtigung auf die Sendung zugegriffen werden kann.


  • Im Parameter Wertauflöser für Einträge wird zunächst per Attribut (Wertauflöser)-Wertauflöser eine Liste aller "Kennzeichenattribute" beschafft.

  • Der verkettete Regel-Listen-Resolver soll dann aus dieser Liste Alle Werte als Liste zurückgeben, für die der "Kennzeichenwert" (flagValue) den Wert true hat, also das Kennzeichen gesetzt ist.

  • Aus der Liste der gesetzten Kennzeichenattribute wird per Verkettung mit einem Sammle Werte-Wertauflöser eine Liste der entsprechenden Kennzeichentypen (s. Kennzeichentyp) gewonnen, über die die Schleife iterieren soll.

Das Bezugsobjekt innerhalb der Schleife ist also jeweils ein Kennzeichentyp.

images/download/attachments/177911614/image2021-2-24_3-34-34-version-1-modificationdate-1726494187767-api-v2.png

Im inneren der Schleife wir eine Hinweis anzeigen (Popup)-Ereignisaktion wie rechts abgebildet konfiguriert:

  • Als Typ der Benachrichtigung wird hier "Warnung" ausgewählt, da innerhalb der Sendung Kennzeichen nur für "kritische" Merkmale zugewiesen werden.

  • Im Titel-Content-Builder greift ein Wert aus Sprachverwaltung-Wertauflöser auf die Sprachverwaltung zu, der als Bundle die Klasse "Kennzeichentyp" spezifiziert. Innerhalb dieses Bundles werden die Kennzeichentypen durch den Namen identifiziert, der innerhalb der Schleife direkt dem Feld "Name" (name) des "Kennzeichentyp"-Eintrags entnommen werden kann. Über je einen Objekt-Feld-Wertauflöser (im Bild zugeklappt) wird dieser Name" als Resource und auch als Standardwert zugewiesen, so dass für einen nicht lokalisierten Kennzeichentyp der interne Name erscheint.

  • Im Meldung-Content-Builder wird hier zur Demonstration auf das Feld "ID" (id) der Sendung zugegriffen, was innerhalb der Schleife nur über die Variable shipment möglich ist, da als Bezugsobjekt ansonsten der vom Wertauflöser für Einträge definierte Kennzeichentyp gilt.

ANMERKUNG◄ Anstelle bzw. in Verbindung mit der internen ID der Sendung könnte z. B. auch der Wert eines Referenzattributs mit einer Auftragsnummer oder ein anderes Merkmal ausgegeben werden, das die Sendung hinreichend identifiziert.

images/download/attachments/177911614/image-2024-9-17_8-56-24-version-1-modificationdate-1726556183716-api-v2.png

Laufzeitbeispiel:

images/download/attachments/177911614/image2021-2-24_4-3-51-version-1-modificationdate-1726494187762-api-v2.png

Schleife mit "Abbruchkriterium"

Eine Erfassungsmaske für Sendungsdaten soll Benutzern die Möglichkeit anbieten, die Gewichte einer Reihe von Packstücken für dieselbe Sendungsposition in einem kleinen PopUp-Dialog zu erfassen. In der Sendungsposition soll letztendlich nur das aggregierte Gesamtgewicht gespeichert werden.

Wenn die "Gewichtserfassung" für eine Position gestartet wird, soll der rechts abgebildete Dialog solange zyklisch aufgerufen werden, um Gewichte einzelner Packstücke abzufragen, bis der Benutzer den Dialog mit dem Standardwert von "0", also ohne ein Gewicht einzutragen, über den "OK"-Button quittiert.

Wie im Screenshot rechts zu sehen, soll in der Titelleiste jeweils das bisher erfasste Gesamtgewicht ausgewiesen werden, während im Dialog selbst eine Auflistung der bisherigen Eingaben je Packstück zeilenweise zur Kontrolle erscheinen soll.

ANMERKUNG◄ Es wird davon ausgegangen, dass der Anwender nur ganzzahlige Angaben zum Gewicht tätigt. Auf besondere Vorkehrungen was das Eingabeformat angeht wird für das Beispiel verzichtet.

images/download/attachments/177911614/image2021-2-24_14-48-12-version-1-modificationdate-1726494187760-api-v2.png

Konfiguration:

Über ein Eigenes Aktionsevent, das z. B. beim Klick auf einen Button in der Positionsebene der Erfassungsmaske ausgelöst werden kann, wird eine Ereignisbehandlung angestoßen, die die rechts abgebildete Konfiguration für ein Für jeden Eintrag wiederholen (Schleife)-Ereignisaktion enthält:

  • Über den Parameter Sendungsposition in Variable speichern wird die als Bezugsobjekt anliegende Sendungsposition in der Variablen targetLineItem gespeichert.

  • Im Wertauflöser für Einträge wird ein Long-Wert von 999 für die Anzahl der Wiederholungen der Schleife definiert, damit die Schleife "endlos" (bis zum Erreichen der Abbruchbedingung) wiederholt wird.

  • Innerhalb der Schleife wird eine Setze Wert-Ereignisaktion ausgeführt, die bereits die wichtigsten "Operationen" der Prozedur beinhaltet. Der Berechne Wert-Wertauflöser (rechts) addiert zum Wert der Variablen total_weight_kgs den Wert der Variablen item_kgs, deren Definition (unterhalb des Berechnungsausdrucks) einen Wertauflöser vom Typ Benutzereingabe verwendet, um vom Benutzer ein konkretes Packstückgewicht per Dialog abzufragen.

  • Details zur Benutzereingabe sollen hier nicht ausführlicher vorgestellt werden. Allerdings ist für das Beispiel wesentlich, dass der konkrete, einzelne Rückgabewert aus der Benutzereingabe per Verkettung an einen Wert als Variable speichern-Wertauflöser übergeben wird, der ihn der Variablen input zuweist. Auf diese Variable bezieht sich weiter unten das Abbruchkriterium für die Schleife.

  • Die per Dialog eingegebenen Zahlenwerte sollen bis zum Abbruch der Schleife von in der Variablen total_weight_kgs aufaddiert werden. Dazu muss aus dem Datentyp "Zahl mit Einheit" per Objekt-Feld-Wertauflöser der eigentliche "Wert" (value) extrahiert werden.

images/download/attachments/177911614/image2021-2-24_15-24-59-version-1-modificationdate-1726494187754-api-v2.png

  • Direkt nach dem Aufaddieren der Gewichtsangabe, wird eine weitere Setze Wert-Ereignisaktion ausgeführt, um den einzelnen Rückgabewert der Benutzereingabe nach einem ähnlichen Prinzip von Iteration zu Iteration an die String-Variablen log anzuhängen. Über diese Variable gelangt die "Verlaufshistorie" der Eingaben in die Meldung des Benutzereingabe-Wertauflösers (s. Beispiel oben). Mit jeder Iteration wird über einen Textverkettung-Wertauflöser (rechts) der Wert von input als Bestandteil einer mit einem literalen Text strukturierten formatierten neuen Textzeile hinzugefügt, so dass der Benutzer wie bei einem Tischrechner mit Drucker bereits verrechnete Eingaben schrittweise nachverfolgen kann.

images/download/attachments/177911614/image2021-2-24_15-37-27-version-1-modificationdate-1726494187749-api-v2.png

  • Anschließend wird eine Wenn Dann Sonst-Ereignisaktion verwendet, um das Abbruchkriterium - nämlich die Eingabe des Standardwerts "0" - zu überprüfen. Dies leistet der Regeltyp Variablenregel, wie rechts zu sehen.
    HINWEIS◄ Da die Variablenregel nur bei exakter Übereinstimmung mit der Zeichenfolge "0" bestanden wird, hätte die Eingabe von "000" oder Textzeichen ohne Wert keinen terminierenden Effekt.

  • Der Abbruch der Schleife (vor der 999. Iteration) wird erreicht, indem der Schleifenvariablen $index der Wert der Schleifenvariablen $length zugewiesen wird, so dass keine weitere Iteration erfolgt. Mit dieser Zuweisung funktioniert der Abbruch auch dann zuverlässig und "wartungsfrei", wenn die Anzahl der Wiederholungen für die Schleife später einmal erhöht werden sollte.

  • Das Abbruchkriterium wird erst am Ende der aktuellen Iteration der Schleife wirksam, so dass die folgende Ereignisaktion (Hinweis anzeigen (Popup)) für die Benachrichtigung des Benutzers über das erfasste Gesamtgewicht für die aktuelle Position auf jeden Fall noch ausgeführt wird. Dabei kann über die Variable targetLineItem ggf. auf Details zur Position zugegriffen werden, etwa um die Positionsnummer (lineItemId) in der Titelleiste der Meldung anzuzeigen.

  • Auch die Zuweisung des Gesamtgewichts als Wert für ein geeignetes typisiertes Attribut auf Positionsebene (hier nicht dargestellt) kann sich auf die Variable targetLineItem beziehen, wenn sie innerhalb der Schleife ausgeführt werden soll. Das ist im Beispiel aber nicht erforderlich, da der Wert der Variablen total_weight_kgs auch über den Kontext der Schleife hinaus gilt und auch nach Abschluss der Schleife und ggf. weiteren Prüfungen oder Rückfragen in die Position übertragen werden kann.

images/download/attachments/177911614/image2021-2-24_15-45-8-version-1-modificationdate-1726494187747-api-v2.png