LOOKUP(查找表或数组元素)

代码 因子1 因子2 结果字段 指标
LOOKUP            
(数组) search argument(搜索自变量) 数组名   HI LO EQ
(表) search argument(搜索自变量) 表名 表名 HI LO EQ
LOOKUP 操作导致对数组或表中的特定元素进行搜索。 "因子" 1 是搜索参数 (要在指定的数组或表中找到其匹配项的数据)。 可以是: 字面值,字段名,数组元素,表名,命名常量或象征常量。 比较的性质取决于数据类型:
字符数据
如果在控制规范上指定了 ALTSEQ (*EXT) ,那么备用整理顺序将用于字符 LOOKUP ,除非在定义规范上使用 ALTSEQ (*NONE) 定义了因子 1 或因子 2。 如果指定了 ALTSEQ (*SRC) 或未指定备用序列,那么字符 LOOKUP 不使用备用序列。
图形和 UCS-2 数据
比较是十六进制的; 在任何情况下都不使用备用整理顺序。
数字数据
在数字数据中将忽略小数点,但当 "因子 2" 中的数组或表的类型为 float 时除外。
其他数据类型
比较操作 中描述的比较注意事项适用于其他类型。

如果在因子 1 中指定了表,那么所使用的搜索参数是 LOOKUP 操作中最后选择的表的元素,或者如果尚未处理先前的 LOOKUP ,那么它是表的第一个元素。 要搜索的数组或表在因子 2 中指定。

对于表 LOOKUP ,结果字段可以包含第二个表的名称,可以从该表中检索元素 (与第一个表的元素对应)。 第二个表的名称可用于引用检索的元素。 如果因子 2 包含数组名,那么结果字段必须为空白。

生成的指示符指定 LOOKUP 的搜索条件。 必须首先在 位置 71 到 76 中指定一个,以确定要执行的搜索,然后反映搜索结果。 仅当搜索成功时,才会设置任何指定的指示符。 不能使用两个以上的指标。 由此产生的指标可以分配到相等和高,也可以分配到相等和低。 程序搜索满足具有相等优先顺序的任一条件的条目; 即,如果找不到相等的条目,那么将选择最接近的较低或最接近的较高条目。

如果在位置 75-76 中指定了指示符,那么如果找到与搜索参数完全匹配的元素,那么 %EQUAL 内置函数将返回 "1"。 如果任何指定的搜索成功,那么 %FOUND 内置函数将返回 "1"。

可以将生成的指标分配为相等和低,或相等和高。 不能在同一 LOOKUP 操作上指定高和低。 当为 LOOKUP 操作指定了高或低指示符时,编译器将采用排序的数组或表。 LOOKUP 操作将搜索满足低/等于或高/等于条件且具有相同给定优先级的条目。
  • 高 (71-72): 指示程序查找序列中最接近但高于搜索参数的条目。 如果找到这样的较高项,那么将高指示符设置为 on。 例如,如果升序数组包含值 A B C C D E ,并且搜索自变量为 B ,那么第一个 C 将满足搜索。 如果降序数组包含 E D C C C B A ,并且搜索自变量为 B ,那么最后一个 C 将满足搜索。 如果在数组或表中找不到高于搜索参数的条目,那么搜索将失败。
  • 低 (73-74): 指示程序查找最接近但序列低于搜索参数的条目。 如果找到这样的下限条目,那么会将下限指示符设置为 on。 例如,如果升序数组包含值 A B C C C D E ,并且搜索自变量为 D ,那么最后一个 C 将满足搜索。 如果降序数组包含 E D C C C B A ,并且搜索自变量为 D ,那么第一个 C 将满足搜索。 如果在数组或表中找不到低于搜索参数的条目,那么搜索将失败。
  • 等于 (75-76): 指示程序查找等于搜索自变量的条目。 找到的第一个等号条目将等号指示符设置为开。 如果找不到等于搜索参数的条目,那么搜索将失败。
使用 LOOKUP 操作时,请记住:
  • 搜索自变量和数组或表必须具有相同的类型和长度 (可具有不同长度的 "时间" 和 "日期" 字段除外)。 如果数组或表是固定长度的字符,图形或 UCS-2,那么搜索参数也必须是固定长度的。 对于可变长度,搜索参数的长度可以与数组或表的长度不同。
  • 在数组上处理 LOOKUP 并使用索引时, LOOKUP 将从索引指定的元素开始。 索引值设置为所在元素的位置号。 如果索引等于零或高于搜索开始时数组中的元素数,那么会发生错误。 如果搜索失败,那么将索引设置为等于 1。 如果索引是命名常量,那么索引值不会更改。
  • 仅当使用 ASCEND 或 DESCEND 关键字为定义规范上的数组或表指定了序列时,才能搜索高,低,高和等,或低和等。
  • 如果搜索不成功,那么不会设置结果指示符。
  • 如果仅使用相等的指示符 (位置 75-76) ,那么 LOOKUP 操作将搜索整个数组或表。 如果数组或表按升序排列,并且您只需要进行相等的比较,那么可以通过指定高指示符来避免搜索整个数组或表。
  • LOOKUP 操作可能会在数组未按升序或降序排列时生成意外结果。
  • 对未分配所有已定义元素的动态分配阵列执行 LOOKUP 操作可能会导致发生错误。

有关更多信息,请参阅 阵列操作

图 1。 具有数组的 LOOKUP 操作
*...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
图 2。 具有Subar射线的 LOOKUP 操作
  * 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).