这可能是一个菜鸟问题,但我仍然很难弄清楚如何在 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)
这是一个很好的方法吗?你还有其他建议吗?在此先感谢您的帮助。
我正在编写一个程序,将国内和国际帐号转换为IBAN号码.首先,我需要形成一个字符串:银行ID +分行ID +帐号+ ISO国家代码,不包含这些字段中可能存在的尾随空格.但并非每个帐号都有相同的长度,有些帐号有分支标识符而有些帐号没有,所以我总是会从这些字段中得到尾随空格.
我的工作存储看起来像这样:
01 Input-IBAN.
05 BANK-ID PIC N(10) VALUE "LOYD".
05 BRANCH-ID PIC N(10) VALUE " ".
05 ACCOUNT-NR PIC N(28) VALUE "012345678912 ".
05 COUNTRY-CODE PIC N(02) VALUE "GB".
01 Output-IBAN PIC N(34).
Run Code Online (Sandbox Code Playgroud)
我为这个例子添加了一些值; 实际上它取决于输入.分支代码是可选的,因此我在示例中将其留空.
我基本上想从这个输入串起来:
"LOYD 012345678912 GB"
对此:
"LOYD012345678912GB"
有没有人知道这样做的方法不会导致性能问题?我曾想过使用它FUNCTION REVERSE然后使用一个INSPECT来计算前导空格.但我听说这是一个缓慢的方法.有没有人有任何想法?也许是一个如何使用这个想法的例子?
编辑: 我被告知基本字段可能包含嵌入空格.
我发现我倾向于以太大的块来解决问题,因此我尝试从更小、更具体的问题开始。
我专门从事 PIC N 领域的工作,即国家领域。我需要确定我正在开发的程序的该字段中内容的长度和位置。
我所说的具体字段定义如下:
05 Bank-CODE PIC N(10).
可能有前导空格,也可能有尾随空格。在某些时候,我也需要测试它的嵌入式空间。
基本上,目标是能够在没有空格的情况下使用该字段的内容。
现在,我知道如何确定字段本身的长度:
05 BANK-CODE PIC N(10).
05 BK-LENGTH PIC S9(04) COMP.
MOVE LENGTH OF BANK-CODE TO BK-LENGTH
COMPUTE BK-LENGTH = FUNCTION LENGTH (BANK-CODE)
我只是不知道如何确定BANK-CODE中内容的长度和位置。