LOOKUP (Tabelle oder Array-Element suchen)

Code erstellen Faktor 1 Faktor 2 Ergebnisfeld Indikatoren
VERWEIS            
(Array) suchargument Arrayname   Ho Ni EQ
(Tabelle) suchargument Tabellenname Tabellenname Ho Ni EQ
Die Operation LOOKUP bewirkt, dass eine Suche nach einem bestimmten Element in einer Feldgruppe oder Tabelle durchgeführt wird. Faktor 1 ist das Suchargument (Daten, für die eine Übereinstimmung in der angegebenen Feldgruppe oder Tabelle gefunden werden soll. Dies kann ein Literal, ein Feldname, ein Feldgruppenelement, ein Tabellenname, eine benannte Konstante oder eine figurative Konstante sein. Die Art des Vergleichs hängt vom Datentyp ab:
Zeichendaten
Wird ALTSEQ (*EXT) in der Steuerbestimmung angegeben, wird die alternative Sortierfolge für das Zeichen LOOKUP verwendet, es sei denn, Faktor 1 oder Faktor 2 wurde mit ALTSEQ (*NONE) in der Definitionsbestimmung definiert. Wird ALTSEQ (*SRC) oder keine alternative Folge angegeben, verwendet das Zeichen LOOKUP nicht die alternative Folge.
Grafik-und UCS-2 -Daten
Der Vergleich erfolgt hexadezimal; die alternative Sortierfolge wird unter keinen Umständen verwendet.
Numerische Daten
Das Dezimalzeichen wird in numerischen Daten ignoriert, es sei denn, die Feldgruppe oder Tabelle in Faktor 2 hat die Art Gleitkomma.
Sonstige Datentypen
Die in Vergleichsoperationen beschriebenen Überlegungen zum Vergleich gelten für andere Typen.

Wenn eine Tabelle in Faktor 1 benannt ist, ist das verwendete Suchargument das Element der Tabelle, die zuletzt in einer Operation LOOKUP ausgewählt wurde, oder es ist das erste Element der Tabelle, wenn eine vorherige Operation LOOKUP nicht verarbeitet wurde. Die zu durchsuchende Feldgruppe oder Tabelle wird in Faktor 2 angegeben.

Bei einer Tabelle LOOKUP kann das Ergebnisfeld den Namen einer zweiten Tabelle enthalten, aus der ein Element (entsprechend der Position der ersten Tabelle) abgerufen werden kann. Der Name der zweiten Tabelle kann verwendet werden, um auf das abgerufene Element zu verweisen. Das Ergebnisfeld muss leer sein, wenn Faktor 2 einen Feldgruppennamen enthält.

Ergebnisindikatoren geben die Suchbedingung für LOOKUP an. Eine muss in den Positionen 71 bis 76 angegeben werden, um zuerst die Suche zu bestimmen, die ausgeführt werden soll, und dann das Ergebnis der Suche wiederzugeben. Jeder angegebene Anzeiger wird nur aktiviert, wenn die Suche erfolgreich war. Es können maximal zwei Indikatoren verwendet werden. Ergebnisindikatoren können gleich und hoch oder gleich und niedrig zugeordnet werden. Das Programm sucht nach einem Eintrag, der eine der beiden Bedingungen mit gleicher Vorrangstellung erfüllt, d. h., wenn kein gleicher Eintrag gefunden wird, wird der nächstniedrigere oder nächsthöhere Eintrag ausgewählt.

Wenn ein Anzeiger in den Stellen 75-76 angegeben ist, gibt die integrierte Funktion %EQUAL '1' zurück, wenn ein Element gefunden wird, das genau mit dem Suchargument übereinstimmt. Die integrierte Funktion %FOUND gibt '1' zurück, wenn eine angegebene Suche erfolgreich ist.

Ergebnisindikatoren können gleich und niedrig oder gleich und hoch zugeordnet werden. 'Hoch' und 'Niedrig ' können nicht in derselben LOOKUP-Operation angegeben werden. Das Umwandlungsprogramm geht von einer sortierten, sequenzierten Feldgruppe oder Tabelle aus, wenn ein hoher oder niedriger Anzeiger für die Operation LOOKUP angegeben wird. Die Operation LOOKUP sucht nach einem Eintrag, der die Bedingung "Niedrig/gleich" oder "Hoch/gleich" mit der angegebenen Priorität erfüllt.
  • Hoch (71-72): Weist das Programm an, den Eintrag zu finden, der dem Suchargument am nächsten, aber in der Reihenfolge höher als das Suchargument ist. Wenn ein solcher höherer Eintrag gefunden wird, wird der Anzeiger für hohen Wert aktiviert. Wenn beispielsweise ein aufsteigender Array die Werte A B C C C D E enthält und das Suchargument B ist, entspricht das erste C der Suche. Wenn ein absteigender Array E D C C C B A enthält und das Suchargument B ist, erfüllt das letzte C die Suche. Wenn ein Eintrag, der höher als das Suchargument ist, in der Feldgruppe oder Tabelle nicht gefunden wird, ist die Suche nicht erfolgreich.
  • Niedrig (73-74): Weist das Programm an, den Eintrag zu finden, der dem Suchargument am nächsten, aber in der Folge niedriger als das Suchargument ist. Wenn ein solcher niedrigerer Eintrag gefunden wird, wird der Anzeiger für niedrigen Wert aktiviert. Wenn beispielsweise ein aufsteigender Array die Werte A B C C C D E enthält und das Suchargument D ist, entspricht das letzte C der Suche. Wenn ein absteigender Array E D C C C B A enthält und das Suchargument D ist, erfüllt das erste C die Suche. Wenn in der Feldgruppe oder Tabelle kein Eintrag gefunden wird, der niedriger als das Suchargument ist, ist die Suche nicht erfolgreich.
  • Gleich (75-76): Weist das Programm an, den Eintrag zu finden, der dem Suchargument entspricht. Der erste gefundene Gleichheitseintrag aktiviert den Gleichheitsanzeiger. Wenn kein Eintrag gefunden wird, der dem Suchargument entspricht, ist die Suche nicht erfolgreich.
Beachten Sie bei der Verwendung der Operation LOOKUP Folgendes:
  • Das Suchargument und die Feldgruppe oder Tabelle müssen denselben Typ und dieselbe Länge haben (außer Zeit-und Datumsfelder, die eine andere Länge haben können). Wenn die Feldgruppe oder Tabelle ein Zeichen mit fester Länge, eine Grafik oder UCS-2ist, muss das Suchargument auch eine feste Länge haben. Bei variabler Länge kann die Länge des Sucharguments von der Länge des Arrays oder der Tabelle abweichen.
  • Wenn LOOKUP für eine Feldgruppe verarbeitet wird und ein Index verwendet wird, beginnt LOOKUP mit dem Element, das durch den Index angegeben wird. Der Indexwert wird auf die Positionsnummer des lokierten Elements gesetzt. Ein Fehler tritt auf, wenn der Index gleich null oder größer als die Anzahl der Elemente im Array ist, wenn die Suche beginnt. Der Index wird auf 1 gesetzt, wenn die Suche nicht erfolgreich ist. Wenn der Index eine benannte Konstante ist, ändert sich der Indexwert nicht.
  • Eine Suche nach "high", "low", "high" und "equal" oder "low" und "equal" kann nur durchgeführt werden, wenn für die Feldgruppe oder Tabelle in den Definitionsbestimmungen mit den Schlüsselwörtern ASCEND oder DESCEND eine Sequenz angegeben wurde.
  • Ist die Suche nicht erfolgreich, wird kein Ergebnisanzeiger gesetzt.
  • Wenn nur ein Gleichheitsanzeiger (Stellen 75-76) verwendet wird, durchsucht die Operation LOOKUP die gesamte Feldgruppe oder Tabelle. Wenn Ihre Feldgruppe oder Tabelle aufsteigend sortiert ist und Sie nur einen gleichen Vergleich wünschen, können Sie das Durchsuchen der gesamten Feldgruppe oder Tabelle vermeiden, indem Sie einen hohen Indikator angeben.
  • Die Operation LOOKUP kann zu unerwarteten Ergebnissen führen, wenn das Array nicht in aufsteigender oder absteigender Reihenfolge vorliegt.
  • Eine Operation LOOKUP für eine dynamisch zugeordnete Feldgruppe ohne alle zugeordneten definierten Elemente kann Fehler verursachen.

Weitere Informationen finden Sie unter Array-Operationen.

Abb. 1. LOOKUP-Operation mit Arrays
*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 *  In this example, the programmer wants to know which element in
 *  ARY the LOOKUP operation locates.  The Z-ADD operation sets the
 *  field X to 1.  The LOOKUP starts at the element ARY that is
 *  indicated by field X and continues running until it finds the
 *  first element equal to SRCHWD.  The index value, X, is set to
 *  the position number of the element located.
C
C                   Z-ADD     1              X                3 0
C     SRCHWD        LOOKUP    ARY(X)                                 26
C
 *  In this example, the programmer wants to know if an element
 *  is found that is equal to SRCHWD.  LOOKUP searches ARY until it
 *  finds the first element equal to SRCHWD.  When this occurs,
 *  indicator 26 is set on and %EQUAL is set to return '1'.
C
C     SRCHWD        LOOKUP    ARY                                    26
C
 *  The LOOKUP starts at a variable index number specified by
 *  field X.  Field X does not have to be set to 1 before the
 *  LOOKUP operation.  When LOOKUP locates the first element in
 *  ARY equal to SRCHWD, indicator 26 is set on and %EQUAL is set
 *  to return '1'.  The index value, X, is set to the position
 *  number of the element located.
 *
C
C     SRCHWD        LOOKUP    ARY(X)                                 26
Abbildung 2. LOOKUP-Operation mit Subarrays
  * In this example, an array of customer information actually consists
  * of several subarrays.  You can search either the main array or the
  * subarrays overlaying the main array.
 D custInfo        DS
 D  cust                               DIM(100)
 D   name                        30A   OVERLAY(cust : *NEXT)
 D   id_number                   10I 0 OVERLAY(cust : *NEXT)
 D   amount                      15P 3 OVERLAY(cust : *NEXT)

  * You can search for a particular set of customer information
  * by doing a search on the "cust" array
 C     custData      LOOKUP    cust(i)                                10

  * You can search on a particular field of the customer information
  * by doing a search on one of the overlay arrays
 C     custName      LOOKUP    name(i)                                11
  * After the search, the array index can be used with any of the
  * overlaying arrays.  If the search on name(i) is successful,
  * the id_number and amount for that customer are available
  * in id_number(i) and amount(i).