我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).
Run Code Online (Sandbox Code Playgroud)
下面我如何使用“搜索全部”
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
Run Code Online (Sandbox Code Playgroud)
VAL存在于表的键上,但'NOT FOUND'通常会显示该消息
您使用的SEARCH几乎是正确的(在普通上设置索引SEARCH,因为它从当前索引值进行操作,但不是在SEARCH ALL其上设置索引本身),但表可能不是。
SEARCH ALL通过二分查找遍历整个表。我们不知道,所以我们必须猜测:
INITIALIZE WS-TABLE)然后您SEARCH将从条目 201 左右开始,找到一个小于您搜索的键,因此上升到 301,仍然找到一个小于您搜索的键,然后转到 351、375,...并在位置 400 结束只看到比您当前的键少的键。
肮脏的方法是确保所有键都已预先设置,例如使用HIGH-VALUE.
正确的DEPENDING ON WS-TAB-ENTRIES方法是在您的子句中添加类似的内容OCCURS并将其设置为正确的;在这种情况下,搜索仅在当前设置最大值的范围内进行二进制搜索,而不再是绝对最大值。
注意:与SEARCH ALL二进制查找一样,表中的数据必须根据您的定义进行排序- 如果不是这种情况,则执行一次SORT WS-TABLE(再次:在设置OCCURS DEPENDING ON值或将所有键预先设置为HIGH-VALUE(或者ZZZ如果您愿意)更多) - 否则“空”条目将被预先排序[仅此一项就可以使您的SEARCH ALL工作正确,但会浪费计算能力])。