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:
- Die laufende Summe bis zum aktuellen Datensatz wird berechnet.
- 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:
- 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.
- 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.
- 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:
- Verwenden Sie einen GROUP-Befehl, um die Tabelle Datensatz für Datensatz zu verarbeiten.
- Berechnen die Anzahl der Abteilungen (n) für jeden Datensatz.
- 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:
- 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:
5981807 618,30 CCD - 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:
5981807 618,30 RDR
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:
- 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:
6585673 7955,46 CCD - 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:
6585673 7955,46 LMO - 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:
6585673 7955,46 RDR
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 |