Gruppierung und Schleifen

Die GROUP- und LOOP-Befehle sind zwei Möglichkeiten, wie man eine Reihe von Befehlen wiederholt ausführen kann. GROUP führt eine einzelne Iteration eines oder mehrerer Befehle für jeden Datensatz aus. LOOP führt mehrere Iterationen einiger Befehle für einen einzelnen Datensatz aus und kann nur innerhalb eines GROUP-Blocks verwendet werden.

Ein einfaches Beispiel für GROUP

Ihnen liegt eine Tabelle mit Rechnungsdaten namens VLL_Trans vor. Mit diesen Daten müssen Sie eine laufende Summe der Rechnungsbeträge berechnen:

Lieferantennummer Lieferantenname Lieferantenstadt Rechnungsnummer Rechnungsdatum Rechnungsbetrag Menge Stückkosten
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6.705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7.955,46 1.158 6,87

Um diesen Betrag zu berechnen, verwenden Sie den GROUP-Befehl. Innerhalb jeder GROUP-Iteration geschieht folgendes:

  1. Die laufende Summe bis zum aktuellen Datensatz wird berechnet.
  2. Rechnungsnummer, Betrag, Datum und laufende Summe werden in eine Ergebnistabelle extrahiert.
OPEN VLL_Trans
			
COMMENT Den Ausgangswert der laufenden Summe auf 0 setzen
ASSIGN v_laufende_Summe = 0,00

COMMENT Jeden Datensatz der Tabelle durchlaufen und die laufende Summe berechnen sowie extrahieren
GROUP
  ASSIGN v_laufende_Summe = v_laufende_Summe + Rechnungsbetrag
  EXTRACT Rechnungsnr; Rechnungsbetrag; Rechnungsdatum; v_laufende_Summe AS "Laufende Summe" TO Ergebnisse1
END

Wenn das Skript ausgeführt wird, werden die Befehle innerhalb des GROUP-Blocks für jeden Datensatz der Tabelle von oben nach unten ausgeführt. Dabei wird die laufende Summe berechnet und extrahiert. Wenn wir die Ausführung von GROUP beobachten könnten, würden wir das Folgende sehen:

Erste Iteration von GROUP: laufende Summe = 0,00 + 618,30

GROUP addiert den Rechnungsbetrag des ersten Datensatzes zur anfänglichen laufenden Summe von 0,00 und extrahiert die Felder in die Ergebnistabelle:

Lieferantennummer Lieferantenname Lieferantenstadt Rechnungsnummer Rechnungsdatum Rechnungsbetrag Menge Stückkosten
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6.705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7.955,46 1.158 6,87

Zweite Iteration von GROUP: laufende Summe = 618,30 + 6705,12

Der GROUP-Block addiert den Rechnungsbetrag des zweiten Datensatzes zur neuen laufenden Summe von 618,30 und extrahiert die Felder in die Ergebnistabelle:

Lieferantennummer Lieferantenname Lieferantenstadt Rechnungsnummer Rechnungsdatum Rechnungsbetrag Menge Stückkosten
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6.705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7.955,46 1.158 6,87

Dritte Iteration von GROUP: laufende Summe = 7323,42 + 7955,46

Der GROUP-Block addiert den Rechnungsbetrag des dritten Datensatzes zur neuen laufenden Summe von 7323,42 und extrahiert die Felder in die Ergebnistabelle:

Lieferantennummer Lieferantenname Lieferantenstadt Rechnungsnummer Rechnungsdatum Rechnungsbetrag Menge Stückkosten
11663 More Power Industries Los Angeles 5981807 2000-11-17 618,30 90 6,87
13808 NOVATECH Wholesale Des Moines 2275301 2000-11-17 6.705,12 976 6,87
12433 Koro International Sheveport 6585673 2000-11-17 7.955,46 1.158 6,87

Endgültige Ergebnistabelle

Nachdem GROUP den letzten Datensatz der Tabelle verarbeitet hat, ergibt sich die folgende Ergebnistabelle:

Rechnungsnummer Rechnungsbetrag Rechnungsdatum Laufende_Summe
5981807 618,30 2000-11-17 618,30
2275301 6.705,12 2000-11-17 7323,42
6585673 7.955,46 2000-11-17 15278,88

Unterschiedliche Fälle mit GROUP IF behandeln

Für dieselbe, oben bereits verwendete Tabelle VLL_Trans müssen Sie nun laufende Summen für drei Rechnungstypen berechnen:

  • Hoher Wert (ab 1000,00)
  • Mittlerer Wert (zwischen 100,00 und 1000,00)
  • Niedriger Wert (weniger als 100,00)

Der GROUP-Befehl beinhaltet eine IF/ELSE- Struktur zur Behandlung unterschiedlicher Fälle. Sie liefern bedingte Ausdrücke, die getestet werden sollen. Falls diese durch einen Datensatz erfüllt werden, werden die Befehle innerhalb des Blocks ausgeführt.

Wie Fälle getestet werden

