使用关键 PIC XX 搜索全部

Ahm*_*DIK 2 cobol mainframe

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'通常会显示该消息

Sim*_*sch 6

您使用的SEARCH几乎是正确的(在普通上设置索引SEARCH,因为它从当前索引值进行操作,但不是在SEARCH ALL其上设置索引本身),但表可能不是。

SEARCH ALL通过二分查找遍历整个表。我们不知道,所以我们必须猜测:

  • 您的条目远少于 400 个,甚至可能少于 200 个
  • 数据未初始化,因此包含垃圾或低值(在大型机上常见)或空格(在 PC 上常见,之后的大型机上也会出现这种情况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工作正确,但会浪费计算能力])。

  • @AhmedSEDDIK - “根据 WS-TAB-ENTRIES 发生 0 到 400”,其中“WS-TAB-ENTRIES”包含表中活动条目的数量。 (2认同)