Show TOC Anfang des Inhaltsbereichs

Funktionsdokumentation Schleifenkonstrukte  Dokument im Navigationsbaum lokalisieren

Verwendung

DO-Schleife

      Anweisungen, die zwischen DO und ENDDO stehen, werden beliebig oft wiederholt.

      Die Schleife wird durch die Anweisung EXIT unterbrochen.

      Die Zahl der Schleifendurchläufe kann durch eine Konstante oder eine Variable vom Typ I gesteuert werden: DO <n> TIMES.

FOREACH-Schleife

      Mit der Anweisung FOREACH <Variable>. wird über alle Werte einer Variablen iteriert. Es handelt sich um die Merkmalswerte, die in den Bewegungsdaten des aktuellen Datenobjektes vorhanden sind (also nicht unbedingt um alle Stammdatenwerte, die für das Merkmal definiert sind). Dieses Schleifenkonstrukt wird durch die Anweisung ENDFOR abgeschlossen.

      Die Merkmalswerte werden aufsteigend sortiert abgearbeitet. Wenn Sie Kombinationen von Merkmalswerten benötigen, können Sie die Anweisung in der Form FOREACH <Variable1, Variable2>. einsetzen. Dieses Konstrukt liefert die vorhandenen Kombinationen von Merkmalswerten des aktuellen Datenobjektes.

Hinweis

Anmerkungen zum Laufzeitverhalten: Vor dem Eintritt in die FOREACH-Schleife werden alle im Datenobjekt vorhandenen Merkmalswerte gesammelt und sortiert, danach werden diese Merkmalswerte in der FOREACH-Schleife nacheinander geliefert. Wenn in der Schleife ein neuer Wert erzeugt und in die Bewegungsdaten geschrieben wird, wird dieser erst bei der nächsten FOREACH-Schleife berücksichtigt.

Das FOREACH-Konstrukt kostet viel Rechenzeit und sollte möglichst sparsam eingesetzt werden. Überlegen Sie auch immer sorgsam, ob Sie anstelle von zwei geschachtelten Schleifen nur ein Konstrukt der Art FOREACH <Variable1, Variable2>. benutzen können, da das Laufzeitverhalten hierdurch verbessert wird.

      Weitere Varianten der FOREACH-Schleife:

       Mit FOREACH <Variable> IN REFDATA kann über alle Merkmalswerte, die in den Referenzdaten vorhanden sind, iteriert werden.

       Mit FOREACH <Variable> IN SELECTION kann über alle Merkmalswerte des aktiven Planungsfilters iteriert werden.

       Mit FOREACH <Variable> IN VARIABLE Var kann über alle Merkmalswerte einer globalen Variablen Var iteriert werden.

Beispiel

Das folgende Beispiel zeigt ein schlechtes Programm:

DATA COUNTRY TYPE 0BPS_CNTRY.

DATA PRODUCT TYPE 0BPS_PRODU.

DATA FISCPER TYPE 0FISCPER.

FOREACH COUNTRY.

FOREACH PRODUCT.

FOREACH FISCPER.

{COUNTRY, PRODUCT, FISCPER} = {COUNTRY, PRODUCT, FISCPER} * 2.

ENDFOR.

ENDFOR.

ENDFOR.

Das folgende Beispiel zeigt ein besseres Programm: Hier wird darauf geachtet, dass neue Werte nur dann erzeugt werden, wenn sie von Null verschieden sind. Da die Menge der Werte, die in den Variablen PRODUCT und FISCPER auftauchen können, nicht aktualisiert werden muss, spart dies sehr viel Rechenzeit. Eine solche Aktualisierung tritt jedes mal dann ein, wenn die beiden Schleifen FOREACH PRODUCT. und FOREACH FISCPER.neu durchlaufen werden. Wenn durch eine Formel Nullwerte erzeugt werden, schreibt das System diese nicht in den internen Puffer zurück. Diese Nullwerte sind also für nachfolgende Planungsfunktionen oder die manuelle Planung nicht sichtbar. Andererseits wird auch nicht vorhandenen Daten der Wert 0 zugewiesen. Nullwerte müssen also nicht explizit erzeugt werden.

DATA COUNTRY TYPE 0BPS_CNTRY.

DATA PRODUCT TYPE 0BPS_PRODU.

DATA FISCPER TYPE 0FISCPER.

FOREACH COUNTRY.

FOREACH PRODUCT.

FOREACH FISCPER.

IF {COUNTRY, PRODUCT, FISCPER} <> 0.

{COUNTRY, PRODUCT, FISCPER} = {COUNTRY, PRODUCT, FISCPER} * 2.

ENDIF.

ENDFOR.

ENDFOR.

ENDFOR.

Abschließend zeigt das folgende Beispiel den empfohlenen Weg zu programmieren:

DATA COUNTRY TYPE 0BPS_CNTRY.

DATA PRODUCT TYPE 0BPS_PRODU.

DATA FISCPER TYPE 0FISCPER.

FOREACH COUNTRY, PRODUCT, FISCPER.

IF NOT {COUNTRY, PRODUCT, FISCPER} IS INITIAL.

{COUNTRY, PRODUCT, FISCPER} = {COUNTRY, PRODUCT, FISCPER} * 2.

ENDIF.

ENDFOR.

Ende des Inhaltsbereichs