Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

UNSTRING-Anweisung

&pagelevel(4)&pagelevel

Funktion

Durch die UNSTRING-Anweisung werden aufeinanderfolgende Daten aus einem Sendefeld getrennt (entkettet) und in mehrere Empfangsfelder übertragen.

Format


UNSTRING bezeichner-1

[DELIMITED BY [ALL] {bezeichner-1 | literal-1} [OR [ALL] {bezeichner-3 | literal-2}]...]

 INTO {bezeichner-4 [DELIMITER IN bezeichner-5] [COUNT IN bezeichner-6]}...

[WITH POINTER bezeichner-7] [TALLYING IN bezeichner-8]

[ON OVERFLOW unbedingte-anweisung-1]

[NOT ON OVERFLOW unbedingte-anweisung-2]

[END-UNSTRING]


Syntaxregeln

  1. literal-1 und literal-2 müssen Literale von der Kategorie alphanumerisch oder national sein. Sie dürfen aber keine figurativen Konstanten sein, die mit ALL beginnen.

  2. bezeichner-1, bezeichner-2, bezeichner-3, bezeichner-5 müssen Datenfelder von der Kategorie alphanumerisch oder national sein.

  3. Ist irgendein literal-1, literal-2, bezeichner-1, bezeichner-2, ..., bezeichner-5 von der Kategorie national, dann müssen alle von der Kategorie national sein.

  4. bezeichner-4 darf sein:

    • von der Kategorie national

    • von der Kategorie alphabetisch, alphanumerisch oder numerisch. Er muss dann explizit oder implizit mit USAGE DISPLAY beschrieben sein. Ein numerisches Datenfeld darf nicht das Zeichen ’P’ in der Maskenzeichenfolge haben.

  5. bezeichner-6, bezeichner-7, bezeichner-8 müssen als ganzzahlige, numerische Datenelemente beschrieben sein.
    Das Symbol "P“ darf in der PICTURE-Maskenzeichenfolge nicht angegeben sein.

  6. bezeichner-1 ist das Sendefeld.

  7. bezeichner-4 ist das Empfangsfeld; bezeichner-5 ist das Empfangsfeld für Begrenzer.

  8. bezeichner-1 darf nicht einer Teilfeldselektion unterzogen werden.
  9. DELIMITER IN und COUNT IN können nur im Zusammenhang mit DELIMITED BY angegeben werden.
  10. Kein Bezeichner darf mit der Stufennummer 88 definiert sein.

