替换RPGLE中的主文件

Replacing Primary file in RPGLE

有没有人有从 RPG 程序替换主文件的经验,其中定义了级别指示器(用于计算目的的级别指示器)?

代替 RPG 循环,我需要引入新文件(替换主文件),它将定义为完全程序文件(不再有主文件)..

谢谢。

为什么要停止使用主文件?自己进行比较以模拟水平指示器可能比对主文件进行更改要多得多。

一般来说,要用完整程序文件替换主文件,将 READ + DOW 而不是 %EOF(primaryfile) 放在计算的顶部,并将第二个 READ 和 ENDDO 放在计算的末尾.

对于第 7 列和第 8 列中水平指示器 L0、L1 等的计算,我会先将这些计算移动到子程序中,现在将它们称为 L0_subr、L1_subr 等。

为了处理与先前记录的比较,在第一个 READ 之后,DOW 之前,添加语句以保存级别指示器字段的当前值。在计算结束时,在第二次READ之前,添加语句将当前值与保存值进行比较,如果不同,则调用相关的Lx_subr(s)。在调用所有 Lx_subr 之后,更新该特定级别指示器的保存值。

进行这种更改很容易出错。如果需要,我会将其保留为主要文件并在 I 规范中添加额外的级别指示器。

2017-11-06更新从这里开始:

要同时跟踪上一条记录和当前记录,请使用可以读入数据结构的功能。

read rec cur_ds; 
dow not %eof;
    ... 
    if have_prv_ds; 
      compare the previous record to the current record 
    endif; 
    eval-corr prv_ds = cur_ds; 
    have_prv_ds = *on; 
    read rec cur_ds; 
enddo; 

由于 READ 不会影响与文件关联的独立字段,因此避免意外引用这些独立字段的一个好习惯是避免定义独立字段。为此,请使用 QUALIFIED 关键字定义文件。然后,您将使用 file.fmt 引用记录格式,并且与该文件关联的字段将不存在。

dcl-f myfile qualified;
dcl-ds cur_ds likerec(myfile.fmt);
dcl-ds prv_ds likerec(myfile.fmt);

read myfile.fmt cur_ds; 
dow not %eof(myfile);
    ... 
    if have_prv_ds; 
      compare the previous record to the current record 
    endif; 
    eval-corr prv_ds = cur_ds; 
    have_prv_ds = *on; 
    read myfile.fmt cur_ds; 
enddo;