Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

SEARCH-Anweisung

&pagelevel(4)&pagelevel

Funktion

Die SEARCH-Anweisung wird verwendet, um in einer Tabelle nach einem Element zu suchen, das eine angegebene Bedingung erfüllt, und um den Wert des zugehörigen Index auf die entsprechende Tabellenelementnummer zu setzen.

Format 1

Damit kann eine Tabelle sequenziell durchsucht werden.

Format 2

Damit kann eine Tabelle binär durchsucht werden.

Format 1


SEARCH bezeichner-1 [VARYING {index-1 | bezeichner-2}]

[AT END unbedingte anweisung-1]

{WHEN bedingung-1 {unbedingte anweisung-2 | NEXT SENTENCE}}...

[END-SEARCH]


Syntaxregeln

  1. bezeichner-1 legt die Tabelle fest, die durchsucht werden soll.

  2. Die Datenerklärung von bezeichner-1 muss eine OCCURS-Klausel mit einer INDEXED BY-Angabe enthalten.

  3. bezeichner-1 darf weder subskribiert noch indiziert noch einer Teilfeldselektion unterzogen werden.

  4. index-1 oder bezeichner-2 gibt ein Feld an, dessen Wert während der Ausführung der SEARCH-Anweisung verändert werden soll.

  5. index-1 kann einer der Indizes für bezeichner-1 sein, oder ein Index für eine andere Tabelle.

  6. bezeichner-2 muss als ein Indexdatenfeld (USAGE IS INDEX) beschrieben oder ein numerisches Festpunktdatenfeld sein, das als ganze Zahl beschrieben ist.

  7. Die AT END-Angabe bezeichnet eine Anweisung, die ausgeführt werden soll, falls die Suche erfolglos verläuft.

  8. Jede Bedingung (bedingung-1, bedingung-2,...) muss eine zulässige Bedingung sein (siehe „Bedingungen").

  9. bedingung-1... geben die Bedingungen an, die während der Ausführung der SEARCH-Anweisung geprüft werden.

  10. unbedingte anweisung-2... oder NEXT SENTENCE gibt an, was getan werden soll, wenn die zugehörige WHEN-Bedingung erfüllt ist:
    Die Kontrolle geht über auf die unbedingte Anweisung oder auf den nächsten Programmsatz (das ist die Anweisung, die der SEARCH-Anweisung folgt), je nachdem, welche Möglichkeit angegeben wurde.

  11. Das sequenzielle Durchsuchen einer Tabelle beginnt bei dem Tabellenelement, auf das der zur Suche verwendete Index von bezeichner-1 verweist.

  12. Entspricht der Wert dieses Index von bezeichner-1 zu Beginn der SEARCH-Anweisung einer größeren als der höchsten erlaubten Tabellenelementnummer von bezeichner-1, so wird die Suche sofort abgebrochen. Ist der AT END-Zusatz angegeben, wird die unbedingte anweisung-1 ausgeführt. Fehlt der Zusatz, wird mit der nächsten Anweisung fortgesetzt.

  13. Entspricht der Wert des zur Suche verwendeten Index von bezeichner-1 zu Beginn der SEARCH-Anweisung einer erlaubten Tabellenelementnummer von bezeichner-1, findet die sequenzielle Suche folgendermaßen statt:

    1. Die WHEN-Bedingungen werden in der Reihenfolge ausgewertet, in der sie angegeben sind.

    2. Ist keine der Bedingungen erfüllt, wird der Index für bezeichner-1 um soviel erhöht, dass er auf das nächste Tabellenelement verweist, und Punkt a) wird wiederholt. Dies geschieht nicht, wenn der neue Wert des Index einer nicht mehr zulässigen Tabellenelementnummer entspricht. In diesem Fall wird Punkt d) ausgeführt.

    3. Ist eine WHEN-Bedingung erfüllt, wird die Suche beendet. Der Index verweist auf das Tabellenelement, das die Bedingung erfüllt. Die mit der Bedingung verknüpfte unbedingte Anweisung wird ausgeführt.

    4. Ist das Ende der Tabelle erreicht, ohne dass eine WHEN-Bedingung erfüllt ist, wird die Suche beendet. Ist AT END angegeben, wird die unbedingte anweisung-1 ausgeführt. Fehlt der Zusatz, wird mit der nächsten Anweisung fortgesetzt.

  14. Eine mehrdimensionale Tabelle kann durchsucht werden, wenn bezeichner-1 ein Datenfeld ist, das einem Datenfeld mit einer OCCURS-Klausel untergeordnet ist. In die-sem Fall muss für jede Dimension der Tabelle ein Index durch die INDEXED BY-Angabe der OCCURS-Klausel angegeben sein. Durch die Ausführung der SEARCH-Anweisung wird nur der Wert des zu bezeichner-1 gehörenden Index und, wenn angegeben, der Wert von index-1 oder bezeichner-2 verändert. Um alle Einträge einer mehrdimensionalen Tabelle durchsuchen zu können, muss die SEARCH-Anweisung für alle möglichen Werte der übergeordneten Indizes ausgeführt werden.

  15. Durch SET-Anweisungen oder mit PERFORM VARYING sind die entsprechenden Indizes vor Ausführung der SEARCH-Anweisungen mit den gewünschten Werten vorzubesetzen (siehe Beispiel 8-69).

  16. Endet in der AT END-Angabe und in den WHEN-Bedingungen keine der angegebenen Anweisungen mit einer GO TO-Anweisung, wird der Programmlauf nach Ausführung der unbedingten Anweisung fortgesetzt.

  17. Ist in der VARYING-Angabe index-1 angegeben, findet Folgendes statt:

    1. Ist index-1 einer der Indizes für bezeichner-1, wird er für die Suche verwendet. Andere Indizes werden nicht erhöht.

    2. Ist index-1 ein Index für eine andere Tabelle, wird der erste (oder einzige) Index von bezeichner-1 für die Suche verwendet. Wird der Index von bezeichner-1 erhöht, wird gleichzeitig index-1 erhöht, so dass auch er auf das nächste Element seiner Tabelle verweist.

  18. Ist in der VARYING-Angabe bezeichner-2 angegeben, verhält es sich wie folgt:

    1. Der erste (oder einzige) Index von bezeichner-1 wird für die Überprüfung der Tabellengrenzen verwendet.

    2. Wird der Index von bezeichner-1 erhöht, wird gleichzeitig bezeichner-2 erhöht.

    3. bezeichner-2 wird um 1 erhöht, wenn er ein numerisches Datenfeld bezeichnet.

    4. Ist bezeichner-2 ein Indexdatenfeld, wird es um denselben Wert erhöht wie der Index von bezeichner-1.

    Wird die VARYING-Angabe nicht verwendet, wird der erste (oder einzige) Indexname von bezeichner-1 (d.h. der, der in der Datenerklärung von bezeichner-1 in der INDEXED BY-Angabe steht) für die Suche verwendet.

  19. Ist END-SEARCH angegeben, darf nicht die NEXT SENTENCE-Angabe gemacht werden.

  20. Der Bereich einer SEARCH-Anweisung darf folgendermaßen begrenzt werden:

    1. mit END-SEARCH auf derselben Schachtelungsebene,

    2. mit einem Punkt am Ende der SEARCH-Anweisung,

    3. mit der ELSE- oder END-IF-Angabe einer vorhergehenden IF-Anweisung.