Allgemeine Regeln

  1. Alle Bezugnahmen auf bezeichner-2 und literal-1gelten ebenso für bezeichner-3 und literal-2 sowie für alle ihre Wiederholungen.

  2. Ist bezeichner-1 ein null-längiges Datenfeld:

    1. Der Inhalt von bezeichner-4 bis bezeichner-8 bleibt unverändert.

    2. Es wird weder unbedingte-anweisung-1 noch unbedingte-anweisung-2 ausgeführt.

    3. Die Ablaufsteuereung geht sofort zum Ende der UNSTRING-Anweisung über.

  3. Ist als literal-1 eine figurative Konstante angegeben, so steht sie für ein 1 Zeichen langes nationales Datenfeld, wenn bezeichner-1 ein nationales Datenfeld ist, andernfalls für ein 1 Zeichen langes alphanumerisches Datenfeld.

  4. Ist ALL angegeben, werden aufeinanderfolgende Wiederholungen von literal-1 bzw. bezeichner-2 so gewertet, als wären sie nur einmal aufgetreten, und literal-1 bzw. bezeichner-2 wird nur einmal nach bezeichner-5 übertragen.

  5. Folgen zwei Begrenzer unmittelbar aufeinander, wird das aktuelle Empfangsfeld mit Leerzeichen gefüllt, wenn es alphabetisch, alphanumerisch oder national beschrieben ist. Es wird mit Nullen gefüllt, wenn es numerisch beschrieben ist.

  6. literal-1, bezeichner-2 stellen Begrenzer dar. Besteht ein Begrenzer aus zwei oder mehr Zeichen, müssen alle Zeichen in der gleichen zusammenhängenden Reihenfolge wie im Sendefeld auftreten, damit sie als Begrenzer erkannt werden.
    Ist bezeichner-2 ein null-längiges Datenfeld, so wird er nicht als Begrenzer erkannt.

  7. Sind zwei oder mehr Begrenzer in der DELIMITED BY-Angabe spezifiziert, so wird diese mit OR verknüpft. Jeder Begrenzer wird mit dem Sendefeld verglichen. Ist der Vergleich positiv, d.h. die gesuchten Zeichen sind im Sendefeld gefunden worden, gelten sie als einzelne Begrenzer. Kein Zeichen im Sendefeld kann Bestandteil von mehr als einem Begrenzer sein. Begrenzer können sich nicht überschneiden.
    Die Begrenzer werden mit dem Sendefeld in der Reihenfolge verglichen, in der sie in der UNSTRING-Anweisung angegeben sind.

  8. Nach Initialisierung der UNSTRING-Anweisung ist bezeichner-4 der aktuelle Empfangsbereich. Die Daten werden von bezeichner-1 nach bezeichner-4 entsprechend den folgenden Regeln übertragen:

    1. Ist POINTER angegeben, beginnt die Prüfung mit der Zeichenfolge von bezeichner-1 mit der relativen Zeichenposition, die durch bezeichner-7 angezeigt wird.

      Ist POINTER nicht angegeben, beginnt die Prüfung mit dem äußersten linken Zeichen von bezeichner-1.

    2. Ist DELIMITED BY angegeben, wird die Prüfung von links nach rechts fortgesetzt, bis ein Begrenzer entweder spezifiziert durch den Wert von literal-1 oder das Datenfeld von bezeichner-2 angetroffen wird.

      Ist DELIMITED BY nicht angegeben, ist die Anzahl der geprüften Zeichen genauso groß wie die Größe des aktuellen Empfangsbereichs.

      Ist jedoch das Vorzeichen des Empfangsfeldes so spezifiziert, dass es eine eigene Zeichenposition belegt, ist die Anzahl der Zeichen um eins geringer als die Größe des aktuellen Empfangsbereichs.

      Ist das Ende von bezeichner-1 erreicht, ehe ein Begrenzer gefunden wurde, endet die Prüfung mit dem zuletzt geprüften Zeichen.

    3. Die Zeichenfolge, die bis zum Begrenzer ermittelt wurde, wird wie ein nationales Datenelement behandelt, wenn bezeichner-1 von der Kategorie national ist.
      Andernfalls wird sie wie ein alphanumerisches Datenelement behandelt. Entsprechend den Regeln der MOVE-Anweisung (siehe "MOVE-Anweisung" "MOVE-Anweisung") wird dieses in den aktuellen Empfangsbereich übertragen, ein Dezimalpunkt wird jedoch ignoriert.

    4. Ist DELIMITER IN angegeben, werden die Begrenzungszeichen wie ein nationales Datenelement behandelt, wenn bezeichner-1 von der Kategorie national ist.
      Andernfalls werden sie wie ein alphanumerisches Datenelement behandelt. Entsprechend den Regeln der MOVE-Anweisung (siehe "MOVE-Anweisung" "MOVE-Anweisung") wird dieses in den aktuellen Empfangsbereich übertragen.
      Wenn das Ende von bezeichner-1 erreicht wurde, ohne einen Begrenzer zu finden, werden leerzeichen in bezeichner-5 übertragen.

    5. Ist COUNT IN angegeben, wird die Anzahl der geprüften Zeichen (ausgenommen evtl. vorhandene Begrenzungszeichen) in den Bereich von bezeichner-6 nach den Regeln der Elementübertragung übertragen.

    6. Ist DELIMITED BY angegeben, wird die Überprüfung von bezeichner-1 mit dem ersten Zeichen rechts vom Begrenzer fortgesetzt.

      Ist DELIMITED BY nicht angegeben, wird die Überprüfung mit dem nächsten Zeichen nach dem letzten übertragenen Zeichen fortgesetzt.

    7. Nachdem die Daten nach bezeichner-4 übertragen worden sind, ist die Wiederholung von bezeichner-4 der aktuelle Empfangsbereich.
      Die beschriebene Prozedur wird solange wiederholt, bis alle Zeichen im bezeichner-1 verarbeitet oder keine Empfangsbereiche mehr vorhanden sind.

  9. Die Anfangswerte für die Datenfelder mit der POINTER- oder TALLYING-Angabe müssen vom Benutzer gesetzt werden.

  10. Der Inhalt von bezeichner-7 wird bei jedem im Datenfeld von bezeichner-1 geprüften Zeichen um 1 erhöht.

    Wenn die UNSTRING-Anweisung mit POINTER-Angabe ausgeführt ist, enthält bezeichner-7 einen Wert, der dem Anfangswert, zuzüglich der Anzahl der im Datenfeld von bezeichner-1 geprüften Zeichen entspricht.

  11. Wenn eine UNSTRING-Anweisung mit TALLYING-Angabe ausgeführt ist, enthält bezeichner-8 einen Wert, der dem Anfangswert, zuzüglich der Anzahl der Empfangsfelder, die angesprochen wurden, entspricht.
  12. Durch jede der folgenden Situationen wird eine OVERFLOW-Bedingung verursacht:

    1. Bei der Ausführung von UNSTRING ist der Wert im Datenfeld von bezeichner-7 kleiner als 1 oder größer als die Länge von bezeichner-1.

    2. Während der Ausführung der UNSTRING-Anweisung sind alle Datenempfangsbereiche angesprochen worden, das Datenfeld von bezeichner-1 enthält jedoch noch Zeichen, die nicht geprüft worden sind.

  13. Wenn eine OVERFLOW-Bedingung vorliegt, wird die UNSTRING-Anweisung beendet.
    Ist ON OVERFLOW angegeben, wird die in dieser Angabe enthaltene unbedingte Anweisung ausgeführt. Wurde die ON OVERFLOW-Angabe weggelassen, geht die Steuerung zur nächsten auszuführenden Anweisung über.
  14. Die unbedingte Anweisung in der NOT ON OVERFLOW-Angabe wird ausgeführt, wenn die UNSTRING-Anweisung beendet und keine der oben beschriebenen Bedingungen eingetreten ist.
  15. Die Auswertung der Subskribierung und Indizierung für die Bezeichner geschieht wie folgt:

    1. Sind die Felder bezeichner-1, bezeichner-7, bezeichner-8 subskribiert oder indiziert, wird der Indexwert für diese Felder nur einmal berechnet und zwar unmittelbar vor der Ausführung der UNSTRING-Anweisung.

    2. Jede Subskribierung von Bezeichnern in der DELIMITED BY-, INTO-, DELIMITER IN- und COUNT-Angabe wird ausgewertet, bevor die Datenübertragung in das jeweilige Datenfeld erfolgt.

