是否有人有从RPG程序替换主文件的经验,该程序已定义级别指标(用于计算目的的级别指标)?
而不是RPG循环,我需要引入新文件(替换主文件),它将被定义为完全过程文件(不再是主文件)..
感谢。
答案 0 :(得分:3)
为什么要停止使用主文件?进行自己的比较以模拟级别指标可能比对主文件进行更改要多得多。
通常,要使用完整过程文件替换主文件,请将READ + DOW而不是%EOF(primaryfile)放在计算的顶部,并将第二个READ和ENDDO放在计算结束时。< / p>
对于第7列和第8列中的水平指示器L0,L1等的计算,我首先将这些计算移动到子程序中,现在称它们为L0_subr,L1_subr等。
要处理与先前记录的比较,在第一次READ之后,在DOW之前,添加语句以保存级别指示符字段的当前值。在计算结束时,在第二次READ之前,添加语句以将当前值与保存的值进行比较,如果它们不同,则调用相关的Lx_subr(s)。在调用所有Lx_subrs之后,更新该特定级别指示符的已保存值。
进行这种改变很容易出错。我会将其作为主文件保留,并在必要时为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;