首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何读取像普通PF/LF这样的源文件

如何读取像普通PF/LF这样的源文件
EN

Stack Overflow用户
提问于 2017-06-13 12:32:04
回答 3查看 2.8K关注 0票数 1

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

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

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

所以我用CRTSRCPFTSTLIB中创建了4个TSTLIB

代码语言:javascript
复制
CRTLIB LIB(TSTLIB) TYPE(TEST)
CRTSRCPF FILE(TSTLIB/QCLSRC)
CRTSRCPF FILE(TSTLIB/QDDSSRC)
CRTSRCPF FILE(TSTLIB/QRPGLESRC)
CRTSRCPF FILE(TSTLIB/QRPGSRC)

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

代码语言:javascript
复制
FQRPGSRC   IF   E           K DISK

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

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

  • “由于错误而忽略或删除外部描述的文件的所有记录格式;文件忽略.”。

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

添加关键字,如:

代码语言:javascript
复制
FQRPGSRC   IF   E           K DISK    extfile('TSTLIB/TST001R')

帮不上什么忙。现在,错误仍然存在,但是在编译输出中出现了某种标题,它显示了文件的“RPG-名称”和“外部名称”(QRPGSRC)和记录格式:

代码语言:javascript
复制
*--------------------------------------------------------------------------------------------*
*                               RPG-Name         External Name                               *
* Filename   . . . . . . . . :  QRPGSRC          SYSLIB/QRPGSRC                              *
* Record format  . . . . . . :  (Not used)       QRPGSRC                                     *
*--------------------------------------------------------------------------------------------* 

当指定SYSLIB时,TF为什么在这里?当RENAME从QRPGSRC到QRPGSRCR时,不再存在编译错误(除了不使用定义的文件)。

代码语言:javascript
复制
FQRPGSRC   IF   E           K DISK    extfile('TSTLIB/TST001R')
F                                     rename(QRPGSRC:QRPGSRCR) 

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-13 13:34:08

你就快到了,不过还有几件事。

  1. 源物理文件没有键控,因此K是不正确的,如果您链接,它将使用一个相对的记录编号。READ是这种类型文件的最佳选择。
  2. 当前自由形式的RPG可以有文件声明本地的子过程.因此,您不会总是在文件的前50行中找到文件规范,而且即使您只读取RPGIII文件,它们也有50行文件限制,如果包括扩展名记录、注释和H规范,它们可能会超过50行。
  3. RPGIV对文件规格的数量没有限制。

考虑到这可能不是确定程序的文件依赖关系的最佳方法。要回答你的具体问题:

代码语言:javascript
复制
FQRPGSRC   IF   E             DISK    rename(QRPGSRC:QRPGSRCR)

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

代码语言:javascript
复制
**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命令,如对问题的注释中所示。

票数 3
EN

Stack Overflow用户

发布于 2017-06-20 13:38:23

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

我将执行一个DSPOBJD (提示使用F4)并提供以下参数: DSPOBJD (*LIBL或特定库/*ALL) OBJTYPE(*FILE) DETAIL(*SERVICE)输出(*OUTFILE) OUTFILE(YOURLIB/LASTUSED)。

这会在你的库中创建一个你可以操作的文件.运行一个SQL删除所有使用的天数(ODUCNT) =0或您的选择,以及任何对象属性<> 'PF‘。这只剩下物理文件了。

然后可以选择在最后x天内使用的对象,但必须首先将最后使用的日期(ODUDAT)转换为YYMMDD格式.更新nwilson/lastused集ODUDAT = SUBSTR( ODUDAT ,5,2) concat substr(ODUDAT,1,4)其中ODUDAT <>‘’。

这将允许您比较*天等,并构建动态语句来复制到开发工具库。

票数 0
EN

Stack Overflow用户

发布于 2017-06-21 15:49:03

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

一般来说,生产数据库结构变化缓慢,每年都会有一些变化,所以我集中精力把生产数据混为一谈。当我复制phone#s时,它会更改个人可识别的信息。

代码语言:javascript
复制
    set HOMEPHONE = '555-555-' 
    || cast( cast( rand(49782) * 10000  as integer) || '0000' as char(4))
WHERE homephone <> ' ';      
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44521641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档