Funktion
Die MERGE-Anweisung generiert eine Sortierdatei, in die sie Datensätze aus zwei oder mehreren gleichartig sortierten Eingabedateien übernimmt. Sie mischt die Datensätze in der Sortierdatei anhand einer Anzahl von angegebenen Datenfeldern (Sortierschlüssel) und stellt nach Ende des Mischvorgangs jeden Datensatz aus der Sortierdatei einer Ausgabeprozedur oder Ausgabedateien zur Verfügung.
Format
MERGE sortierdateiname
{ON {DESCENDING | ASCENDING} {KEY | KEY-YY } {datenname-1}... }...
[COLLATING SEQUENCE IS alphabetname]
USING {dateiname-1}...
{ OUTPUT PROCEDURE IS kapitelname-1 [{THRU | THROUGH} kapitelname-2]
|GIVING {dateiname-2}...
}
Syntaxregeln
sortierdateiname muss in einer Sortierdateierklärung (SD) in der DATA DIVISION beschrieben sein.
sortierdateiname muss mit dem Sortierdateinamen übereinstimmen, der in der SELECT-Klausel (Format 2) angegeben ist.
In der USING-Angabe angegebene Dateinamen dürfen nicht in der GIVING-Angabe angegeben werden.
datenname-1... sind Sortierschlüssel. Ein Sortierschlüssel ist ein Teil des Datensatzes, der als Sortiergrundlage verwendet wird. Die Sortierschlüssel müssen in einer Datensatzbeschreibung, die zu einer SD-Erklärung gehört, definiert sein und unterliegen folgenden Regeln:
Die Länge der Datenfelder darf nicht variabel sein.
Datennamen, die die Sortierschlüssel beschreiben, dürfen gekennzeichnet sein (siehe „Kennzeichnung").
Enthält die Sortierdateierklärung von sortierdateiname mehrere Datensatzbeschreibungen, brauchen die Schlüssel nur in einer Datensatzbeschreibung definiert sein. Ist ein Sortierschlüssel in mehr als einer Datensatzbeschreibung definiert, müssen alle Beschreibungen des Schlüssels gleich sein und gewährleisten, dass der Schlüssel innerhalb eines jeden Datensatzes an der gleichen Stelle auftritt.
Ein Sortierschlüssel darf nicht mit einer OCCURS-Klausel beschrieben und nicht einem Datenfeld untergeordnet sein, das mit einer OCCURS-Klausel beschrieben ist.
Enthält die Sortierdatei Sätze variabler Länge, müssen alle Sortierschlüssel in den ersten n Stellen des Satzes enthalten sein, wobei n die minimale Satzlänge ist, die für die Sortierdatei angegeben wurde.
Für eine Datei können maximal 64 Schlüssel angegeben werden.
Jeder Sortierschlüssel muss innerhalb der ersten 4096 Bytes liegen.
Sortierschlüssel werden in der Reihenfolge ihrer Wichtigkeit für die Sortierung von links nach rechts angegeben, unabhängig davon, ob sie auf- oder absteigend sind. Die erste Angabe von datenname-1 wäre somit der Hauptsortierbegriff, die zweite Angabe von datenname-1 der nachgeschaltete Sortierbegriff.
Ein dezimal gepackter Sortierschlüssel darf maximal 16 Stellen lang sein.
Die Sortierschlüssel, die der Angabe KEY-YY folgen, müssen entweder mit PIC 99 USAGE DISPLAY oder USAGE PACKED-DECIMAL definiert sein.
kapitelname-1 ist der Name des ersten oder einzigen Kapitels der verwendeten Ausgabeprozedur. kapitelname-2 ist der Name des letzten Kapitels der Ausgabeprozedur. Er muss nur dann angegeben werden, wenn die Ausgabeprozedur aus mehreren Kapiteln besteht.
dateiname-1..., dateiname-2... müssen in einer Dateierklärung (FD) der DATA DIVISION beschrieben sein.
Die Größe der Datensätze, die an eine MERGE-Operation übergeben bzw. in eine Ausgabedatei geschrieben werden, ist abhängig vom Satzformat der Sortierdatei (variabel oder fest) und wird in den Allgemeinen Regeln unter USING-/GIVING-Angabe näher beschrieben.
Mindestens eine ASCENDING-/DESCENDING-Angabe muss in einer MERGE-Anweisung angegeben sein.
Die MERGE-Anweisung darf überall im Programm geschrieben werden außer
im Bereich der Prozedurvereinbarungen,
in einer zu einer SORT-/MERGE-Anweisung gehörenden Ein-/Ausgabe-Prozedur.
Die in der MERGE-Anweisung genannten Sortier- und Eingabedateien dürfen nicht zusammen in derselben SAME AREA, SAME SORT AREA oder SAME SORT-MERGE AREA angegeben sein (siehe „SAME AREA-Klausel").
Falls dateiname-2 eine indizierte Datei beschreibt, muss die erste Angabe von datenname-1 mit der ASCENDING-Angabe erfolgen. Das durch datenname-1 referenzierte Datenfeld muss in seinem Datensatz dieselben Zeichenstellen belegen wie der Satzschlüssel innerhalb der durch dateiname-2 beschriebenen Datei.
Allgemeine Regeln
Die Sortierreihenfolge wird durch die ASCENDING-/DESCENDING-Angabe festgelegt:
Bei Angabe von ASCENDING wird vom niedrigsten zum höchsten Wert des
Sortierschlüssels sortiert (aufsteigende Sortierreihenfolge).Bei Angabe von DESCENDING wird vom höchsten zum niedrigsten Wert des Sortierschlüssels sortiert (absteigende Sortierreihenfolge).
Für die Sortierreihenfolge gelten die Regeln für den Vergleich von Operanden in „Vergleichsbedingungen“ (siehe Abschnitt „Vergleichsbedingung").
Sind - in Übereinstimmung mit den Regeln für Vergleichsbedingungen - die Schlüssel-Datenfelder von Sätzen innerhalb einer oder mehrerer Dateien inhaltsgleich, werden diese Sätze folgendermaßen verarbeitet:
Die Eingabedateien werden in der Reihenfolge verarbeitet, die in der MERGE-Anweisung festgelegt wurde.
In der Ausgabedatei werden zuerst alle Sätze der ersten Eingabedatei aufgeführt, dann die der zweiten Eingabedatei usw.
Beim Programmablauf ist die Sortierfolge für die Vergleiche von alphanumerischen Sortierfeldern wie folgt festgelegt:
ist COLLATING SEQUENCE in der MERGE-Anweisung angegeben, ist diese Angabe Kriterium für die Sortierfolge.
ist COLLATING SEQUENCE in der MERGE-Anweisung nicht angegeben, wird die programmspezifische Sortierfolge verwendet (siehe "OBJECT-COMPUTER-Paragraf" ).
Für Vergleiche von nationalen Sortierfeldern wird die nationale (maschineneigene) Sortierfolge verwendet.
Alle Datensätze der Eingabedateien (dateiname-1...) werden in die mit sortierdatei-name bezeichnete Sortierdatei übertragen. Bei Beginn der Ausführung der MERGE-Anweisung dürfen die Eingabedateien nicht geöffnet sein. Die MERGE-Anweisung wird für jede genannte Datei in folgenden Schritten ausgeführt:
Die Verarbeitung der Datei wird eingeleitet. Dies geschieht so, als ob eine OPENINPUT-Anweisung ausgeführt würde.
Jeder logische Datensatz wird für den Mischvorgang zur Verfügung gestellt und anschließend freigegeben, als ob eine READ-Anweisung mit NEXT RECORD- und AT END-Angabe ausgeführt würde. Enthält eine Eingabedatei die RECORD-Klausel mit DEPENDING-Angabe, wird das zugehörige DEPENDING ON-Datenfeld bei dieser READ-Operation nicht versorgt. Relative Dateien müssen im FILE-CONTROL-Paragrafen mit ACCESS MODE IS SEQUENTIAL beschrieben sein.
Hat die Sortierdatei Sätze variabler Länge, wird als Satzlänge eines Datensatzes, der an die MERGE-Operation übergeben wurde, die Größe verwendet, die der Satz beim Einlesen hatte. Diese Länge muss in dem Bereich liegen, der in der RECORD-Klausel für die Sortierdatei festgelegt ist (siehe „RECORD-Klausel").
Hat die Sortierdatei festes Satzformat, werden bei kürzeren Sätzen die fehlenden Stellen mit Blanks aufgefüllt, längere Sätze dürfen nicht vorkommen.Die Verarbeitung der Datei wird beendet. Dies geschieht so, als ob eine CLOSE-Anweisung ohne Wahlangaben ausgeführt würde.
Diese impliziten Funktionen werden so durchgeführt, dass alle vereinbarten USE AFTER EXCEPTION / ERROR-Prozeduren vollzogen sind.
OUTPUT PROCEDURE bedeutet, dass der Prozedurteil eine Ausgabeprozedur enthält, in der Datensätze nach dem Mischen bearbeitet werden. Ist OUTPUT
PROCEDURE angegeben, wird die Steuerung dann an die Ausgabeprozedur übergeben, nachdem die Sortierdatei durch die MERGE-Anweisung bearbeitet worden ist. Beim Durchlaufen einer RETURN-Anweisung übernimmt die Ausgabeprozedur die Datensätze aus der Sortierdatei. Der Compiler fügt einen Rückkehrmechanismus am Ende des letzten Kapitels der Ausgabeprozedur ein, d.h., ist die letzte Anweisung der Ausgabeprozedur durchlaufen, wird die Ausgabeprozedur abgeschlossen und die Steuerung geht an die der MERGE-Anweisung folgende Anweisung über.Für die Ausgabeprozedur, die ein abgeschlossener Teil innerhalb des Prozedurteils ist, gelten folgende Regeln:
Sie muss aus einem oder mehreren zusammenhängenden Kapiteln bestehen.
Sie muss mindestens eine RETURN-Anweisung enthalten, damit die gemischten Datensätze für die Verarbeitung verfügbar sind.
Sie darf nicht zur Ausführung einer MERGE-, RELEASE- oder SORT-Anweisung führen.
Sie kann jede Prozedur enthalten, die erforderlich ist, um Datensätze auszuwählen, zu verändern oder zu kopieren.
Die Ausgabeprozedur darf verlassen werden, falls der Benutzer dafür sorgt, dass einem Sprung aus der Ausgabeprozedur ein Rücksprung folgt, um ein ordnungsgemäßes Verlassen dieser Prozedur zu gewährleisten (Durchlaufen der letzten Anweisung der Ausgabeprozedur).
Von außerhalb darf auf Prozedurnamen in der Ausgabeprozedur gesprungen werden, falls dabei keine RETURN-Anweisung oder das Ende der Ausgabeprozedur durchlaufen wird.
Wird die Angabe OUTPUT PROCEDURE verwendet, wird eine Programmverzweigung entsprechend einer PERFORM-Anweisung, Format 1, ausgeführt. Das bedeutet, dass alle Kapitel, die die Prozedur bilden, einmal durchlaufen werden und die Ausführung der Prozedur nach Verarbeitung der letzten Anweisung beendet wird. Deshalb darf jede Prozedur durch eine EXIT-Anweisung abgeschlossen werden.
Kommen MERGE-Anweisungen in segmentierten Programmen vor, gelten folgende Einschränkungen:
Falls eine MERGE-Anweisung in einem Kapitel auftritt, das nicht in einem unabhän-gigen Segment liegt, so müssen alle Ausgabeprozeduren, auf die sich die MERGE-Anweisung bezieht entweder vollständig innerhalb eines festen Segments oder vollständig in einem einzelnen unabhängigen Segment enthalten sein.
Wenn eine MERGE-Anweisung in einem unabhängigen Segment vorkommt, so müssen alle Ausgabeprozeduren, auf die sich die MERGE-Anweisung bezieht entweder vollständig innerhalb eines festen Segments oder vollständig innerhalb des gleichen unabhängigen Segments wie die MERGE-Anweisung enthalten sein.
Ist die GIVING-Angabe vereinbart, werden alle gemischten Sätze in die Ausgabedatei (dateiname-3...) geschrieben. Bei Beginn der Ausführung der MERGE-Anweisung darf die Ausgabedatei nicht geöffnet sein. Die MERGE-Anweisung wird für jede genannte Datei in folgenden Schritten ausgeführt:
Die Verarbeitung der Datei wird eingeleitet. Dies geschieht so, als ob eine OPEN OUTPUT-Angabe ausgeführt würde.
Die gemischten logischen Datensätze werden verarbeitet und in die Ausgabedatei geschrieben, als ob eine WRITE-Anweisung ohne jede Wahlangabe ausgeführt würde. Die Länge dieser Datensätze muss innerhalb der Grenzen liegen, die für die Ausgabedatei festgelegt sind (siehe „RECORD-Klausel").
Bei einer relativen Datei enthält das Satzschlüsselfeld des ersten verarbeiteten Satzes den Wert 1, das des zweiten verarbeiteten Satzes den Wert 2 usw. Nach der Ausführung der MERGE-Anweisung zeigt der Inhalt des Satzschlüsselfeldes auf den letzten verarbeiteten Satz der Datei. Die Datei muss im FILE-CONTROL-Paragrafen mit ACCESS MODE IS SEQUENTIAL beschrieben sein.Die Verarbeitung der Datei wird beendet. Dies geschieht so, als ob eine CLOSE-Anweisung ohne Wahlangaben ausgeführt würde. Enthält die Ausgabedatei die RECORD-Klausel mit DEPENDING ON-Angabe, wird beim Schreiben eines Satzes das zugehörige DEPENDING ON-Datenfeld nicht ausgewertet, sondern die aktuelle Satzlänge verwendet.
Beispiel 8-53
IDENTIFICATION DIVISION. PROGRAM-ID. MISCH1. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EINGABE1 ASSIGN TO "EINGABE1". SELECT EINGABE2 ASSIGN TO "EINGABE2". SELECT AUSGABE1 ASSIGN TO "AUSGABE1". SELECT AUSGABE2 ASSIGN TO "AUSGABE2". SELECT SORTIER ASSIGN TO "SORTWK". DATA DIVISION. FILE SECTION. FD EINGABE1 LABEL RECORD STANDARD. 01 ESATZ1. 02 E10 PIC X. 02 E11 PIC 9(4). 02 E12 PIC 9(4). 02 E13 PIC 9(4). FD EINGABE2 LABEL RECORD STANDARD. 01 ESATZ2. 02 E20 PIC X. 02 E21 PIC 9(4). 02 E22 PIC 9(4). 02 E23 PIC 9(4). FD AUSGABE1 LABEL RECORD STANDARD. 01 A1SATZ PIC X(13). FD AUSGABE2 LABEL RECORD STANDARD. 01 A2SATZ PIC X(13). SD SORTIER LABEL RECORD STANDARD. 01 SSATZ. 02 S0 PIC X. 02 S1 PIC 9(4). 02 S2 PIC 9(4). 02 S3 PIC 9(4). PROCEDURE DIVISION. HAUPT SECTION. H01. MERGE SORTIER ON ASCENDING S1 S2 S3 (1) USING EINGABE1 EINGABE2 | GIVING AUSGABE1 AUSGABE2. (1) H02. STOP RUN.
(1) | Die Sätze von zwei gleichartig sortierten Dateien werden in zwei identische Dateien in sortierter Reihenfolge ausgegeben. |
Alle Dateien sind aufsteigend nach den Sortierbegriffen S1 S2 S3 sortiert.
Beispiel 8-54
IDENTIFICATION DIVISION. PROGRAM-ID. MISCH2. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EINGABE1 ASSIGN TO "EINGABE1". SELECT EINGABE2 ASSIGN TO "EINGABE2". SELECT AUSGABE1 ASSIGN TO "AUSGABE1". SELECT AUSGABE2 ASSIGN TO "AUSGABE2". SELECT SORTIER ASSIGN TO "SORTWK". DATA DIVISION. FILE SECTION. FD EINGABE1 LABEL RECORD STANDARD. 01 ESATZ1. 02 E10 PIC X. 02 E11 PIC 9(4). 02 E12 PIC 9(4). 02 E13 PIC 9(4). FD EINGABE2 LABEL RECORD STANDARD. 01 ESATZ2. 02 E20 PIC X. 02 E21 PIC 9(4). 02 E22 PIC 9(4). 02 E23 PIC 9(4). FD AUSGABE1 LABEL RECORD STANDARD. 01 A1SATZ PIC X(13). FD AUSGABE2 LABEL RECORD STANDARD. 01 A2SATZ PIC X(13). SD SORTIER LABEL RECORD STANDARD. 01 SSATZ. 02 S0 PIC X. 02 S1 PIC 9(4). 02 S2 PIC 9(4). 02 S3 PIC 9(4). WORKING-STORAGE SECTION. 01 MISCH-STATUS PIC X VALUE LOW-VALUE. 88 MISCH-ENDE VALUE HIGH-VALUE. PROCEDURE DIVISION. HAUPT SECTION. H01. OPEN OUTPUT AUSGABE1 AUSGABE2. H02. MERGE SORTIER ON ASCENDING S1 S2 S3 (1) USING EINGABE1 EINGABE2 | OUTPUT PROCEDURE IS AUS1. (1) H03. CLOSE AUSGABE1 AUSGABE2. STOP RUN. . . . AUS1 SECTION. A01. PERFORM UNTIL MISCH-ENDE (2) RETURN SORTIER | AT END | SET MISCH-END TO TRUE | NOT AT END | WRITE A1SATZ FROM SSATZ | WRITE A2SATZ FROM SSATZ (2) END-RETURN END-PERFORM.
(1) | Die Sätze aus den gleichartig sortierten Dateien werden in sortierter Reihenfolge von der Sortierdatei übernommen. Dann geht die Steuerung an die Ausgabeproze dur (AUS1 SECTION) über. |
(2) | Die Sortierdatei wird satzweise übernommen und in die Ausgabedateien geschrieben. |