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
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)告诉我
- “已定义外部描述文件中的记录格式名称;已忽略记录格式。”
- “由于错误而忽略或删除外部描述文件的所有记录格式;忽略文件。”
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
不正确,如果链接,它将使用相对记录编号<代码>读取是您选择此类型文件的最佳选择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 <> ' ';