如何防止 COBOL 中的内部表溢出?

Len*_*ena 5 cobol mainframe

这可能是一个菜鸟问题,但我仍然很难弄清楚如何在 COBOL 中使用表。

目前我正在编写一个可以被其他程序调用的简单模块。我的程序必须在一个内部表中搜索数据,如果没有找到,就添加进去。

我有这张桌子:

01 TB-1 OCCURS 10 INDEXED X1.
   03 CLIENT-NAME    PIC N(30).
   03 ORDER-NUMBER   PIC 9(06).
Run Code Online (Sandbox Code Playgroud)

当然,我可以增加 OCCURS 的数量,这样表溢出的可能性就会降低。但是,在测试模块时,我必须处理还有一个不适合表中的记录要添加的情况。

处理这个问题的最佳方法是什么?我正在考虑通过返回错误消息来防止异常终止。

为此,我想我会定义一个新字段并将其用作计数器。所以基本上,每次我的模块添加一条记录时,它也会向计数器添加 +1。有点像这样:

IF COUNTER < 10 
     PERFORM ADD-RECORD
ELSE DISPLAY 'INPUT HAS EXCEEDED MAX OF 10 OCCURRENCES'
     GOBACK 
END-IF
.

ADD-RECORD.
    MOVE INPUT-CLIENT-NAME  TO CLIENT-NAME(X1)  IN TB-1.
    MOVE INPUT-ORDER-NUMBER TO ORDER-NUMBER(X1) IN TB-1.
    ADD +1 TO COUNTER
    .
Run Code Online (Sandbox Code Playgroud)

这是一个很好的方法吗?你还有其他建议吗?在此先感谢您的帮助。

Sim*_*sch 4

该问题缺少您实际使用的编译器的信息,因此您必须检查答案的哪一部分适合您。

最好的选择是:没有最大值(COBOL 2014 功能,您的编译器不太可能支持此功能

01 TB-1 OCCURS DYNAMIC DEPENDING ON COUNTER
                     INDEXED X1.
   03 CLIENT-NAME    PIC N(30).
   03 ORDER-NUMBER   PIC 9(06).
Run Code Online (Sandbox Code Playgroud)

由于您已经使用了计数器,请检查是否使用该INDEXED子句(例如 for SEARCH),否则删除它并仅使用计数器。

无论如何,我个人更喜欢使用计数器进行边界检查,即使在您的范围内(性能稍差,但更安全,因为如果出现问题,您的程序将异常终止):

    01 BOUND-ERR.
       03 FILLER         PIC X(26) VALUE 
          'INPUT HAS EXCEEDED MAX OF '.
       03 BOUND-MAX      PIC 9(03).
       03 FILLER         PIC X(11) VALUE 
          'OCCURENCES.'.
    01 TB-1-COUNT        PIC 9(03) VALUE 0.
   *> may not work on your compiler...
    01 TB-1-MAX          AS CONSTANT 10.
   *> ... then try the level 78 extension:
    78 TB-1-MAX          VALUE 10.       
   *> if this doesn't work, too, then use REPLACE for the actual bound:
    REPLACE TB-1-MAX BY 10.
    01 TB-1 OCCURS       1 TO TB-1-MAX DEPENDING ON TB-1-COUNT
                         INDEXED BY X1.
       03 CLIENT-NAME    PIC N(30).
       03 ORDER-NUMBER   PIC 9(06).


        IF TB-1-COUNT = TB-1-MAX
           MOVE TB-1-MAX TO BOUND-MAX
           DISPLAY BOUND-ERR
           MOVE 1 TO RETURN-CODE
           GOBACK 
        END-IF
        ADD +1 TO TB-1-COUNT
        SET X1 UP BY 1
        MOVE INPUT-CLIENT-NAME  TO CLIENT-NAME  (X1) IN TB-1.
        MOVE INPUT-ORDER-NUMBER TO ORDER-NUMBER (X1) IN TB-1.
Run Code Online (Sandbox Code Playgroud)