Suchvorgang für eine SEARCH-Anweisung gemäß Format 1

1)  Diese Operationen werden nur ausgeführt, wenn sie in der SEARCH-Anweisung ange-geben sind.
2)  Nach jeder dieser Anweisungen wird der Programmablauf bei der nächsten Anweisung fortgesetzt, es sei denn, die unbedingte Anweisung endet mit einer GO TO-Anweisung.

Beispiel 8-67

IDENTIFICATION DIVISION.
PROGRAM-ID. SUCHEN.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    TERMINAL IS T.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  ZEICHEN-TEST        PIC X VALUE LOW-VALUE.
    88 ZEICHEN-GEFUNDEN VALUE HIGH-VALUE.
01  ZEICHEN-EIN PICTURE A.
01  ZEICHEN-GEWICHTS-TAB.
        03  ZEICHEN-TABELLE OCCURS 26 TIMES INDEXED BY PI
            VALUE FROM (1)                         "A01" "B03"
               "C03" "D02" "E01" "F04" "G02" "H04" "I01" "J08"
               "K05" "L01" "M03" "N01" "O01" "P03" "Q10" "R01"
               "S01" "T01" "U01" "V04" "W04" "X08" "Y04" "Z10".
04  ZEICHEN PICTURE A.
04  WERT PICTURE 99.
PROCEDURE DIVISION.
MAIN SECTION.
ZEICHEN-SUCHEN.
    PERFORM UNTIL ZEICHEN-GEFUNDEN
      ACCEPT ZEICHEN-EIN FROM T
      SET PI TO 1
      SEARCH ZEICHEN-TABELLE VARYING PI
         AT END DISPLAY "Zeichen nicht alphabetisch" UPON T
                EXIT TO TEST OF PERFORM
         WHEN ZEICHEN (PI) = FUNCTION UPPER-CASE (ZEICHEN-EIN)
              SET ZEICHEN-GEFUNDEN TO TRUE
      END-SEARCH
    END-PERFORM.