Fälle werden von oben nach unten getestet, wobei ein Datensatz nur durch einen IF/ELSE-Block verarbeitet werden kann. Der erste Fall, der für einen Datensatz erfüllt wird, ist auch der Fall, der für den Datensatz ausgeführt wird:

  1. Wenn GROUP den ersten Datensatz verarbeitet, testet er für ihn die erste IF-Bedingung (Rechnungsbetrag >= 1000). Falls sie wahr ist, wird der Quellcode für diesen Fall ausgeführt, und es werden keine weiteren Fälle getestet.
  2. Wenn der erste Fall als Falsch ausgewertet wird, erfolgt ein Test der nächsten ELSE-IF-Bedingung (Rechnungsbetrag >= 100). Falls sie wahr ist, wird der Quellcode für diesen Fall ausgeführt, und es werden keine weiteren Fälle getestet.
  3. Falls abschließend keine der IF- oder ELSE-IF-Fälle wahr sind, wird der ELSE-Block für den Datensatz ausgeführt.

Hinweis

Falls ein Datensatz für mehr als einen Fall wahr ist, wird der Datensatz nur durch den ersten getesteten IF/ELSE-Block verarbeitet. Datensätze werden in einem GROUP-Befehl nie durch mehr als einen IF/ELSE-Block verarbeitet.

OPEN VLL_Trans

COMMENT Anfangswerte für laufende Summen festlegen
ASSIGN v_laufende_Summe_hoch = 0,00
ASSIGN v_laufende_Summe_mittel = 0,00
ASSIGN v_laufende_Summe_niedrig = 0,00

COMMENT verwendet GROUP IF, um unterschiedliche ASSIGN- und EXTRACT-Befehle je nach Rechnungsbetrag auszuführen
GROUP IF Rechnungsbetrag >= 1000
  ASSIGN v_laufende_Summe_hoch = v_laufende_Summe_hoch + Rechnungsbetrag
  EXTRACT Rechnungsnr; Rechnungsbetrag; Rechnungsdatum; v_laufende_Summe_hoch AS "Laufende Summe" TO Ergebnisse_hoch
ELSE IF Rechnungsbetrag >= 100
  ASSIGN v_laufende_Summe_mittel = v_laufende_Summe_mittel + Rechnungsbetrag
  EXTRACT Rechnungsnr, Rechnungsbetrag, Rechnungsdatum, v_laufende_Summe_mittel AS "Laufende Summe" TO Ergebnisse_mittel
ELSE
  ASSIGN v_laufende_Summe_niedrig = v_laufende_Summe_niedrig + Rechnungsbetrag
  EXTRACT Rechnungsnummer, Rechnungsbetrag, Rechnungsdatum, v_laufende_Summe_niedrig AS "Laufende Summe" TO Ergebnisse_niedrig
END

Wenn das Skript ausgeführt wird, testet der GROUP-Befehl den Rechnungsbetrag für jeden Datensatz. In Abhängigkeit vom Betrag wird der Datensatz zur Aktualisierung einer der drei laufenden Summen (niedrig, mittel, hoch) verwendet, und es werden drei Ergebnistabellen erstellt.

LOOP innerhalb GROUP

Wenn GROUP zur Verarbeitung der Datensätze in einer Tabelle verwendet wird, können Sie einen LOOP-Befehl zur mehrfachen Ausführung einer Reihe von Befehlen für einen einzelnen Datensatz verwenden. LOOP ist eine zweite Iteration, die innerhalb der Iteration von GROUP stattfindet. Sie wird so lange ausgeführt, bis eine von Ihnen festgelegte Testbedingung als falsch ausgewertet wird.

LOOP für das Aufteilen eines Felds verwenden

Ihnen liegt die folgende Tabelle mit Rechnungsdaten vor und Sie möchten Rechnungsbeträge pro Abteilung isolieren. Eine Rechnung kann sich auf mehr als eine Abteilung beziehen und Abteilungscodes werden durch Kommas getrennt in der Tabelle gespeichert:

Lieferantennummer Rechnungsnummer Rechnungsdatum Rechnungsbetrag Abteilungscode
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6.705,12 CCD
12433 6585673 2000-11-17 7.955,46 CCD,LMO,RDR

Um die Rechnungsbeträge pro Abteilung zu extrahieren, gehen Sie wie folgt vor:

  1. Verwenden Sie einen GROUP-Befehl, um die Tabelle Datensatz für Datensatz zu verarbeiten.
  2. Berechnen die Anzahl der Abteilungen (n) für jeden Datensatz.
  3. Verwenden Sie den LOOP-Befehl, um für den Datensatz n-mal, also für jede mit dem Datensatz verbundene Abteilung, Daten zu extrahieren.

Hinweis

Die Variable v_Zähler innerhalb von LOOP müssen Sie erhöhen. Falls Sie das nicht tun, wird der WHILE-Test stets als wahr ausgewertet und das Skript wird in einer unendlichen Schleife ausgeführt. Um unendlichen Schleifen vorzubeugen, können Sie in Ihren Skripts den Befehl SET LOOP verwenden. Weitere Informationen finden Sie unter SET-Befehl.

 

