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
Ü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:
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.
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.
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
-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:
|
|
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:
Das Bezugsobjekt innerhalb der Schleife ist also jeweils ein Kennzeichentyp. |
|
Im inneren der Schleife wir eine Hinweis anzeigen (Popup)-Ereignisaktion wie rechts abgebildet konfiguriert:
►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. |
|
Laufzeitbeispiel:
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. |
|
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:
|
|
|
|
|
|