使用数据结构在RPG IV中完全免费更新或写入外部描述的文件

时间:2018-07-28 12:48:33

标签: rpgle

我希望您可以帮助我使用数据结构来提高代码的可读性。

我正在试验新的完全免费的RPG,并且能够使我的程序正常工作。工作程序将填充从编译器引入的外部描述文件中定义的字段。它以作业名称作为输入参数,并使用作业的开始时间编写新的记录,或使用作业的结束时间更新现有记录。它将在某些进程执行以记录运行时之前和之后被调用。

我正在使用带有短名称的旧文件:

    File Name JOBTIMES
      rjobnm *char 10
      rastim *packed 6 0
      raetim *packed 6 0

我可以使该程序执行我想要的操作,但是我想将其更进一步。我希望使用相同大小和类型的字段定义一个数据结构,但使用更有意义的名称,并使用程序主体中的这些字段来更好地进行自我记录。

最终我无法使它正常工作。我有两个问题。

首先,我希望能够重命名数据结构中与我想要更新的文件相对应的字段,以使用更长的名称。我不知道该怎么做,所以我用相同类型的相同字段手动定义了一个单独的数据结构。我希望这里有更好的方法。

第二,我希望能够使用该新数据结构写入或更新文件,但这也没有解决。最终,我可以通过一个微不足道的过程来编写,但无法更新。尝试同时执行这两个操作会导致编译器错误,并以*输出vs *更新为症结所在。

我有一些无法使用的代码,尽管它给出了我想做什么的想法。

  • 以某种方式重命名上述字段并在pgm中使用新名称
  • 使用更新将数据从新字段推入文件或以一种简单的方式写入。我希望避免从一个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;
    

是否有某种方法可以使这项工作正常进行,还是应该忘记从外部文件重命名字段?如果我同意的话,这并不是一项艰巨的工作。

感谢您的时间。

1 个答案:

答案 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,您应该找到很多示例...