COMMENT
GROUP verwenden, um Kommas in jedem Feld für Abteilungscodes zu zählen und dadurch festzustellen, wie viele Abteilungen zu dem Datensatz gehören
Mit LOOP wird bei jedem Datensatz eine Schleife für alle Codes ausgeführt, und jeder Code wird in seinen eigenen Datensatz extrahiert
END
GROUP
  v_Abteilungszahl = OCCURS(Abteilungscode;',')
  v_Zähler = 0
  LOOP WHILE v_Zähler <= v_Abteilungszahl
    v_Abteilung = SPLIT(Abteilungscode; ','; (v_Zähler + 1))
    EXTRACT FIELDS Rechnungsnummer, Rechnungsbetrag, v_Abteilung AS "Abteilung" TO Ergebnis1
    v_Zähler = v_Zähler + 1		
  END
END

Wenn das Skript ausgeführt wird, werden die Befehle innerhalb des GROUP-Blocks für jeden Datensatz der Tabelle von oben nach unten ausgeführt. Für jeden Datensatz durchläuft der LOOP-Befehl den Datensatz pro Abteilungscode in der durch Kommas getrennten Liste und extrahiert jeweils einen Datensatz. Wenn wir die Ausführung von GROUP und LOOP beobachten könnten, würden wir das Folgende sehen:

Erste Iteration von GROUP: 2 Iterationen von LOOP

Lieferantennummer Rechnungsnummer Rechnungsdatum Rechnungsbetrag Abteilungscode
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6.705,12 CCD
12433 6585673 2000-11-17 7.955,46 CCD,LMO,RDR

Für den ersten Datensatz in der Tabelle lautet der Wert von v_Abteilungszahl 1. LOOP wird also zweimal ausgeführt:

  1. Für die erste Iteration von LOOP:
    • v_Zähler = 0
    • v_Abteilung = CCD

    Der folgende Datensatz wird extrahiert und der Wert von v_Zähler wird auf 1 erhöht. Daher wird LOOP erneut ausgeführt:

    5981807618,30CCD
  2. Für die zweite Iteration von LOOP:
    • v_Zähler = 1
    • v_Abteilung = RDR

    Der folgende Datensatz wird extrahiert und der Wert von v_Zähler wird auf 2 erhöht. Daher wird LOOP nicht erneut ausgeführt und GROUP fährt mit dem nächsten Datensatz fort:

    5981807618,30RDR

Zweite Iteration von GROUP: Eine Iteration von LOOP

Lieferantennummer Rechnungsnummer Rechnungsdatum Rechnungsbetrag Abteilungscode
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6.705,12 CCD
12433 6585673 2000-11-17 7.955,46 CCD,LMO,RDR

Für den zweiten Datensatz in der Tabelle lautet der Wert von v_Abteilungszahl 0. LOOP wird also einmal ausgeführt:

  • v_Zähler = 0
  • v_Abteilung = CCD

Der folgende Datensatz wird extrahiert und der Wert von v_Zähler wird auf 1 erhöht. Daher wird LOOP nicht erneut ausgeführt und GROUP fährt mit dem nächsten Datensatz fort:

2275301 6.705,12 CCD

Dritte Iteration von GROUP: Drei Iterationen von LOOP

Lieferantennummer Rechnungsnummer Rechnungsdatum Rechnungsbetrag Abteilungscode
11663 5981807 2000-11-17 618,30 CCD,RDR
13808 2275301 2000-11-17 6.705,12 CCD
12433 6585673 2000-11-17 7.955,46 CCD,LMO,RDR

Für den dritten Datensatz in der Tabelle lautet der Wert von v_Abteilungszahl 2. LOOP wird also dreimal ausgeführt:

  1. Für die erste Iteration von LOOP:
    • v_Zähler = 0
    • v_Abteilung = CCD

    Der folgende Datensatz wird extrahiert und der Wert von v_Zähler wird auf 1 erhöht. Daher wird LOOP erneut ausgeführt:

    65856737955,46CCD
  2. Für die zweite Iteration von LOOP:
    • v_Zähler = 1
    • v_Abteilung = LMO

    Der folgende Datensatz wird extrahiert und der Wert von v_Zähler wird auf 2 erhöht. Daher wird LOOP erneut ausgeführt:

    65856737955,46LMO
  3. Für die dritte Iteration von LOOP:
    • v_Zähler = 2
    • v_Abteilung = RDR

    Der folgende Datensatz wird extrahiert und der Wert von v_Zähler wird auf 3 erhöht. Daher wird LOOP nicht erneut ausgeführt und GROUP erreicht das Tabellenende:

    65856737955,46RDR

Endgültige Ergebnistabelle

Nachdem GROUP jeden Datensatz der Tabelle verarbeitet und LOOP alle Abteilungscodes durchlaufen hat, ergibt sich die folgende Ergebnistabelle:

Rechnungsnummer Rechnungsbetrag Abteilung
5981807 618,30 CCD
5981807 618,30 RDR
2275301 6.705,12 CCD
6585673 7.955,46 CCD
6585673 7.955,46 LMO
6585673 7.955,46 RDR