Funktion
Die SUM-Klausel bewirkt, dass das Listenprogramm zu bestimmten Zeiten der Listenerzeugung arithmetische Summationen ausführt und deren Ergebnisse anschließend oder später ausdruckt. Die SUM-Klausel gibt dem Listenprogramm zur Summenbildung die Summanden an. Sie stellt außerdem ein numerisches Feld, das für sie automatisch angelegt wird, zur Aufsummierung der Summanden bereit. Dieses Feld, d.h. der Summenzähler, ist zugleich das Sendefeld für die implizite MOVE-Anweisung, die zur Druckaufbereitung des druckfähigen Feldes dient, in dessen Beschreibung die SUM-Klausel enthalten ist.
Format
SUM {bezeichner-1}... [UPON datenname-1]
[RESET ON {datenname-2 | FINAL}]
Syntaxregeln
Ein Bezeichner, der als Summand in einer SUM-Klausel angegeben wurde, muss in der FILE SECTION, WORKING-STORAGE SECTION, LOCAL-STORAGE SECTION, LINKAGE SECTION oder REPORT SECTION definiert sein. Aus der REPORT SECTION dürfen nur Summenzähler als Summanden einer SUM-Klausel angesprochen werden.
Das Datenfeld eines jeden Bezeichners, der als Summand in einer SUM-Klausel spezifiziert wurde, muss numerisch beschrieben sein.
datenname-1 ist nur als Name einer Postenleiste zulässig, die in der aktuellen Listenbeschreibung definiert ist.
FINAL oder datenname-2 muss in der CONTROL-Klausel der aktuellen Listenerklärung angegeben sein.
bezeichner-1... identifiziert die Felder, welche im Summenzähler aufaddiert werden.
Die UPON-Angabe führt dazu, dass die spezifizierten Summanden nur bei der Ausführung einer solchen GENERATE-Anweisung aufsummiert werden, die genau die Postenleiste bezeichnet, die in der UPON-Angabe genannt ist (siehe "Anwendung der UPON-Angabe").
Die RESET-Angabe hebt die Standardrücksetzung des Summenzählers auf Null auf (siehe "Anwendung der RESET-Angabe").
Allgemeine Regeln
Die SUM-Klausel darf nur in Beschreibungen von Gruppenfüßen angegeben werden.
Im Listenausschnitt
JANUAR 02 B10 2 A 3.00 B12 1 A 4.00 B12 3 C 17.00 EINKAEUFE & KOSTEN FUER 1-02 6 $24.00
sind für den 2. Januar die Kosten der einzelnen Posten und deren Summe ausgedruckt.
Die in den ersten drei Druckzeilen wiedergegebenen Einzelkosten wurden infolge der GENERATE-Anweisung gedruckt, die auf die Postenleiste
01 DETAIL-ZEILE TYPE DETAIL. 02 ... . . 02 COLUMN 50 PICTURE ZZ9.99 SOURCE KOSTEN.
Bezug nimmt. Diese GENERATE-Anweisung wurde ohne Gruppenwechsel dreimal durchlaufen, wodurch die Postenleiste dreimal hintereinander gedruckt wurde. Das Datenfeld mit dem Namen KOSTEN, das im FILE-Kapitel des Datenteils mit
02 K OSTEN PICTURE 999V99.
beschrieben ist, lieferte die Einzelkosten.
Bei der nächsten Ausführung der genannten GENERATE-Anweisung hatte sich der Inhalt des Gruppenwechseldatenfeldes TAG von 2 auf einen anderen Wert geändert. Der Gruppenfuß
01 ... TYPE CONTROL FOOTING TAG. 02 ... . . 02 SUMME-TAG COLUMN 49 PICTURE $9.99 SUM KOSTEN.
wurde als vierte Zeile des obigen Listenausschnittes erzeugt, wobei der Inhalt des Summenzählers SUMME-TAG ab Spalte 49 ausgedruckt wurde.
Folgende Aktionen wurden für die Summenbildung vorgenommen:
Der Compiler erzeugte zur Übersetzungszeit für die SUM-Klausel den Summenzähler SUMME-TAG. Bei der Ausführung der entsprechenden INITIATE-Anweisung (zur Programmausführungszeit) setzte das Listenprogramm den Summenzähler auf Null. Anschließend wurde bei jeder Ausführung der GENERATE-Anweisung GENERATE DETAIL-ZEILE der laufende Wert aus dem Datenfeld KOSTEN zum Inhalt des Summenzählers SUMME-TAG addiert. Da das Listenprogramm diese Summation (siehe unter 5. "Postenaufsummierung“) unmittelbar nach dem Gruppenwechseltest und den sich daraus ergebenden Aktionen vornimmt, wird mit dem Gruppenfuß für TAG die Summe aus den Einzelkosten für den 2.Januar ausgedruckt. Bei der Erzeugung der Gruppenfüße wird zuletzt der Summenzähler auf Null zurückgesetzt, da die SUM-Klausel keine RESET-Angabe enthält.Anwendung der PICTURE-Klausel
Wenn innerhalb einer Leistenerklärung die Beschreibung eines Datenfeldes eine SUM-Klausel enthält, dann beschreibt die zugehörige PICTURE-Klausel nicht nur das Datenfeld, sondern auch den Summenzähler, den der Compiler wegen der SUM-Klausel anlegt. Das Datenfeld dient für den Fall, dass es druckfähig ist, dazu, den Inhalt des zugeordneten Summenzählers auszudrucken. Die PICTURE-Klausel muss das Datenfeld als numerisch-druckaufbereitet beschreiben, wobei Druckaufbereitungssymbole für die Summenzähler ignoriert werden.
Anwendung des Summenzählers
Wenn in einer Feldbeschreibung, die eine SUM-Klausel enthält, auf die Stufennummer unmittelbar ein Datenname folgt, dann ist dieser Datenname der Name des Summenzählers. Über diesen Namen hat der Programmierer die Möglichkeit, auf den Summenzähler zuzugreifen (z.B. um seinen Inhalt vor dem Druck zu runden). Der Summenzähler ist ein vom Compiler angelegtes Datenfeld, dem die Verwendung von COMP-3 zugeordnet ist und dessen numerische Eigenschaften durch die angegebene PICTURE-Klausel bestimmt sind.
Arten der Summation
Der Programmierer kann drei Arten von Summationen spezifizieren:
die Postenaufsummierung, die hierarchische Hochsummierung von Summen und die Addition hierarchisch gleichwertiger Summen.Postenaufsummierung
Der Zeitpunkt, zu dem das Listenprogramm einen Summanden (bezeichner-1... aus der SUM-Klausel) im zugeordneten Summenzähler aufsummiert, hängt vom Summanden selbst ab.
Die Summanden, die für die Postenaufsummierung herangezogen werden, sind jene, die selbst keine Summenzähler sind, also jene, die außerhalb des REPORT-Kapitels definiert sind.
Die Postenaufsummierung bildet die Basis für die zwei restlichen Arten von Summationen. Die Bezeichnung Postenaufsummierung kommt davon, dass die von ihr erfassten Summanden meistens mit den Postenleisten der Liste ausgedruckt werden.
Die Postenaufsummierung findet bei jeder Ausführung einer GENERATE-Anweisung statt. Der Programmierer muss daher dafür sorgen, dass die betroffenen Summanden zu diesen Zeitpunkten die aktuellen Werte enthalten. Wenn in einer SUM-Klausel eine UPON-Angabe vorliegt, dann werden die vom Summenzähler verschiedenen Summanden der SUM-Klausel nur bei einer solchen Postenaufsummierung addiert, die bei der Ausführung einer GENERATE-Anweisung stattfindet, die dieselbe Postenleiste anführt wie die UPON-Angabe (für eine Summenliste ist es daher sinnlos, eine UPON-Angabe zu machen; siehe "Anwendung der UPON-Angabe“). Wenn die SUM-Klausel allerdings keine UPON-Angabe enthält, dann werden die nicht als Summenzähler definierten Summanden bei jeder Ausführung einer beliebigen GENERATE-Anweisung (bezüglich einer Liste) im zugehörigen Summenzähler aufsummiert (Postenaufsummierung).
Das Listenprogramm führt die Postensummation erst nach den Aktionen aus, die sie bezüglich des Gruppenwechsels (Test; Erstellung der Gruppenfüße und -köpfe, falls der Test positiv ist) unternimmt. Zu diesen Gruppenwechselaktionen zählt auch die Rücksetzung der Summenzähler auf Null, nachdem der Gruppenfuß, dessen Beschreibung die entsprechenden SUM-Klauseln enthält, erstellt worden war (siehe "Anwendung der RESET-Angabe"). Damit ist sichergestellt, dass die ausgedruckte Summe nur die Werte der Summanden über jene Gruppe von Postenleisten erfasst, die durch den zugehörigen Gruppenfuß abgeschlossen wird (z.B. die Summe der Kosten des 2. Januar).
Hierarchische Hochsummierung von Summen
Die Voraussetzung für eine solche Summation besteht darin, dass eine SUM-Klausel eines Gruppenfußes mindestens einen Summenzähler als Summanden besitzt, der auf Grund einer SUM-Klausel eines Gruppenfußes mit einem niedrigeren hierarchischen Rang angelegt wurde. Die hierarchische Hochsummierung ist nur möglich, wenn es bezüglich einer Liste mindestens zwei Gruppenfüße gibt, in deren Beschreibung wenigstens je eine SUM-Klausel vorhanden ist.
Der Inhalt eines Summenzählers, der in einer SUM-Klausel eines anderen Gruppenfußes als Summand angegeben ist, wird zu dem Zeitpunkt, in dem der zugehörige (also mit niedrigerem Rang) Gruppenfuß erstellt wird, auf den Inhalt des Summenzählers addiert, in dessen SUM-Klausel er als Summand auftritt.
Beispiel 10-8 erläutert die hierarchische Hochsummierung:
Beispiel 10-8
In der Beschreibung des Gruppenfußes
01 ... TYPE CONTROL FOOTING MONAT. 02 ... . . 02 SUMME-MONAT COLUMN 46 PICTURE $$$9.99 SUM SUMME-TAG.
wird die hierarchische Hochsummierung in Verbindung mit der Gruppenfußbeschreibung
01 ... TYPE CONTROL FOOTING TAG. 02 ... . . 02 SUMME-TAG COLUMN 49 PICTURE $$$9.99 SUM KOSTEN.
spezifiziert ( siehe Beispiel 10-7 in Kapitel "SOURCE-Klausel").
Bei jeder Erstellung des Gruppenfußes mit dem Gruppenwechseldatenfeld TAG addiert das Listenprogramm den Inhalt des Summenzählers SUMME-TAG auf den Inhalt des Summenzählers SUMME-MONAT, und zwar bevor SUMME-TAG auf Null zurückgesetzt wird. Wenn der Gruppenfuß mit MONAT infolge eines Gruppenwechsels oder der TERMINATE-Anweisung erstellt wird, enthält der Summenzähler SUMME-MONAT (vor dem Rücksetzen auf Null) die Summe aller Tagessummen (Werte von SUMME-TAG zu den Summationszeitpunkten) des aktuellen Monats.
Addition hierarchisch gleichwertiger Summen
Diese Summationsart liegt vor, wenn eine SUM-Klausel Summenzähler als Summanden enthält, die in dem vorliegenden Gruppenfuß über entsprechende SUM-Klauseln definiert sind. Normalerweise enthalten solche Summanden (also Summenzähler) Werte, die durch Postenaufsummierung erzeugt wurden.
Beispiel 10-9
01 UNTER-BETRAG TYPE CONTROL FOOTING... 02 SUMME-1 SUM ARB-FELD-1... 02 SUMME-2 SUM ARB-FELD-2... 02 SUMME SUM SUMME-1 SUMME-2...
Die Datenfelder ARB-FELD-1 und ARB-FELD-2 sind in der WORKING-STORAGE SECTION des Datenteils definiert. Im Summenzähler SUMME werden die Werte von SUMME-1 und SUMME-2 addiert, die voher durch Postenaufsummierung erzeugt wurden.
Die Addition hierarchisch gleichwertiger Summen führt das Listenprogrammsteuersystem zu der Zeit aus, in welcher der betroffene Gruppenfuß erstellt wird. Wenn mehr als eine SUM-Klausel eine solche Addition erfordert, dann ist die zeitliche Reihenfolge durch die Reihenfolge dieser SUM-Klauseln bestimmt. Diese Reihenfolge ist für das Additionsergebnis wesentlich.
Es ist einleuchtend, dass diese Addition vor der hierarchischen Hochsummierung durchgeführt wird. Damit ist sichergestellt, dass bei der Summierung hierarchisch gleichwertige Summen auch hierarchisch hochsummiert werden können.
Beispiel 10-10
... CONTROLS ARE LAND, STADT. ... 01 LINE PLUS 2 TYPE CONTROL FOOTING STADT. 02 SUMME-1 SUM MAENNER... 02 SUMME-2 SUM FRAUEN... 02 SUMME-STADT SUM SUMME-1, SUMME-2... 01 LINE PLUS 1 TYPE CONTROL FOOTING LAND. 02 SUMME-LAND SUM SUMME-STADT... ...
Die im Summenzähler SUMME-STADT durch die hierarchisch gleichwertige Summation der Werte aus den Summenzählern SUMME-1 und SUMME-2 (Postenaufsummierung) gebildeten Werte werden im Summenzähler SUMME-LAND hierarchisch hochsummiert (der Gruppenfuß mit LAND hat gegenüber dem Gruppenfuß mit STADT den höheren hierarchischen Rang). Dies ist nur möglich, weil der Summenzähler SUMME-STADT vor der Hochsummierung im Summenzähler SUMME-LAND den geeigneten Wert enthält.
Mischoperanden
Eine SUM-Klausel ohne UPON-Angabe darf einen oder mehrere Operanden (= Summanden) folgender Eigenschaften enthalten:
Operanden, die in der FILE SECTION, WORKING-STORAGE SECTION, LOCAL-STORAGE SECTION oder LINKAGE SECTION definiert sind.
Operanden, die in einem hierarchisch rangtieferen Gruppenfuß als Summenzähler definiert sind.
Operanden, die in demselben Gruppenfuß (dessen Beschreibung die SUM-Klausel enthält) als Summenzähler definiert sind.
Die Addition findet für jeden der oben beschriebenen Operationstypen zu den Zeiten statt, die weiter oben angeführt wurden.
Anwendung der UPON-Angabe
Wenn in einer SUM-Klausel eine UPON-Angabe vorliegt, müssen alle Summanden aus dieser SUM-Klausel außerhalb der REPORT SECTION definiert sein, d.h. sie dürfen nur in der FILE SECTION, WORKING-STORAGE SECTION, LOCAL-STORAGE SECTION und LINKAGE SECTION definiert sein.
Die UPON-Angabe bewirkt, dass die Postenaufsummierung der Summanden aus der vorliegenden SUM-Klausel nur dann stattfindet, wenn eine GENERATE-Anweisung durchlaufen wird, die die Postenleiste anführt, die in der UPON-Angabe genannt wurde. Eine Postenaufsummierung infolge einer anderen GENERATE-Anweisung erfasst also keine der Summanden aus der zur Diskussion stehenden SUM-Klausel.
Beispiel 10-11
DATA DIVISION. FILE SECTION. FD INFILE... ... RECORDS ARE MUELLER, MEIER. 01 MUELLER PICTURE 999. 01 MEIER PICTURE 9999. REPORT SECTION. ... 01 MUELLER-DETAIL TYPE DETAIL. 02 LINE PLUS 1 COLUMN 1 PIC 999 SOURCE MUELLER. 01 MEIER-DETAIL TYPE DETAIL. 02 LINE PLUS 1 COLUMN 1 PIC 9999 SOURCE MEIER. ... 01 BETRAG TYPE CONTROL FOOTING... 02 SUMME-1 SUM MUELLER UPON MUELLER-DETAIL... 02 SUMME-2 SUM MEIER UPON MEIER-DETAIL... ... PROCEDURE DIVISION. ... GENERATE MUELLER-DETAIL. ... GENERATE MEIER-DETAIL.
Da MUELLER und MEIER die Namen zweier verschiedener Datensätze in derselben Datei sind, können die aktuellen Satzinhalte nicht gleichzeitig zur Verfügung gestellt werden. Sobald ein MUELLER-Satz gelesen ist, wird die Anweisung GENERATE MUELLER-DETAIL ausgeführt. Dabei wird der laufende Wert von MUELLER im Summenzähler SUMME-1 aufaddiert. Die Addition des vorliegenden Wertes von MEIER auf den Inhalt des Summenzählers SUMME-2 hingegen findet zu diesem Zeitpunkt nicht statt. Wenn ein MEIER-Satz gelesen ist, wird die Anweisung GENERATE MEIER-DETAIL ausgeführt, wobei die Postenaufsummierung im Summenzähler SUMME-2, nicht aber SUMME-1 vorgenommen wird.
Anwendung der RESET-Angabe
Nur ein Datenname (FINAL eingeschlossen), der in der CONTROL-Klausel der selben Liste enthalten ist, darf in einer RESET-Angabe verwendet werden. Außerdem muss das Gruppenwechseldatenfeld einen höheren hierarchischen Rang einnehmen als der Gruppenfuß, in dessen Beschreibung die RESET-Angabe gemacht wird.
Normalerweise setzt das Listenprogramm einen Summenzähler unmittelbar nach der Erzeugung des Gruppenfußes, in dessen Beschreibung er definiert ist, auf den Wert Null zurück. Ein Summenzähler, dessen SUM-Klausel eine RESET-Angabe enthält, wird nur zu solchen Zeitpunkten auf Null zurückgesetzt, wenn der (vorhandene oder gedachte) Gruppenfuß zu dem Gruppenwechseldatenfeld (oder FINAL), das in der RESET-Angabe auftritt, erstellt wird (bzw. werden würde). Die RESET-Angabe dient also dazu, bezüglich der angegebenen hierarchischen Stufe die Gesamtsumme zu bilden.
Beispiel 10-12
01 ... TYPE CONTROL FOOTING TAG. 02 ... . . . 02 COLUMN 65 PIC $$$$9.99 SUM KOSTEN RESET ON FINAL. 01 ... TYPE CONTROL FOOTING FINAL. 02 ... . . . 02 COLUMN 45 PIC $$$$9.99 SUM SUMME-TAG.
Weil die SUM-Klausel in der Beschreibung des Gruppenfußes mit dem Gruppenwechseldatenfeld TAG die Angabe RESET ON FINAL enthält, wird der laufende Wert des zugehörigen Summenzählers bei jeder Erzeugung des Gruppenfußes von TAG ausgedruckt, ohne dass der Summenzähler jemals auf Null gesetzt wurde. Erst bei der Erstellung des Gruppenfußes für FINAL wird er auf Null gesetzt. Jeder gedruckte Gruppenfuß für TAG weist daher die laufenden Gesamtkosten von der ersten (1. Tag) bis einschließlich der zuletzt vor dem aktuellen Gruppenkopf gedruckten Postenleiste der Liste aus.
Einem Gruppenwechseldatenfeld, das in einer RESET-Angabe auftritt, muss kein Gruppenfuß zugeordnet sein. Die Summenzählerrücksetzung wird, wie bereits erwähnt, auch dann ausgeführt, wenn zu einem Gruppenwechseldatenfeld, das in einer RESET-Angabe auftritt, kein Gruppenfuß existiert.
Aktionen des Listenprogramms
Bei der Erstellung eines Gruppenfußes führt das Listenprogramm folgende Schritte aus (schematisch, da oft Schritte entfallen):
Addition hierarchisch gleichwertiger Summen.
Ausführung der USE BEFORE REPORTING-Prozeduren für den Gruppenfuß (siehe "USE BEFORE REPORTING-Anweisung").
PRINT-SWITCH-Test.
Enthält das PRINT-SWITCH-Sonderregister den Wert 1, dann wird Schritt d) übersprungen, d.h. Schritt e) folgt unmittelbar auf Schritt c), nachdem das Sonderregister auf Null zurückgesetzt wurde, andernfalls folgt Schritt d).Erzeugung des Gruppenfußes (falls druckfähig).
Hierarchische Hochsummierung.
Alle Summenzähler des Gruppenfußes, in deren SUM-Klausel keine RESET-Angaben vorliegen, werden durch implizite MOVE-Anweisungen mit Null belegt. Gleiches geschieht mit all jenen Summenzählern der übrigen Gruppenfüße, in deren SUM-Klauseln je eine solche RESET-Angabe auftritt, die sich gerade auf das Gruppenwechseldatenfeld bezieht, mit dem der aktuelle (also gerade erstellte) Gruppenfuß verknüpft ist.