我希望您可以帮助我使用数据结构来提高代码的可读性。
我正在试验新的完全免费的RPG,并且能够使我的程序正常工作。工作程序将填充从编译器引入的外部描述文件中定义的字段。它以作业名称作为输入参数,并使用作业的开始时间编写新的记录,或使用作业的结束时间更新现有记录。它将在某些进程执行以记录运行时之前和之后被调用。
我正在使用带有短名称的旧文件:
File Name JOBTIMES
rjobnm *char 10
rastim *packed 6 0
raetim *packed 6 0
我可以使该程序执行我想要的操作,但是我想将其更进一步。我希望使用相同大小和类型的字段定义一个数据结构,但使用更有意义的名称,并使用程序主体中的这些字段来更好地进行自我记录。
最终我无法使它正常工作。我有两个问题。
首先,我希望能够重命名数据结构中与我想要更新的文件相对应的字段,以使用更长的名称。我不知道该怎么做,所以我用相同类型的相同字段手动定义了一个单独的数据结构。我希望这里有更好的方法。
第二,我希望能够使用该新数据结构写入或更新文件,但这也没有解决。最终,我可以通过一个微不足道的过程来编写,但无法更新。尝试同时执行这两个操作会导致编译器错误,并以*输出vs *更新为症结所在。
我有一些无法使用的代码,尽管它给出了我想做什么的想法。
使用更新将数据从新字段推入文件或以一种简单的方式写入。我希望避免从一个DS到另一个DS的副本。
dcl-f JOBTIMES disk(*ext) usage(*update : *output) keyed;
dcl-s Now timestamp;
dcl-s currTime time(*hms);
dcl-ds FileKey likerec(jtfmt : *key)
dcl-ds FileDs extname'JOBTIMES' : *output) qualified;
end-ds;
dcl-ds UpdateFields; // was hoping to use overlay in FileDs.
JobName char(10); // compiler doesn't like.
StartTime packed(6 : 0);
EndTime packed(6 : 0);
end-ds;
dcl-pr RECORDTIME extpgm;
jobnam char(10);
end-pr;
dcl-pi RECORDTIME;
jobnam char(10);
end-pi;
Now = %timestamp();
currTime = %time(Now);
FileKey.rjobnm = jobnam;
chain %kds(FileKey) JOBTIMES;
if not %found;
JobName = jobman;
StartTime = %dec(currTime : *hms);
FileDs = UpdateFields;
write jtfmt FileDs; // would rather use UpdateFields here
else;
EndTime = %dec(currTime : *hms);
FileDs = UpdateFields;
update jtfmt FileDs; // would rather use UpdateFields here
endif;
return;
是否有某种方法可以使这项工作正常进行,还是应该忘记从外部文件重命名字段?如果我同意的话,这并不是一项艰巨的工作。
感谢您的时间。
答案 0 :(得分:4)
老派的答案是使用I-Spec重命名字段...但是那只会给您一个14个字符的名称。最好将D-Spec DS与EXTFLD一起使用。
现代答案是使用DDS ALIAS()
关键字或SQL DDL分配字段longs名称。 要记住的是,只要不使用简短的系统名称,就可以分配长名称而不影响现有的名称。因此无需对现有程序进行级别检查。
然后在您的RPG程序中,只需将ALIAS
关键字添加到F-Spec中,编译器将使用长名称而不是输入短名称。
如果需要,可以使用DS声明上的LIKEREC()
或EXTNAME()
和ALIAS
关键字为I / O创建DS。
Google RPGLE ALIAS
,您应该找到很多示例...