Funktion
Mit Hilfe der STRING-Anweisung wird der Inhalt von zwei oder mehreren Datenfeldern ganz oder teilweise in ein einzelnes Datenfeld übertragen und zusammengefügt (gekettet).
Format
STRING {{bezeichner-1 | literal-1}...
[
DELIMITED BY {bezeichner-2 | literal-2 | SIZE}]
}...
INTO bezeichner-3 [WITH POINTER bezeichner-4]
[ON OVERFLOW unbedingte-anweisung-1]
[NOT ON OVERFLOW unbedingte-anweisung-2]
[END-STRING]
Syntaxregeln
Jedes Literal kann eine figurative Konstante sein, die jedoch nicht mit ALL beginnen darf.
Alle Literale müssen nichtnumerische Literale sein. Alle Bezeichner, mit Ausnahme von bezeichner-4, müssen implizit oder explizit mit USAGE DISPLAY oder USAGE NATIONAL beschrieben sein. Ist einer der literal-1, literal-2, bezeichner-1, bezeichner-2 oder bezeichner-3 von der Klasse national, dann müssen alle von der Klasse national sein.
Wenn bezeichner-1... numerische Datenelemente sind, müssen sie als ganzzahlige Datenelemente ohne das Symbol „P“ in der Maskenzeichenfolge beschrieben sein.
Ist DELIMITED BY nicht angegeben, so wird DELIMITED BY SIZE angenommen.
bezeichner-1..., literal-1... sind die Sendefelder; bezeichner-3 ist das Empfangsfeld.
bezeichner-3 darf kein druckaufbereitetes Datenelement sein und darf nicht mit der JUSTIFIED-Klausel beschrieben sein. bezeichner-3 darf keine stark typisierte Datengruppe sein.
bezeichner-4 ist ein Zählerfeld und muss ein ganzzahliges, numerisches Datenelement sein, das groß genug ist, einen Wert von der Größe von bezeichner-3 plus 1 Byte aufzunehmen. Das Symbol „P“ darf in der Maskenzeichenfolge von bezeichner-4 nicht benutzt werden.
bezeichner-3 darf nicht einer Teilfeldselektion unterzogen werden.
Allgemeine Regeln
bezeichner-2, literal-2 stellen Begrenzer dar, d.h. sie markieren eine Zeichenfolge, bis zu der der Inhalt eines Sendefeldes übertragen werden soll.
Ist SIZE angegeben, wird das durch bezeichner-1, literal-1 definierte Datenfeld vollständig übertragen.Ist als literal-1 oder literal-2 eine figurative Konstante angegeben, so wird sie als ein Datenfeld der Länge 1 betrachtet, mit der gleichen USAGE wie sie bezeichner-3 hat.
Beim Ausführen einer STRING-Anweisung läuft die Übertragung von Zeichen nach folgenden Regeln ab:
Die Sendefelder literal-1 bzw. der Inhalt der als bezeichner-1 definierten Datenfelder werden aufeinanderfolgend in das Empfangsfeld von bezeichner-3 übertragen. Hierbei gelten die Regeln für die MOVE-Anweisung von national nach national, wenn bezeichner-3 von der Klasse national ist, anderenfalls von alphanumerisch nach alphanumerisch. In beiden Fällen findet aber kein Auffüllen mit Leerzeichen statt.
Ist bezeichner-1 ein null-längiges Datenfeld, so wird er nicht übertragen.Ist DELIMITED BY ohne SIZE angegeben, wird der Inhalt von bezeichner-1... bzw. der Wert von literal-1 zeichenweise von links nach rechts in das Empfangsfeld übertragen. Dabei wird mit dem äußersten linken Zeichen begonnen und die Übertragung wird solange fortgesetzt, bis entweder das Ende des jeweiligen Sendefeldes erreicht ist oder die Zeichenfolge des Begrenzers literal-2 bzw. der Inhalt von bezeichner-2 erkannt wird. Der Begrenzer wird nicht übertragen.
Ist DELIMITED BY SIZE angegeben oder ist bezeichner-2 ein null-längiges Datenfeld, wird der gesamte Inhalt der Sendefelder literal-1 bzw. bezeichner-1 in das Empfangsfeld bezeichner-3 übertragen, bis alle Sendefelder übertragen sind oder das Ende von bezeichner-3 erreicht ist. Die Reihenfolge der Übertragung entspricht der Reihenfolge der Sendefelder in der STRING-Anweisung.
Wird POINTER angegeben, ist das Zählerfeld bezeichner-4 explizit für den Benutzer verfügbar, d.h. der Anfangswert muss vom Benutzer gesetzt werden. Er darf nicht kleiner als 1 sein und muss groß genug sein, um einen Wert in der Länge von bezeichner-3 plus 1 Byte aufnehmen zu können.
Die Subskripte eines Bezeichners in der POINTER-Angabe werden ausgewertet, bevor die STRING-Anweisung ausgeführt wird.
Wird POINTER weggelassen, werden die nachfolgenden Regeln so angewendet, als ob der Benutzer bezeichner-4 mit dem Anfangswert 1 versehen hätte.
Bei der Übertragung in das Empfangsfeld bezeichner-3 wird jedes Zeichen einzeln aus dem Sendefeld an die Zeichenstelle von bezeichner-3, die durch den Wert des Zählerfeldes bezeichner-4 bestimmt wird, übertragen. Nach jeder Übertragung eines Zeichens wird bezeichner-4 um 1 erhöht. Der Wert von bezeichner-4 wird während der Ausführung der STRING-Anweisung nur auf diese Weise geändert.
Nach Ausführen der STRING-Anweisung hat nur der Teil des Empfangsfeldes bezeichner-3, in den Zeichen übertragen wurden, einen geänderten Inhalt; der Rest von bezeichner-3 bleibt unverändert.
Wenn zu irgendeinem Zeitpunkt während oder nach der Initialisierung der STRING-Anweisung, jedoch vor ihrer vollständigen Abarbeitung, der Wert des Zählerfeldes bezeichner-4 entweder kleiner als 1 oder größer als die Anzahl der Zeichenstellen im Empfangsfeld bezeichner-3 ist, werden keine weiteren Daten nach bezeichner-3 übertragen, sondern es wird die unbedingte Anweisung in der ON OVERFLOW-Angabe (sofern angegeben) ausgeführt.
Wurde die ON OVERFLOW-Angabe weggelassen und tritt eine der oben beschriebenen Bedingungen ein, geht die Steuerung zur nächsten auszuführenden Anweisung über.
Die unbedingte Anweisung in der NOT ON OVERFLOW-Angabe wird ausgeführt, wenn die STRING-Anweisung beendet ist, ohne dass die oben beschriebenen Bedingungen eingetreten sind.
Beispiel 8-77
IDENTIFICATION DIVISION. PROGRAM-ID. STRNG. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. TERMINAL IS T. DATA DIVISION. WORKING-STORAGE SECTION. 77 FELD1 PIC X(16) VALUE "ANFANGSBEDINGUNG". 77 FELD2 PIC X(12) VALUE "WERTEBEREICH". 77 FELD3 PIC X(25) VALUE SPACES. 77 FELD4 PIC 99 VALUE 3. PROCEDURE DIVISION. PROC SECTION. HAUPT. DISPLAY "Vor STRING: " UPON T. PERFORM DISPLAY-FELDER. STRING FELD1, FELD2 DELIMITED BY "B", " SETZEN" DELIMITED BY SIZE INTO FELD3 WITH POINTER FELD4 ON OVERFLOW DISPLAY "Fehler" UPON T END-STRING DISPLAY "Nach STRING" UPON T. PERFORM DISPLAY-FELDER. STOP RUN. DISPLAY-FELDER. DISPLAY "Feld1 = *" FELD1 "*" UPON T. DISPLAY "Feld2 = *" FELD2 "*" UPON T. DISPLAY "Feld3 = *" FELD3 "*" UPON T. DISPLAY "Feld4 = *" FELD4 "*" UPON T.
Ergebnis:
Vor STRING | Nach STRING |
|
|
|
|
|
|
|
|