使用按键 PIC XX 搜索全部

问题描述 投票:0回答:1

我在桌子上使用

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'

cobol mainframe
1个回答
0
投票

您使用的

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

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

  • 您的条目远少于 400 个,甚至可能少于 200 个
  • 数据未初始化,因此包含垃圾或低值(在大型机上常见)或空格(在PC上常见,
    INITIALIZE WS-TABLE
    之后的大型机上也会出现这种情况)

然后您的

SEARCH
将从条目 201 左右开始,找到一个小于您搜索的键,因此上升到 301,仍然找到一个小于您搜索的键,然后转到 351、375,...在位置 400 处结束,仅看到小于当前密钥的密钥。

方法是确保所有键都已预先设置,例如使用 HIG-VALUE

.   The _right_ way is to add something like 
DEPENDING ON WS-TAB-ENTRIES
to your
OCCURS` 子句并将其设置正确;在这种情况下,搜索仅在当前设置最大值范围内进行二进制搜索,而不是绝对最大值。

注意:由于

SEARCH ALL
进行二进制查找,表中的数据 必须根据您的定义进行排序 - 如果不是这种情况,则执行
SORT WS-TABLE
一次(同样:在设置
OCCURS DEPENDING ON
值之后或者将所有键预先设置为
HIGH-VALUE
(或者
ZZZ
如果您更喜欢) - 否则“空”条目将被预先排序[仅此一项就可以使您的
SEARCH ALL
正常工作,但会浪费计算能力] ).

© www.soinside.com 2019 - 2024. All rights reserved.