Funktion
Die CONTROL-Klausel definiert die Datenfelder, die als Gruppenwechseldatenfelder der Liste die Gruppenhierarchie und damit die hierarchische Strukturierung der Liste bestimmen.
Format
{CONTROL | CONTROLS} {IS | ARE} {{datenname-1}... | FINAL [datenname-1]...}
Syntaxregeln
In der CONTROL-Klausel dürfen nicht mehr als 31 Datennamen angegeben werden, wobei die Angabe FINAL mitzuzählen ist, falls sie angegeben wurde.
datenname-1... darf gekennzeichnet, aber nicht indiziert sein.
Einem Datennamen darf kein Datenfeld untergeordnet sein, dessen Größe in der OCCURS-Klausel als variabel definiert ist.
datenname-1... darf nicht in der REPORT SECTION definiert sein. Er muss entweder in der FILE SECTION, LOCAL-STORAGE SECTION oder WORKING-STORAGE SECTION definiert sein. Wenn sichergestellt ist, dass das aufgerufene Programm in der Zeit von der Initialisierung bis einschließlich der Beendigung der Listenerstellung ohne Unterbrechung im Arbeitsspeicher zur Verfügung steht, dann ist es auch zulässig, dass ein in der CONTROL-Klausel angegebener Datenname in der LINKAGE SECTION des gerufenen Programms definiert ist.
Das verwendete Datenfeld darf maximal 256 Zeichen lang sein.
Jeder datenname-1 muss ein anderes Datenfeld bezeichnen.
Zwei verschiedene Wiederholungen von datenname-1 dürfen sich auch nicht auf Datenfelder beziehen, die mittels Redefinition denselben Speicherplatz belegen.
Ein Gruppenwechseldatenfeld ist ein in einer CONTROL-Klausel angegebenes Datenfeld, das bei Ausführung einer auf dieselbe Liste bezogenen GENERATE-Anweisung dahingehend untersucht wird, ob sich sein Wert gegenüber der zuletzt ausgeführten GENERATE-Anweisung (zur selben Liste) geändert hat.
Aus der Feststellung einer solchen Wertänderung resultiert ein Gruppenwechsel („control break“), d.h. es werden bestimmte (unten beschriebene) Aktionen vor der Erstellung der durch die GENERATE-Anweisung angegebenen Postenleiste ausgeführt. Liegen bei der Ausführung der GENERATE-Anweisung Wertänderungen bei mehreren Gruppenwechseldatenfeldern vor, wird immer die hierarchisch höchstrangige Wertänderung bestimmt, auf die sich alle Gruppenwechsel-Aussagen (wie Gruppenwechsel und Gruppenwechselstufe) beziehen.
- FINAL, datenname-1... legen die Gruppenhierarchie der Liste fest.
Die Datennamen kennzeichnen in der Reihe ihrer Angabe von links nach rechts in absteigender Form den Rang der Gruppenhierarchiestufen. Dem letzten Datennamen (ganz rechts) entspricht die niedrigste, dem vorletzten Datennamen die nächst höhere Hierarchiestufe, usw.
FINAL beschreibt den hierarchisch höchsten Gruppenwechsel. Der zugehörige Gruppenkopf wird bei der ersten GENERATE-Anweisung, der zugehörige Gruppenfuß bei der TERMINATE-Anweisung erzeugt.
Allgemeine Regeln
Die durch einen Gruppenwechsel implizierten Aktionen hängen davon ab, ob zu je einer Gruppenhierarchiestufe der Liste ein Gruppenkopf und/oder ein Gruppenfuß oder keine der beiden definiert sind. Sobald ein Gruppenwechsel eintritt, erstellt das Listenprogramm die folgenden Gruppenköpfe und Gruppenfüße (soweit sie vorhanden sind) in der Reihenfolge:
Gruppenfuß der niedrigsten Stufe
Gruppenfuß der nächsthöheren Stufe
.
.
.Gruppenfuß der für den Gruppenwechsel zuständigen Stufe
Gruppenkopf der für den Gruppenwechsel zuständigen Stufe
Gruppenkopf der nächstniedrigeren Stufe
.
.
.Gruppenkopf der niedrigsten Stufe.
Anschließend wird vom Listenprogramm die Postenleiste infolge der GENERATE-Anweisung erstellt.
Wenn z.B. für eine Liste die Gruppenwechseldatennamen mit JAHR, MONAT und TAG (in dieser Reihenfolge in der CONTROL-Klausel angeführt) gegeben und jeder dieser Datennamen mit je einem Gruppenkopf und einem Gruppenfuß gekoppelt ist, werden bei einem Gruppenwechsel für JAHR (Änderung des Feldinhaltes von JAHR zwischen zwei chronologisch aufeinanderfolgenden GENERATE-Anweisungen) die Rumpfleisten in folgender Reihenfolge gedruckt:Gruppenfuß
Gruppenfuß
Gruppenfuß
Gruppenkopf
Gruppenkopf
Gruppenkopffür TAG
für MONAT
für JAHR
für Jahr
für MONAT
für TAGPostenleiste infolge der GENERATE-Anweisung.
Wenn zu Beginn der Rumpfleistenerstellung vom Listenprogramm erkannt wird, dass eine der Bedingungen für einen Seitenvorschub erfüllt ist, dann wird zuerst der Seitenfuß (wenn vorhanden), anschließend ein Seitenvorschub, dann der Seitenkopf (wenn ein solcher vorliegt) und schließlich die Rumpfleiste erzeugt.
Die Erstellung einer Postenleiste muss vom Programmierer mittels einer entsprechenden GENERATE-Anweisung (durch Angabe der Postenleiste) in der PROCEDURE DIVISION vom Listenprogramm gefordert werden. Alle übrigen Leisten, wie Listenkopf, Listenfuß, Seitenkopf, Seitenfuß, Gruppenköpfe und Gruppenfüße, werden vom Listenprogramm automatisch erstellt, sobald die Voraussetzungen dafür erfüllt sind.
Zur Feststellung eines Gruppenwechsels wird ohne Rücksicht auf die Beschreibungen der Gruppenwechseldatenfelder ein alphanumerischer Vergleich vorgenommen. Das bedeutet z.B., dass das Listenprogramm eine Wertänderung feststellt, wenn sich der Inhalt eines mit COMPUTATIONAL-3 beschriebenen Gruppenwechseldatenfeldes von sedezimal ’7F’ auf sedezimal ’7C’ ändert, obwohl beide Darstellungsvarianten die positive Zahl 7 ausdrücken.
Wenn die Listenerklärung die CONTROL-Klausel nicht enthält, dürfen und können für diese Liste keine Gruppenköpfe und Gruppenfüße definiert werden.
Beispiel 10-1
Ausschnitt aus einer Liste:
JANUAR 14 B10 4 B 8.36 B10 1 C 9.00 EINKAEUFE & KOSTEN FUER 1-14 5 $17.36 $136.36 JANUAR 15 B10 2 A 16.00
Die zugehörige Listenerklärung enthält die CONTROL-Klausel
CONTROLS ARE FINAL MONAT TAG
Bis auf die Druckzeile, die mit EINKAEUFE beginnt und die den Gruppenfuß zu TAG bildet, sind alle übrigen Druckzeilen aus dem obigen Listenausschnitt Postenleisten (selbe Listenerklärung). Der Gruppenfuß von TAG wurde infolge der Datumsänderung vom 14. auf den 15. Januar erzeugt.