GEFUNDEN.
    DISPLAY ZEICHEN (PI) " ist " WERT (PI) " zugeordnet" UPON T.
    STOP RUN.

Hier besteht die Tabelle ZEICHEN-TABELLE aus 26 Elementen.

Jedes Element enthält einen Buchstaben des Alphabets, gefolgt von einer Zahl, die mit dem Buchstaben verbunden ist.
Die Tabelle wird mit Hilfe der Indizes LI und PI indiziert.
Die SEARCH-Anweisung sucht in der Tabelle nach demjenigen Element ZEICHEN, das mit dem aktuellen Inhalt des Feldes ZEICHEN-EIN übereinstimmt. Der bei der Suche verwendete Index ist PI.
Die Suche beginnt am Anfang der Tabelle, da PI auf das erste Tabellenelement zeigt.Ist die Suche erfolgreich, wird die Anweisung GO TO GEFUNDEN ausgeführt. In diesem Fall zeigt der Index PI auf das Element, das die Bedingung erfüllt. Wenn z.B. ZEICHEN-EIN den Buchstaben B enthält, zeigt der Index auf das zweite Tabellenelement.
Ist die Suche erfolglos, wird die Anweisung ausgeführt, die der AT END-Angabe folgt.

Format 2


SEARCH ALL bezeichner-1 [AT END unbedingte-anweisung-1]

WHEN bedingung {unbedingte-anweisung-2 | NEXT STATEMENT}

[END-SEARCH]


