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....+....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 * 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).