如何读取普通PF / LF等源文件

时间:2017-06-13 12:32:04

标签: ibm-midrange rpgle rpg

我目前正在开发一个将物理文件从生产环境传输到我的测试环境的程序。要做到这一点,我想

  • 读取给定源代码文件的前50行
  • 提取正在使用的文件和
  • 使用CPYF
  • 通过CL程序复制它们

一位同事告诉我使用CL OVRDBF QRPGSRC,在我的F-Specs中定义QRPGSRC并像其他PF一样使用它们(成员名称为READ / CHAIN)。这看起来有点混乱,所以我搜索了另一个解决方案:使用F-Specs中的keyworks:https://www.google.de/search?q=ibm+rpg+EXTMBR

所以我在PF-SRC中使用CRTSRCPF创建了4个TSTLIB

CRTLIB LIB(TSTLIB) TYPE(TEST)
CRTSRCPF FILE(TSTLIB/QCLSRC)
CRTSRCPF FILE(TSTLIB/QDDSSRC)
CRTSRCPF FILE(TSTLIB/QRPGLESRC)
CRTSRCPF FILE(TSTLIB/QRPGSRC)

并将现有的源代码文件从我自己的库MYLIB/QRPGSRC复制到TSTLIB/QRPGSRC。然后在我定义的MYLIB / QRPGLESRC中创建了一个新的ILE RPG程序:

FQRPGSRC   IF   E           K DISK

编译时我得到2个错误(#1有严重30,#2是40:RNF2121和RNF2109')告诉我

  • 已定义外部描述文件中的记录格式名称;忽略记录格式。

  • 外部描述的文件的所有记录格式因错误而被忽略或丢弃;文件被忽略。”。

在我阅读一些教程时:我可以使用源代码文件的名称als记录名称轻松访问它们。但根据错误消息,只有一个记录名称,这是:QRPGSRC

添加以下关键字:

FQRPGSRC   IF   E           K DISK    extfile('TSTLIB/TST001R')

没有多大帮助。现在错误仍然存​​在但在编译输出中出现了某种标题,它显示了文件的“RPG-Name”和“外部名称”(QRPGSRC)以及记录格式:

*--------------------------------------------------------------------------------------------*
*                               RPG-Name         External Name                               *
* Filename   . . . . . . . . :  QRPGSRC          SYSLIB/QRPGSRC                              *
* Record format  . . . . . . :  (Not used)       QRPGSRC                                     *
*--------------------------------------------------------------------------------------------* 

为什么TF在指定SYSLIB时会在{​​{1}}? 当extfile('TSTLIB/TST001R') QRPGSRC到QRPGSRCR时,不再有编译错误(除了没有使用定义的文件)。

RENAME

所以我的问题: 我需要做些什么才能读取普通LF / PF之类的PF-SRC,这样我才能在位于给定PF-SRC的源代码文件中的一行上读取/链接?

3 个答案:

答案 0 :(得分:3)

你几乎就在那里,但有一些事情。

  1. 源物理文件没有键入,因此K不正确,如果您链​​接,它将具有相对记录号。对于此类文件,READ是您最好的选择。
  2. 当前自由格式RPG可以具有子程序本地的文件声明。因此,您不会总是在文件的前50行中找到文件规范,即使您只读取RPGIII文件,它们也有50个文件限制,如果您包含扩展记录,注释和可能需要超过50行。你的H规格。
  3. RPGIV对文件规格的数量没有限制。
  4. 鉴于这可能不是确定程序文件依赖性的最佳方法。回答你的具体问题:

    FQRPGSRC   IF   E             DISK    rename(QRPGSRC:QRPGSRCR)
    

    可能是固定格式的最佳选择。但我喜欢推广更现代的方法,所以在免费格式中看起来更像是这样:

    **free
    ctl-opt DftActGrp(*No) ActGrp(MyNamedAG)                            
            DatFmt(*ISO)                                           
            Option(*SrcStmt: *NoDebugIo: *NoUnref);                
    
    dcl-f qrpgsrc qualified;                                       
    
    dcl-ds src       LikeRec(qrpgsrc.qrpgsrc);                     
    
    dcl-s ix         Int(5) Inz(0);                                
    dcl-s FullyFree  Ind Inz(*OFF);                                
    
    dcl-c LC         'abcdefghijklmnopqrstuvwxyz';                 
    dcl-c UC         'ABCDEFGHIJKLMNOPQRSTUVWXYZ';                 
    
    for ix = 1 to 50;                                              
      read qrpgsrc.qrpgsrc src;                                    
      if %eof();                                                   
        leave;                                                     
      endif;                                                       
    
      // Is this a fully free form program?                        
      if ix = 1;                                                   
        FullyFree = (%xlate(UC: LC: %trim(src.srcdta)) = '**free');
      endif;                                                       
    
      // Do something here                                         
    endfor;
    return;                                      
    

    您将要使用CLP或其他东西将源文件覆盖到相应的库,并选择要处理的成员。这也可以循环检索所有成员,每个成员调用一次程序。

    确定程序依赖性的最佳方法是使用DSPPGMREF命令,如问题评论中所示。

答案 1 :(得分:0)

如果您的系统与我见过的最相似,那么通过查询,sql,保存文件,工作文件等创建的数百个文件可能会或可能不需要。此方法允许您拉取系统上的所有文件,并随意操作/分析。

我会执行DSPOBJD(使用F4提示)并提供以下参数:  DSPOBJD OBJ(* LIBL [或特定库] / * ALL)OBJTYPE(* FILE)DETAIL(* SERVICE)OUTPUT(* OUTFILE)OUTFILE(YOURLIB / LASTUSED)。

这将在您的库中创建一个文件,您可以操作...运行SQL以使用Days Used Count(ODUCNT)= 0 [或您的选择]删除所有文件,并使用Object Attribute<> 'PF'。这只留下物理文件。

然后您可以选择最近x天内使用的对象,但您必须首先将上次使用日期(ODUDAT)的日期转换为YYMMDD格式... 更新nwilson / lastused set ODUDAT = SUBSTR(ODUDAT,5,2)concat substr(ODUDAT,1,4)WHERE ODUDAT<> ''。

这将允许您比较* DAYS等,并构建动态语句以复制到您的开发库。

答案 2 :(得分:0)

对于自动化流程,您必须执行dsppgmref和prtsqlinf。

一般来说,生产数据库结构每年都会发生一些变化,所以我专注于将生产数据混淆到测试中。当我复制时,IE会更改手机号码等个人身份识别信息。

    set HOMEPHONE = '555-555-' 
    || cast( cast( rand(49782) * 10000  as integer) || '0000' as char(4))
WHERE homephone <> ' ';