Syntaxregeln

  1. bezeichner-1 legt die Tabelle fest, die durchsucht werden soll.

  2. Die Datenerklärung von bezeichner-1 muss eine OCCURS-Klausel mit der
    INDEXED BY-Angabe und der ASCENDING-/DESCENDING-Angabe enthalten.

  3. bezeichner-1 darf weder subskribiert noch indiziert noch einer Teilfeld-Selektion unterzogen werden.

  4. Die AT END-Angabe gibt die Anweisung an, die ausgeführt werden soll, wenn bedingung-1 für keinen Indexwert im erlaubten Bereich erfüllt werden kann (siehe Regel 10).

  5. bedingung gibt die Bedingung an, die während der Ausführung der SEARCH-Anweisung geprüft wird.

  6. bedingung muss eine der folgenden Arten von Bedingungen sein (siehe auch unter „Bedingungen"):

    1. Eine Vergleichsbedingung mit EQUAL TO oder dem Gleichheitszeichen (=) als Vergleichsoperator.
      Es muss entweder das Subjekt oder das Objekt der Vergleichsbedingung (aber nicht beide gleichzeitig) nur aus einem der Datennamen bestehen, die in der ASCENDING-/DESCENDING-Angabe von bezeichner-1 angegeben sind. Jeder Datenname muss mit dem ersten Index von bezeichner-1 indiziert sein. Er darf gekennzeichnet, aber nicht einer Teilfeldselektion unterzogen worden sein.

    2. Eine Bedingungsnamen-Bedingung, in der die VALUE-Klausel, die den Bedingungsnamen beschreibt, nur ein einziges Literal enthält.
      Der Bedingungsname muss mit dem ersten Index von bezeichner-1 indiziert und darf gekennzeichnet sein. Die Bedingungsvariable, die mit dem Bedingungsnamen verknüpft ist, muss einer der Datennamen sein, die in der ASCENDING-/DESCENDING-Angabe von bezeichner-1 angegeben sind.

    3. Eine zusammengesetzte Bedingung, die aus einfachen Bedingungen der oben beschriebenen Arten gebildet wurde und als einzigen Verknüpfer nur AND enthält.

  7. Jeder Datenname, der in der ASCENDING-/DESCENDING-Angabe von bezeichner-1 auftritt, kann in bedingung geprüft werden; dabei müssen alle Datennamen, die in der ASCENDING-/DESCENDING-Angabe vor dem geprüften Datennamen stehen, auch in einer Bedingung vorkommen. Andere Prüfungen können in bedingung nicht gemacht werden.

  8. unbedingte anweisung-2 oder NEXT SENTENCE gibt an, was getan werden soll, wenn bedingung erfüllt ist. Der Programmlauf wird mit unbedingte anweisung-2 oder mit der Anweisung, die der SEARCH-Anweisung folgt, fortgesetzt.

  9. Der erste Index von bezeichner-1 wird für die Suche verwendet. Dieser Index muss nicht mit einer SET-Anweisung initialisiert werden, da sein Anfangswert für den Suchvorgang belanglos ist.

  10. Die SEARCH ALL-Anweisung wird folgendermaßen ausgeführt, wobei die Tabelle in aufsteigender bzw. absteigender Reihenfolge der in der ASCENDING-/DESCENDING-Angabe angeführten Schlüsselfelder geordnet sein muss:

    1. Während der Suche wird der Wert des Index von bezeichner-1 verändert.

    2. Dabei ist der Wert niemals kleiner als der, der dem ersten und niemals größer als der, der dem letzten Tabellenelement entspricht.

    3. Kann bedingung für keinen Indexwert im erlaubten Bereich erfüllt werden, und ist die AT END-Angabe angegeben, wird mit unbedingte anweisung-1 fortgesetzt oder mit der nächsten Anweisung, wenn AT END nicht angegeben ist. In beiden Fällen ist der Endwert des Index unbestimmt.

  11. Kann bedingung erfüllt werden, verweist der Index auf das Tabellenelement, das bedingung erfüllt. Der Programmlauf wird mit unbedingte anweisung-2 oder mit der nächsten Anweisung fortgesetzt.

  12. Eine zwei- oder dreidimensionale Tabelle kann durchsucht werden, wenn bezeichner-1 ein Datenfeld ist, das einem Datenfeld mit einer OCCURS-Klausel untergeordnet ist. In diesem Fall muss für jede Dimension der Tabelle ein Index durch die INDEXED BY-Angabe der OCCURS-Klausel angegeben sein. Durch die Ausführung der SEARCH ALL-Anweisung wird nur der Wert des zu bezeichner-1 gehörenden Index verändert. Um alle Einträge einer mehrdimensionalen Tabelle durchsuchen zu können, muss die SEARCH ALL-Anweisung für alle möglichen Werte der übergeordneten Indizes ausgeführt werden.

  13. Endet in der AT END-Angabe und in den WHEN-Bedingungen keine der angegebenen Anweisungen mit einer GO TO-Anweisung, wird der Programmlauf nach Ausführung der unbedingten Anweisungen mit der nächsten Anweisung fortgesetzt.

  14. Ist END-SEARCH angegeben, darf NEXT SENTENCE nicht angegeben sein.

  15. Der Bereich einer SEARCH-Anweisung darf folgendermaßen begrenzt werden:

    1. mit END-SEARCH auf derselben Schachtelungsebene

    2. mit einem Punkt am Ende der SEARCH-Anweisung

    3. mit der ELSE- oder END-IF-Angabe einer vorhergehenden IF-Anweisung.

Beispiel 8-68 (für WHEN-Bedingungen)

Angaben in der DATA DIVISION

       ...
77  A-WERT PICTURE 9.
       ...
    02  TABELLE OCCURS 5 TIMES ASCENDING KEY IS A B C;
                INDEXED BY I.
        03  A  PICTURE 99.
        03  B  PICTURE 9.
            88 UNTER-30 VALUE 1.
            88 UEBER-30 VALUE 2.
        03  C  PICTURE 9.
       ...

Gültige WHEN-Bedingung in der PROCEDURE DIVISION

WHEN A(I) = 10
WHEN A(I) = 20 AND UNTER-30(I)
WHEN A(I) = 15 AND UEBER-30(I) AND C(I) = A-WERT

Beispiel 8-69

IDENTIFICATION DIVISION.
PROGRAM-ID. SUCHALL.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    TERMINAL IS T
    SYSIPT IS EINDAT.
DATA DIVISION.
WORKING-STORAGE SECTION.
77  NR PIC 9(3).
77  EINGABE PIC 9(6).
01  ANGESTELLTEN-TAB.
    02  PERSONEN-TAB OCCURS 100 TIMES INDEXED BY PI,
                    ASCENDING KEY IS BEREICH KENN-NR.
        03  BEREICH PIC 9(3).
        03  KENN-NR PIC 9(6).
        03  NAME    PIC X(20).   .
PROCEDURE DIVISION.
MAIN SECTION.
P1.
    PERFORM VARYING PI FROM 1 BY 1 UNTIL PI > 100
      ACCEPT PERSONEN-TAB (PI) FROM EINDAT
    END-PERFORM
    SEARCH ALL PERSONEN-TAB
    AT END 
      DISPLAY "Person fehlt" UPON T
    WHEN BEREICH (PI) = NR AND KENN-NR (PI) = EINGABE
      DISPLAY BEREICH KENN-NR NAME UPON T
    END-SEARCH
    STOP RUN.

Hier besteht die Tabelle PERSONEN-TAB aus 100 Elementen.

Jedes Tabellenelement besteht aus einem drei Zeichen großen numerischen Feld BEREICH, einem sechs Zeichen langen numerischen Feld KENN-NR und einem 20 Zeichen langen alphanumerischen Feld NAME.

Die Tabelle ist in aufsteigender Reihenfolge nach BEREICH, bei gleichen Werten von BEREICH in aufsteigender Reihenfolge nach KENN-NR geordnet.

Der Anfang der Tabelle könnte folgenden Inhalt haben:

BEREICH

KENN-NR

NAME

101

123456

ADAM, D.

101

234561

LANGEWIESCHE, W.

101

123456

ADAM, D.

101

523618

EBERLE, F.

183

200305

DAUTZENBERG, K.

183

328512

REINHARDT, M.

183

433333

GRUEN, L.

183

987245

RICHTER, L.

557

328835

SCHMIDT, S.

557

775247

ALBRECHT, N.

Die SEARCH-Anweisung sucht in der Tabelle nach einem Element, dessen BEREICH mit dem aktuellen Inhalt des Feldes NR übereinstimmt, und dessen KENN-NR mit dem aktuel-len Inhalt des Feldes EINGABE übereinstimmt. Ist die Suche erfolgreich, wird die DISPLAY-Anweisung ausgeführt. Der Indexname PI zeigt dann auf das Element, das der Bedingung genügt.

Enthält z.B. NR 183 und EINGABE 328512, zeigt der Indexname PI auf das fünfte Tabellenelement.

Ist die Suche erfolglos, wird eine entsprechende Meldung ausgegeben.