Ibm midrange 如何像普通PF/LF一样读取源文件

Ibm midrange 如何像普通PF/LF一样读取源文件,ibm-midrange,rpgle,rpg,Ibm Midrange,Rpgle,Rpg,我目前正在开发一个程序,将物理文件从生产环境传输到测试环境。为了实现这一点,我想 读取给定sourc代码文件的前50行 提取正在使用的文件并 使用CPYF 一位同事告诉我使用CL anOVRDBFQRPGSRC,在我的F规范中定义QRPGSRC,并像其他PF一样使用它们(读取/链接成员名称)。这看起来有点混乱,所以我寻找了另一个解决方案:在F-Specs中使用keyworks: 因此,我在TSTLIB中使用CRTSRCPF创建了4个PF-SRC: CRTLIB LIB(TSTLIB) TYP

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

  • 读取给定sourc代码文件的前50行
  • 提取正在使用的文件并
  • 使用
    CPYF
一位同事告诉我使用CL an
OVRDBF
QRPGSRC,在我的F规范中定义QRPGSRC,并像其他PF一样使用它们(读取/链接成员名称)。这看起来有点混乱,所以我寻找了另一个解决方案:在F-Specs中使用keyworks:

因此,我在
TSTLIB
中使用
CRTSRCPF
创建了4个
PF-SRC

CRTLIB LIB(TSTLIB) TYPE(TEST)
CRTSRCPF FILE(TSTLIB/QCLSRC)
CRTSRCPF FILE(TSTLIB/QDDSSRC)
CRTSRCPF FILE(TSTLIB/QRPGLESRC)
CRTSRCPF FILE(TSTLIB/QRPGSRC)
并将现有的sourc代码文件从我自己的库
MYLIB/QRPGSRC
复制到
TSTLIB/QRPGSRC
。然后在MYLIB/QRPGLESRC中创建了一个新的ILE RPG程序,其中我定义了:

FQRPGSRC   IF   E           K DISK
编译时,我得到两个错误(#1有严重的30,#2在40:RNF2121和RNF2109)告诉我

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

  • 由于错误而忽略或删除外部描述文件的所有记录格式;忽略文件。
当我阅读一些教程时:我可以使用源代码文件als记录名轻松访问它们。但根据错误消息,只有一个记录名,这是:
QRPGSRC

添加关键字,如:

FQRPGSRC   IF   E           K DISK    extfile('TSTLIB/TST001R')
没有多大帮助。现在错误仍然存在,但在编译输出中会出现某种类型的头,其中显示了文件(QRPGSRC)的“RPG名称”和“外部名称”以及记录格式:

*--------------------------------------------------------------------------------------------*
*                               RPG-Name         External Name                               *
* Filename   . . . . . . . . :  QRPGSRC          SYSLIB/QRPGSRC                              *
* Record format  . . . . . . :  (Not used)       QRPGSRC                                     *
*--------------------------------------------------------------------------------------------* 
当指定了extfile('TSTLIB/TST001R')时,为什么TF在这里?? 当
RENAME
ing QRPGSRC to QRPGSRC时,不再有编译错误(除了不使用定义的文件)

因此,我的问题是:
我必须做些什么才能像普通的LF/PF一样读取PF-SRC,这样我才能读取位于给定PF-SRC中的源代码文件中的一行代码?

您就快到了,但还有几件事

  • 源物理文件未设置关键帧,因此
    K
    不正确,如果链接,它将使用相对记录编号<代码>读取是您选择此类型文件的最佳选择
  • 当前的自由格式RPG可以具有子过程的本地文件声明。因此,您不会总是在文件的前50行中找到文件规范,即使您只读取RPGIII文件,它们也有50个文件限制,如果您包括扩展记录、注释和H规范,则可能需要超过50行
  • RPGIV对文件规范的数量没有限制
  • 考虑到这可能不是确定程序文件依赖关系的最佳方法。要回答您的具体问题:

    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
    命令。

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

    我将执行DSPOBJD(用F4提示)并提供以下参数: DSPOBJD OBJ(*LIBL[或特定库]/*全部)OBJTYPE(*文件)详细信息(*服务)输出(*OUTFILE)OUTFILE(您的库/上次使用的)

    这将在库中创建一个文件,您可以对其进行操作。。。运行SQL删除所有使用天数计数(ODUCNT)=0[或您的选择],以及对象属性为“PF”的任何内容。这只剩下物理文件

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


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

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

    一般来说,生产数据库结构变化缓慢,每年都会有一些变化,所以我集中精力将生产数据混淆到测试中。IE在复制时更改个人识别信息,如手机

        set HOMEPHONE = '555-555-' 
        || cast( cast( rand(49782) * 10000  as integer) || '0000' as char(4))
    WHERE homephone <> ' ';      
    
    set HOMEPHONE='555-555-'
    ||强制转换(强制转换(兰特(49782)*10000为整数)| |“0000”为字符(4))
    何处为家庭电话“”;
    
    或者,您可以使用
    DSPPGMREF PGM(OBJLIB/*ALL)OUTPUT(*OUTFILE)OBJTYPE(*PGM*SRVPGM*MODULE)OUTFILE(YOURBIB/PGMREF)
    查找程序使用的文件,这是一个非常好的主意,谢谢!但是这个alsp包括来自DSPF的记录,DSPF记录和来自PF的“正常”记录之间不可能有区别,我想知道我将使用
    DSPPGMREF
    到一个输出文件,然后使用
    QSYS2/SYSTABLES
    上连接它(WHLNAM,WHFNAM)=(表模式,表名称)
    。这只会选择物理和逻辑(甚至会告诉您该表是物理表还是逻辑表)!谢谢你的大力支持我来看看这个
        set HOMEPHONE = '555-555-' 
        || cast( cast( rand(49782) * 10000  as integer) || '0000' as char(4))
    WHERE homephone <> ' ';