Funktion
Die WRITE-Anweisung veranlasst die Ausgabe eines Datensatzes in eine Ausgabedatei. Ferner kann mit Format 1 der Vorschub einer Druckerdatei gesteuert werden.
Format 1 für sequenzielle Dateiorganisation
WRITE datensatzname [FROM bezeichner-1]
[{AFTER | BEFORE} ADVANCING{{bezeichner-2 | ganzzahl} [LINES | LINE] | {merkname | PAGE}}]
[AT {END-OF-PAGE | EOP} unbedingte-anweisung-1]
[NOT AT {END-OF-PAGE | EOP} unbedingte-anweisung-2]
[END-WRITE]
Syntaxregeln
datensatzname und bezeichner-1 dürfen nicht den gleichen Speicherbereich belegen.
datensatzname muss einer Dateierklärung (FD) der DATA DIVISION des Programms zugeordnet sein und darf gekennzeichnet werden.
datensatzname darf nicht Bestandteil einer Sortierdatei sein.
Falls bezeichner-2 in der ADVANCING-Angabe verwendet wird, muss er der Name eines ganzzahligen numerischen Datenelementes sein.
Der Wert von ganzzahl oder des durch bezeichner-2 angesprochenen Datenfeldes muss größer oder gleich Null und darf nicht größer als 15 sein.
Für Dateien mit dem ASSIGN-Eintrag PRINTER literal-1 darf ganzzahl einen Wert von > 15 und < 100 haben.
Falls END-OF-PAGE oder NOT END-OF-PAGE verwendet ist, muss innerhalb der Dateierklärung der entsprechenden Datei eine LINAGE-Klausel vorhanden sein (siehe „LINAGE-Klausel").
Die Angaben EOP und END-OF-PAGE sind gleichbedeutend.
Falls merkname verwendet wird, muss dafür innerhalb des SPECIAL-NAMES-Paragrafen eine Eintragung vorliegen.
Die Verwendung von merkname innerhalb der ADVANCING-Angabe ist nicht zulässig, falls für die in der WRITE-Anweisung angesprochene Datei eine LINAGE-Klausel angegeben wurde.
ADVANCING PAGE und END-OF-PAGE dürfen nicht zusammen in einer einzelnen WRITE-Anweisung angegeben werden.
Allgemeine Regeln
Der durch eine WRITE-Anweisung ausgegebene Datensatz steht im Satzbereich nicht mehr zur Verfügung, es sei denn, die zum Datensatz gehörende Datei wurde in einer SAME RECORD AREA-Klausel aufgeführt oder die Ausführung der WRITE-Anweisung war erfolglos. Der Datensatz steht auch allen anderen Dateien zur Verfügung, die in einer etwaigen SAME RECORD AREA-Klausel zusammen mit der angespochenen Datei aufgeführt wurden.
Die Ausführung einer WRITE-Anweisung mit der Angabe FROM ist gleichbedeutend mit:
MOVE bezeichner-1 TO datensatzname
der gleichen WRITE-Anweisung ohne FROM AngabeDie Übertragung findet entsprechend den Regeln für die MOVE-Anweisung ohne CORRESPONDING-Angabe statt.
Der Inhalt des Datensatzbereiches vor Ausführung der impliziten MOVE-Anweisung hat keinen Einfluss auf den Ablauf der WRITE-Anweisung.
Nach erfolgreicher Ausführung der WRITE-Anweisung steht die Information in dem durch bezeichner-1 angesprochenen Bereich nach wie vor zur Verfügung; dies gilt jedoch, wie in Allgemeine Regel 1 erläutert, nicht unbedingt für den Datensatzbereich.
Wird bei einer Mehrdatenträger-Ausgabedatei für Band oder Plattenspeicher im sequenziellen Zugriffsmodus das Ende des Datenträgers erkannt, werden bei Ausführung der WRITE-Anweisung die folgenden Schritte durchlaufen:
Es werden die Standard-Datenträger-Anfangskennsatzprozeduren und die durch eine USE-Prozedur angegebenen Benutzer-Datenträger-Endekennsatzprozeduren durchlaufen. Dabei hängt die Reihenfolge dieser Prozeduren von den Angaben BEFORE/AFTER der eventuell vorhandenen USE-Prozedur ab.
Es wird ein Datenträgerwechsel durchgeführt.
Es werden die Standard-Datenträger-Anfangskennsatzprozeduren und die durch eine USE-Prozedur angegebenen Benutzer-Datenträger-Anfangskennsatzprozeduren durchlaufen. Dabei hängt die Reihenfolge dieser Prozeduren von den Angaben BEFORE/AFTER der eventuell vorhandenen USE-Prozedur ab.
Nach Ausführung einer WRITE-Anweisung wird der Wert des Datenfeldes einer für diese Datei vorhandenen FILE STATUS-Klausel aktualisiert (siehe auch „FILE STATUS-Klausel").
Ist eine Datei im Erweiterungsmodus geöffnet, bewirkt die WRITE-Anweisung, dass am Ende der Datei Datensätze hinzugefügt werden, als ob die Datei im Ausgabemodus geöffnet wäre. Der erste Datensatz, der nach der Ausführung einer OPEN EXTEND-Anweisung geschrieben wird, ist der Nachfolger des letzten in der Datei befindlichen Satzes.
Falls für die zu datensatzname gehörende Datei die RECORD-Klausel mit VARYING-Angabe angegeben wurde, darf die Anzahl der Zeichenpositionen des Datensatzes, der durch datensatzname bezeichnet wurde, nicht größer sein als ganzzahl-3 und nicht kleiner als ganzzahl-2 (siehe Format 2 im Abschnitt „RECORD-Klausel"). Wurde keine RECORD-Klausel mit VARYING-Angabe angegeben, darf die Anzahl der Zeichenpositionen nicht größer sein als der gemäß Datensatzerklärung größte Satz der zugehörigen Datei. Tritt einer dieser Fälle ein, ist die WRITE-Anweisung erfolglos. Der Schreibvorgang findet nicht statt. Der Inhalt des Datensatzbereiches wird nicht verändert. Der Ein-/Ausgabe-Zustand der mit datensatzname zusammenhängenden Datei wird auf einen Wert gesetzt, der die Ursache der Bedingung anzeigt (siehe „Ein-/Ausgabe-Zustand").
Sowohl die ADVANCING- als auch die END-OF-PAGE-Angabe bieten die Möglichkeit, jede einzelne Zeile innerhalb einer zu druckenden Seite zu positionieren.
Bei Verwendung der Angabe BEFORE/AFTER ADVANCING, wird der entsprechende Datensatz gedruckt, bevor/nachdem die zu druckende Seite entsprechend den nachfolgenden Regeln vorgeschoben wird.
Wenn während der Ausführung einer WRITE-Anweisung mit der NOT END-OF-PAGE-Angabe die Seitenende-Bedingung nicht auftritt, wird bei erfolgreicher Ausführung der WRITE-Anweisung mit unbedingte-anweisung-2 fortgesetzt, nachdem der Satz geschrieben ist und nachdem der Ein-/Ausgabe-Zustand der Datei, aus der der Satz stammt, aktualisiert worden ist. Bei erfolgloser Ausführung der WRITE-Anweisung wird der Ein-/Ausgabe-Zustand der Datei aktualisiert, dann die für diese Datei angegebene USE-Prozedur ausgeführt und schließlich mit unbedingte-anweisung-2 fortgesetzt.
Der Vorschub der Druckseite erfolgt bei Vorhandensein der ADVANCING-Angabe nach folgenden Regeln:
Bei Vorhandensein von bezeichner-2, ganzzahl oder merkname erfolgt der Vorschub entsprechend den in Tabelle 34 angegebenen Regeln.
Ist PAGE angegeben, wird der entsprechende Datensatz gedruckt, bevor oder nachdem auf den Beginn der ersten Zeile einer neuen Seite positioniert wird. Der Beginn einer neuen Seite ist hierbei durch die physischen Eigenschaften des Druckes (Vorschub nach Kanal 1) oder, falls eine LINAGE-Klausel vorhanden ist, durch den Beginn der nächsten logischen Seite definiert (siehe auch Abschnitt „LINAGE-Klausel").
Fehlt die ADVANCING-Angabe, wird für Dateien mit ASSIGN-Angabe PRINTER oder PRINTER literal-1 ein WRITE...AFTER ADVANCING 1 LINE durchgeführt (siehe auch Tabelle 35).
Wird bei Ausführung einer WRITE-Anweisung mit der END-OF-PAGE-Angabe das Ende einer logischen Seite erreicht, wird der Programmablauf mit unbedingte-anweisung-1 fortgesetzt. Das logische Ende einer Seite ist durch die LINAGE-Klausel in der Dateierklärung der Datei definiert.
Eine END-OF-PAGE-Bedingung tritt auf, wenn während der Ausführung einer WRITE-Anweisung mit der END-OF-PAGE-Angabe innerhalb des Seitenfußes gedruckt oder vorgeschoben wird. Dies ist dann der Fall, wenn während der Ausführung einer solchen WRITE-Anweisung der Wert des LINAGE-COUNTER-Sonderregisters gleich dem oder größer als der Wert von ganzzahl-2 oder des durch datenname-2 angesprochenen Datenfeldes einer LINAGE-Klausel wird. In diesem Fall wird die WRITE-Anweisung ausgeführt und danach der Programmablauf bei der in der END-OF-PAGE-Angabe genannten unbedingten Anweisung fortgesetzt.
Eine automatische Seitenüberlaufbedingung tritt immer dann auf, wenn eine gegebene WRITE-Anweisung (mit oder ohne END-OF-PAGE-Angabe) nicht mehr innerhalb der aktuellen Seitengrenzen ausgeführt werden kann.
Dies ist dann der Fall, wenn während der Ausführung einer solchen WRITE-Anweisung der Wert des LINAGE-COUNTER-Sonderregisters größer als der Wert von ganzzahl-1 oder des durch datenname-1 angesprochenen Datenfeldes einer LINAGE-Klausel wird. In diesem Fall wird der entsprechende Datensatz gedruckt, bevor oder nachdem (abhängig von der Angabe BEFORE/AFTER) auf die erste Zeile der nächsten logischen Seite positioniert worden ist. Diese ist durch die Angabe der LINAGE-Klausel festgelegt. Die in der END-OF-PAGE-Angabe genannte unbedingte Anweisung wird durchlaufen, nachdem der Datensatz geschrieben und das Gerät neu positioniert
wurde.Falls die Angaben ganzzahl-2 oder datenname-2 der LINAGE-Klausel nicht vorhanden sind, tritt die END-OF-PAGE-Bedingung dann auf, wenn während der Ausführung der Ausführung einer WRITE-Anweisung mit EOP-Angabe der Wert des LINAGE-COUNTER-Sonderregisters gleich dem oder größer als der Wert von ganzzahl-1 oder des durch datenname-1 angesprochenen Datenfeldes einer LINAGE-Klausel wird.
Wenn ganzzahl-2 oder datenname-2 in der LINAGE-Klausel angegeben sind, die Ausführung einer WRITE-Anweisung jedoch dazu führen würde, dass der Wert des LINAGE-COUNTER sowohlgleich dem oder größer als der Wert von datenname-2 bzw. ganzzahl-2, als auch
gleich dem oder größer als der Wert von datenname-1 bzw. ganzzahl-1
ist, läuft die Verarbeitung so ab, als ob ganzzahl-2 oder datenname-2 nicht vorhanden wären.
Wird die ADVANCING-Angabe zusammen mit der LINAGE-Klausel für ein Gerät verwendet, das keinen physischen Drucker darstellt, werden sowohl Leerzeilen am oberen und unteren Seitenrand als auch innerhalb der Seite durch Datensätze mit Inhalt Leerzeichen auf dem entsprechenden Speichermedium dargestellt.
Wird bei Ausführung einer WRITE-Anweisung versucht, außerhalb der physischen Grenzen einer Datei zu schreiben, tritt eine Ausnahmebedingung auf und die folgenden Schritte laufen ab:
Der Wert des FILE STATUS-Datenfeldes der entsprechenden Datei wird gesetzt, um eine Verletzung der Dateigrenzen anzuzeigen (siehe „FILE STATUS-Klausel" ).
Ist für diese Datei explizit oder implizit eine USE ERROR/EXCEPTION-Prozedur vorhanden, wird sie durchlaufen.
Ist für diese Datei weder explizit noch implizit eine USE-Prozedur vorhanden, führt das zum Programmabbruch.
Bei Ausführung einer WRITE-Anweisung muss die Datei mit den Angaben OUTPUT, oder EXTEND in der OPEN-Anweisung eröffnet worden sein.
Tabelle 36 enthält genaue Angaben über die Verwendung des ersten Zeichens des Datensatzes in Abhängigkeit vom symbolischen Gerätenamen der ASSIGN-Klausel und den Angaben der WRITE-Anweisung.
Bei einer WRITE-Anweisung mit AFTER-ADVANCING-Angabe wird auf die angeforderte Zeile positioniert und nach dem Drucken um eine weitere Zeile vorgeschoben. Bei ASSIGN-Angabe PRINTER literal-1 wird eine WRITE AFTER-Angabe wie folgt ausgeführt:
Schreiben eines Leersatzes mit entsprechender Vorschubangabe (WRITE BEFORE).
Schreiben des Datensatzes.
Vorschubunterdrückung ist für jedes Gerät nur bei Angabe von WRITE BEFORE möglich.
Beispiel 8-88
Die Datei LADEDAT wird eingelesen und in die Druckdatei ADATEI geschrieben. Der jeweils aktuelle Datensatz wird vor dem Einfügen von 5 Leerzeilen geschrieben.
IDENTIFICATION DIVISION. PROGRAM-ID. WP1. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ADATEI ASSIGN TO PRINTER "AUSGABE". SELECT LADEDAT ASSIGN TO "EINGABE". DATA DIVISION. FILE SECTION. FD ADATEI LINAGE IS 24 LINES LINES AT TOP 24 LINES AT BOTTOM 24. 01 KUNDENSATZ PIC X(95). FD LADEDAT LABEL RECORD IS STANDARD. 01 KUNSATZ. 05 KNA PIC X(30). 05 STR PIC X(20). 05 ORT PIC X(20). 05 PLZ PIC X(5). 05 ART PIC X(20). WORKING-STORAGE SECTION. 01 DATEI-SCHALTER PIC X VALUE LOW-VALUE. 88 EOF VALUE HIGH-VALUE. PROCEDURE DIVISION. HAUPT SECTION. OEFFNEN. OPEN OUTPUT ADATEI. OPEN INPUT LADEDAT. EINLESEN. PERFORM UNTIL EOF READ LADEDAT INTO KUNDENSATZ AT END CLOSE ADATEI LADEDAT SET EOF TO TRUE NOT AT END WRITE KUNDENSATZ BEFORE ADVANCING 5 END-READ END-PERFORM STOP RUN.
Vorschubangabe |
Inhalt/Bedeutung |
Ergebnis |
|
bezeichner-2 |
ganzzahlig numerisch mit einem Wert von01 bis 15 |
n-zeiliger Vorschub |
|
bezeichner-2 |
alphanumerisches Datenfeld der Länge 1(PIC X). Folgende Werte sind zulässig: |
||
Leerzeichen |
einzeiliger Vorschub |
||
0 |
zweizeiliger Vorschub |
||
|
dreizeiliger Vorschub |
||
+ |
Vorschubunterdrückung |
||
1-8 |
Vorschub Kanal 1-8 |
||
A |
Vorschub Kanal 10 |
||
B |
Vorschub Kanal 11 |
||
ganzzahl |
numerisches Literal 01 bis 15 |
n-zeiliger Vorschub |
|
merkname |
Ein Name, mit dem innerhalb des SPECIAL-NAMES-Paragrafen ein Herstellername verknüpft worden ist. |
herstellername |
Ergebnis |
C01 bis C08 C10 oder C11 |
Vorschub Kanal 1-8 Vorschub Kanal 10 bzw. 11 |
Tabelle 34: Bedeutung und Ergebnis der Druckervorschubzeichen in einer WRITE-Anweisung mit ADVANCING
symbolischer Gerätename |
WRITE-Anweisung ohne ADVANCING-Angabe |
WRITE-Anweisung mit ADVANCING-Angabe |
Kommentar |
PRINTER literal |
Standardvorschub bei fehlender ADVANCING-Angabe entspricht einer Angabe AFTER 1 LINE; das erste Zeichen des Datensatzes steht für Benutzerdaten zur Verfügung. |
Das erste Zeichen des Datensatzes steht für Benutzerdaten zur Verfügung. |
Der Platz für das Vorschubzeichen wird vom Compiler reserviert und ist dem Benutzer nicht zugänglich. Für diesen Druckertyp ist die Angabe der LINAGE-Klausel in der Dateierklärung möglich. Es sind sowohl WRITE-Anweisungen mit als auch ohne ADVANCING-Angabe für eine Datei zulässig. |
PRINTER PRINTER01 - PRINTER99 |
wie oben |
wie oben |
Der Platz für das Vorschubzeichen wird vom Compiler reserviert und ist dem Benutzer nicht zugänglich. Die LINAGE-Klausel ist für diese Datei nicht erlaubt. Die Verwendung einer WRITE-Anweisung mit und ohne ADVANCING-Angabe für ein und dieselbe Datei ist nicht zulässig. Sollte dennoch dieser Fall eintreten, wird für die Sätze ohne ADVANCING-Angabe ein WRITE AFTER ADVANCING 1 LINE implizit durchgeführt. |
literal |
Der Vorschub wird durch das erste Zeichen in jedem logischen Datensatz kontrolliert; der Benutzer muss daher vor der Ausführung jeder solchen WRITE-Anweisung das geeignete Steuerzeichen dort zur Verfügung stellen. |
Der Benutzer muss das erste Zeichen eines logischen Datensatzes reservieren; an diese Stelle wird vom Laufzeitsystem zum Programmablauf das Vorschubzeichen eingetragen. Eventuell enthaltene Benutzerdaten werden überschrieben. |
Es dürfen WRITE-Anweisungen mit und ohne ADVANCING-Angabe gemischt verwendet werden. In beiden Fällen beginnt jedoch die Benutzerinformation des Druckersatzes erst ab dem zweiten Zeichen des Datensatzes. |
Tabelle 35: Verwendung von symbolischen Gerätenamen für Drucker in Verbindung mit der WRITE-Anweisung
Format 2 für relative und indizierte Dateiorganisation
WRITE datensatzname [FROM bezeichner]
[INVALID KEY unbedingte-anweisung-1]
[NOT INVALID KEY unbedingte-anweisung-2]
[END-WRITE]
Syntaxregeln
datensatzname und bezeichner dürfen nicht den gleichen Speicherbereich belegen.
datensatzname muss einer Dateierklärung (FD) der DATA DIVISION des Programms zugeordnet sein und darf gekennzeichnet werden.
Die INVALID KEY-Angabe muss für eine Datei vorhanden sein, falls nicht eine entsprechende USE-Prozedur vereinbart wurde.
Allgemeine Regeln
Für relative und indizierte Dateiorganisation gilt:
Die Datei, deren Datensatz in der WRITE-Anweisung angesprochen wird, muss im Eröffnungsmodus Ausgabe (OUTPUT), Aktualisieren (I-O) oder Erweitern (EXTEND) eröffnet worden sein.
Der durch eine WRITE-Anweisung ausgegebene Datensatz steht im Satzbereich nicht mehr zur Verfügung, es sei denn, die zum Datensatz gehörende Datei wurde in einer SAME RECORD AREA-Klausel aufgeführt, oder die Ausführung der WRITE-Anweisung wurde wegen des Auftretens einer Schlüsselfehler-Bedingung erfolglos abgebrochen. Der Datensatz steht auch den Dateien zur Verfügung, die in einer SAME RECORD AREA-Klausel zusammen mit der angesprochenen Datei aufgeführt wurden.
Die Ausführung einer WRITE-Anweisung mit der Angabe FROM ist gleichbedeutend mit:
MOVE bezeichner-1 TO datensatzname
der gleichen WRITE-Anweisung ohne FROM AngabeDie Übertragung findet entsprechend den Regeln für die MOVE-Anweisung ohne CORRESPONDING-Angabe statt.
Der Inhalt des Datensatzbereiches vor Ausführung der impliziten MOVE-Anweisung hat keinen Einfluss auf den Ablauf der WRITE-Anweisung.
Die Ausführung einer WRITE-Anweisung bewirkt, dass der Inhalt des Datenfeldes aktualisiert wird, das in der FILE STATUS-Klausel der zugehörigen Dateierklärung angegeben wurde (siehe auch „FILE STATUS-Klausel").
Wenn während der Ausführung einer WRITE-Anweisung mit der NOT INVALID KEY-Angabe die Schlüsselfehler-Bedingung nicht auftritt, wird mit unbedingte-anweisung-2 wie folgt fortgesetzt:
Bei erfolgreicher Ausführung der WRITE-Anweisung: nachdem der Satz geschrieben ist und nachdem der Ein-/Ausgabe-Zustand der Datei, aus der der Satz stammt, aktualisiert worden ist.
Bei erfolgloser Ausführung der WRITE-Anweisung: nachdem der Ein-/Ausgabe Zustand der Datei aktualisiert wurde und nach Ausführung der USE-Prozedur, die für die Datei, aus der der Satz stammt, angegeben wurde.
Falls eine Schlüsselfehler-Bedingung auftrat, ist die WRITE-Anweisung ohne Erfolg ausgeführt worden; der Inhalt des Satzbereiches steht weiterhin zur Verfügung, und ein eventuell vorhandenes FILE STATUS-Datenfeld dieser Datei wird auf einen Wert gesetzt, der den Grund der Schlüsselfehler-Bedingung anzeigt. Das Programm wird entsprechend den Regeln der Schlüsselfehler-Bedingung fortgesetzt.
Die Anzahl der Zeichenpositionen in dem durch datensatzname bezeichneten Datensatz darf nicht größer als die größte und nicht kleiner als die kleinste Anzahl von Zeichenpositionen sein, die laut RECORD IS VARYING-Klausel für den Datensatz erlaubt ist. Andernfalls ist die Ausführung der WRITE-Anweisung erfolglos, die Schreiboperation findet nicht statt, der Inhalt des Satzbereichs bleibt unbeeinflusst und der Ein-/Ausgabe-Zustand für die entsprechende Datei wird auf den Wert gesetzt, der das Überschreiten der Satzlängengrenzen anzeigt (siehe „Ein-/Ausgabe-Zustand").
Nur für relative Dateiorganisation gilt:
Bei Ausführung einer WRITE-Anweisung wird zur Bestimmung der Position des auszugebenden Datensatzes innerhalb der Datei der Inhalt des RELATIVE KEY-Datenfeldes verwendet. Vor Ausführung der WRITE-Anweisung muss der Inhalt des zugehörenden Schlüsselfeldes entsprechend gesetzt sein (siehe RELATIVE KEY-Angabe im Abschnitt „ACCESSMODE-Klausel").
Befindet sich eine Datei im Ausgabemodus (OPEN-Anweisung mit OUTPUT-Angabe) ist Folgendes zu beachten:
Im sequenziellen Zugriffsmodus veranlasst die WRITE-Anweisung die Ausgabe eines Datensatzes zum Erstellen einer neuen Datei. Der erste Datensatz bekommt die relative Satznummer 1 (eins) während die danach folgenden Datensätze die Nummern 2, 3, 4 ... erhalten. Wurde RELATIVE KEY angegeben, wird während der Ausführung der WRITE-Anweisung vom Ein-/Ausgabe-System die relative Satznummer im Datenfeld, dessen Name in der RELATIVE KEY-Angabe auftritt, eingetragen.
Im wahlfreien oder dynamischen Zugriffsmodus (die im Falle OUTPUT gleichbe deutend sind) muss der Inhalt des Datenfeldes der hier obligatorischen RELATIVE KEY-Angabe vom Benutzer auf den Wert der relativen Satznummer gesetzt werden, die der im Satzbereich befindliche Datensatz erhalten soll. Der entsprechende Datensatz wird dann als n-ter Datensatz der Datei ausgegeben, wobei n der Wert der relativen Satznummer ist.
Befindet sich eine Datei im Erweiterungsmodus (OPEN-Anweisung mit EXTEND-Angabe), veranlasst die WRITE-Anweisung das Hinzufügen eines Datensatzes an die Datei. Der so übergebene erste Datensatz erhält dabei eine relative Satznummer, die um 1 höher ist als die höchste relative Satznummer der bereits existierenden Sätze in der Datei. Jeder nachfolgende Datensatz hat dann eine um 1 (gegenüber dem letzten Satz) erhöhte Satznummer. Wenn die RELATIVE KEY-Angabe vorliegt, wird bei jedem WRITE die relative Satznummer der MOVE-Anweisung entsprechend in das Satzschlüsselfeld übertragen.
Befindet sich eine Datei im Aktualisierungsmodus (OPEN-Anweisung mit I-O-Angabe) und im wahlfreien oder dynamischen Zugriffsmodus (was in diesem Falle gleichbedeutend ist), werden durch die WRITE-Anweisung Datensätze in eine bereits existierende Datei eingefügt. Der Inhalt des Datenfeldes der hier obligatorischen RELATIVE KEY-Angabe muss vom Benutzer auf den Wert der relativen Satznummer gesetzt werden, die der im Satzbereich befindliche Datensatz erhalten soll. Mit Ausführung der WRITE-Anweisung wird der Satzinhalt mit entsprechender Satznummer dem Ein-/AusgabeSystem übergeben.
Die Schlüsselfehler-Bedingung wird durch die in Tabelle 36 angeführten Gründe verursacht.
ACCESS MODE-Klausel
OPEN-Angabe und Ergebnis
Grund der Schlüsselfehler-Bedingung
SEQUENTIAL
OUTPUT oder EXTEND
Es wird ein Datensatz einer existierenden oder neu zu erstellenden Datei hinzugefügt.
Es steht kein Platz für den Datensatz in der Datei zur Verfügung.
RANDOM
oder DYNAMIC
OUTPUT oder I-O
Es wird ein Datensatz einer bestehenden Datei hinzugefügt.
Der Inhalt des RELATIVE KEY-Datenfeldes bezeichnet einen Datensatz, der bereits in der Datei existiert, oder es steht kein Platz für den Datensatz in der Datei zur Verfügung.
Tabelle 36: WRITE-Anweisung, Gründe für das Auftreten einer Schlüsselfehler-Bedingung
Nur für indizierte Dateiorganisation gilt:Bei Ausführung einer WRITE-Anweisung wird zur Bestimmung der Position des auszugebenden Datensatzes innerhalb der Datei der Inhalt des RECORD KEY-Datenfeldes verwendet. Vor Ausführung der WRITE-Anweisung muss der Inhalt des zugehörenden Schlüsselfeldes entsprechend gesetzt sein (siehe „RECORD KEY-Klausel").
Befindet sich eine Datei im Ausgabemodus (OPEN-Anweisung mit OUTPUT-Angabe) ist Folgendes zu beachten:
Im sequenziellen Zugriffsmodus veranlasst die WRITE-Anweisung die Ausgabe eines Datensatzes zum Erstellen einer neuen Datei. Die Datensätze müssen dabei in aufsteigender Reihenfolge des RECORD KEY übergeben werden. Vor Ausführung der WRITE-Anweisung muss der Inhalt des RECORD KEY-Datenfeldes auf den gewünschten Wert gesetzt werden.
Im wahlfreien oder dynamischen Zugriffsmodus (die im Falle OUTPUT gleichbedeutend sind) dürfen die Datensätze in einer im Programm festgelegten Reihenfolge an das Ein-/Ausgabe-System übergeben werden.
Die Schlüsselfehler-Bedingung wird durch die in Tabelle 37 angeführten Gründe verursacht.
ACCESS MODEKlausel
OPEN-Angabe und Ergebnis
Grund der Schlüsselfehler-Bedingung
SEQUENTIAL
OUTPUT / EXTEND
Einer neu zu erstellenden Datei wird ein Datensatz hinzugefügt („Lademodus“).
Der Primärschlüsselwert ist nicht größer als der des vorhergehenden Datensatzes (die Primärschlüssel müssen in aufsteigender Reihenfolge alphanumerisch sortiert sein).
In der Datei steht kein Platz mehr zur Aufnahme des Datensatzes zur Verfügung.RANDOM
oder DYNAMIC
OUTPUT / I-O / EXTEND
Einer bestehenden Datei wird ein Datensatz hinzugefügt.
Der Datensatz hat den gleichen Primärschlüsselwert wie ein bereits in der Datei vorhandener Datensatz.
In der Datei steht kein Platz mehr zur Aufnahme des Datensatzes zur Verfügung.Ein Alternativschlüsselwert, für den keine Duplikate zulässig sind, ist in einem der Datensätze der Datei schon vorhanden.
Tabelle 37: WRITE-Anweisung, Gründe für das Auftreten einer Schlüsselfehler-BedingungWurde die Datei im Erweiterungsmodus eröffnet, muss der erste an das DVS übergebene Satz einen Primärschlüssel haben, dessen Wert höher ist als der höchste in der Datei vorhandene Primärschlüsselwert.
Ist für die Datei ALTERNATE RECORD KEY WITH DUPLICATES angegeben, braucht der Alternativschlüsselwert nicht eindeutig zu sein.