我在桌子上使用
SERACH ALL
,钥匙的类型为 PIC X(02)
以下是我的表格声明
01 WS-VAL PIC X(02).
01 WS-TABLE.
03 WS-TABLE-LINE OCCURS 400 TIMES
ASCENDING KEY IS TAB-KEY
INDEXED BY IND-TAB.
05 TAB-KEY PIC X(02).
05 TAB-LIB PIC X(15).
以下是我如何使用“搜索全部”
SET IND-TAB TO 1
SEARCH ALL WS-TABLE-LINE
AT END
DISPLAY 'NOT FOUND'
WHEN TAB-KEY (IND-TAB) = VAL
DISPLAY 'FOUND'
END-SEARCH
VAL
存在于桌子的按键上,但通常会显示消息 'NOT FOUND'
您使用的
SEARCH
几乎是正确的(在普通 SEARCH
上设置索引,因为这从当前索引值进行操作,但不是在 SEARCH ALL
上设置索引本身),但表可能不是.
SEARCH ALL
使用二分查找遍历整个表格。我们不知道,所以我们必须猜测:
INITIALIZE WS-TABLE
之后的大型机上也会出现这种情况)然后您的
SEARCH
将从条目 201 左右开始,找到一个小于您搜索的键,因此上升到 301,仍然找到一个小于您搜索的键,然后转到 351、375,...在位置 400 处结束,仅看到小于当前密钥的密钥。
脏方法是确保所有键都已预先设置,例如使用 HIG-VALUE
. The _right_ way is to add something like
DEPENDING ON WS-TAB-ENTRIESto your
OCCURS` 子句并将其设置正确;在这种情况下,搜索仅在当前设置最大值范围内进行二进制搜索,而不是绝对最大值。
注意:由于
SEARCH ALL
进行二进制查找,表中的数据 必须根据您的定义进行排序 - 如果不是这种情况,则执行 SORT WS-TABLE
一次(同样:在设置 OCCURS DEPENDING ON
值之后或者将所有键预先设置为 HIGH-VALUE
(或者 ZZZ
如果您更喜欢) - 否则“空”条目将被预先排序[仅此一项就可以使您的 SEARCH ALL
正常工作,但会浪费计算能力] ).