如何使用带有 CHAIN 的 For 循环而不是使用 READC 和 SFLNXTCHG 来处理 SUBFILE

How to process a SUBFILE using For Loop with a CHAIN rather than using READC and SFLNXTCHG

如何使用带链的 For 循环而不是使用 READC 和 SFLNXTCHG 来处理子文件。 Readc 连同 Sflnxtchg 选项有时变得有点难以理解,我听说可以使用 forloop 和链组合来实现相同的结果,而不是可以使用 forloop 和 chain 组合来获得相同的结果,有人可以证明代码被剪断并对此进行一些解释.

您将使用的声明和循环的一个简单示例是:

FMYDSP     CF   E             WORKSTN SFILE(SFLREC01:sflIndex)                          
D sflIndex        S              4S 0
D sflMax          S              4S 0

  FOR sflIndex = 1 TO sflMax; 
    CHAIN sflIndex SFLREC01;   
 // do stuff

  ENDFOR;

我更喜欢使用 FOR 通过 DOWDOU 循环读取子文件。我偏爱的一个原因是因为当使用 do 循环读取时,只要出现“最后记录”条件,系统就会向作业日志写入一条烦人的消息。例如,您可能认为以下是 DOW 的教科书用法:

CHAIN(E) 1 SFLREC01;                    
DOW %found;                             
   // do stuff

  sflIndex += 1;                                 
  CHAIN(E) sflIndex SFLREC01;                    
ENDDO;                                           

但即使您尝试使用 (E) 扩展名来阻止它,您仍然会在作业日志中收到严重性为 30 的消息:

Message ID . . . . . . : CPF5020 Severity . . . . . . . : 30
Message type . . . . . : Notify
Date sent . . . . . . : 01/20/22 Time sent . . . . . . : 10:11:16
Message . . . . : Subfile record not found.
Cause . . . . . : The input operation to the subfile specified a relative record number for which no active subfile record exists.
Recovery . . . : See the Application Display Programming book, SC41-5715, for subfile processing.
Possible choices for replying to message . . . . . . . . . . . . . . . :
I -- Request is ignored. Control is returned to user.
C -- Request is canceled. Escape msg CPF5104 is sent.

系统为您发送了取消回复,您无需执行任何操作,但令人讨厌的是日志中填满了这些并且掩盖了程序实际执行的操作的记录。您最终会收到一堆这样的消息,通常是每次用户按下 enter 时一条消息。仅此一项就足以让我切换到 FOR 循环并保留一个变量来记住我的条目总数。