Beispiel 8-81

IDENTIFICATION DIVISION.
 PROGRAM-ID. UNSTRING.
 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 SPECIAL-NAMES.
     TERMINAL IS T.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01  FELD      PIC  X(12)  VALUE  "ABCDEFGHIJKL".
 01  BEREICH.
     02  TEIL1 PIC X       VALUE SPACES.
     02  TEIL2 PIC XX      VALUE SPACES.
     02  TEIL3 PIC XXX     VALUE SPACES.
 01  ZAHL      PIC 99      VALUE ZERO.
 PROCEDURE DIVISION.
 PROC SECTION.
 HAUPT.
     DISPLAY "Vor UNSTRING: " UPON T.
     PERFORM DISPLAY-FELDER.
 *
     UNSTRING FELD DELIMITED BY "E" OR "H" OR "K" OR "L"
         INTO TEIL3, TEIL2, TEIL1
         TALLYING IN ZAHL.
     END-UNSTRING
 *
 DISPLAY "Nach UNSTRING: " UPON T.
     PERFORM DISPLAY-FELDER.
     STOP RUN.
 DISPLAY-FELDER.
     DISPLAY "Feld  = *" FELD  "*" UPON T.
     DISPLAY "Teil1 = *" TEIL1 "*" UPON T.
     DISPLAY "Teil2 = *" TEIL2 "*" UPON T.
     DISPLAY "Teil3 = *" TEIL3 "*" UPON T.
     DISPLAY "Zahl  = *" ZAHL  "*" UPON T.


Ergebnis:

Vor UNSTRING

Nach UNSTRING

FELD  = *ABCDEFGHIJKL*

FELD  = *ABCDEFGHIJKL*

TEIL1 = * *

TEIL1 = *I*

TEIL2 = *  *

TEIL2 = *FG*

TEIL3 = *   *

TEIL3 = *ABC*

ZAHL = *00*

ZAHL = *03*