我目前正在开发一个将物理文件从生产环境传输到我的测试环境的程序。要做到这一点,我想
CPYF
一位同事告诉我使用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的源代码文件中的一行上读取/链接?
答案 0 :(得分:3)
你几乎就在那里,但有一些事情。
K
不正确,如果您链接,它将具有相对记录号。对于此类文件,READ
是您最好的选择。鉴于这可能不是确定程序文件依赖性的最佳方法。回答你的具体问题:
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 <> ' ';