RPG / RPGLE - 使用参数捕获程序中的程序

时间:2018-04-17 14:43:36

标签: ibm-midrange rpgle

有没有办法捕获程序中所有被调用的程序,包括每个被调用程序的参数(名称,类型和长度)

DSPPGMREF to outfile让我中途到那里......

DSPPGMREF PGM(MYLIB/*ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/MYFILE)

2 个答案:

答案 0 :(得分:3)

如果使用PGMINFO(* PCML:* MODULE)编译程序,无论是作为命令参数还是在H规范中,程序都将包含描述参数的程序调用标记语言。

您可以使用QBNRPII API从程序中检索PCML。本文有一个只显示PCML http://ibm.biz/see_pcml_embedded_in_pgm_or_srvpgm的命令,但您可以修改它以使用XML-INTO或XML-SAX以可用的方式获取信息。 (如果参数可能是复杂的数据结构,XML-INTO可能无法正常工作。)

对于具有以下PI的程序:

dcl-pi *n;
   name char(25) const;
   salary packed(9:2);
end-pi;

这是PCML的一个例子

<pcml version="6.0">
   <!-- RPG program: PCMLTEST  -->
   <!-- created: 2018-04-18-08.01.17 -->
   <!-- source: BMORRIS/QRPGLESRC(PCMLTEST) -->
   <!-- 1 -->
   <program name="PCMLTEST" path="/QSYS.LIB/BMORRIS.LIB/PCMLTEST.PGM">
      <data name="NAME" type="char" length="25" usage="input" />
      <data name="SALARY" type="packed" length="9" precision="2" usage="inputoutput" />
   </program>
</pcml>

为了得到这个漂亮的格式,我用PGMINFO(* PCML:* STMF)INFOSTMF('PCMLTEST.pcml')编译了我的程序。生成到模块中的PCML(然后放在程序中)没有任何换行符或额外的间距。

以下是RPG Cafe命令显示的同一程序:

Printing PCML info
   Object: BMORRIS/PCMLTEST  *PGM
   Module: *ALLBNDMOD
   Length of information: 320
   Length of data: 227
       0:  <pcml version="6.0"> <program name="PCMLTEST" entr
      50:  ypoint="PCMLTEST"> <data name="NAME" type="char" l
     100:  ength="25" usage="input" /> <data name="SALARY" ty
     150:  pe="packed" length="9" precision="2" usage="inputo
     200:  utput" /> </program></pcml>

答案 1 :(得分:2)

从问题的上下文来看,我假设您希望通过分析源或对象而不是在运行时进行此操作。

据我所知,没有简单的方法可以使用内置的IBM i工具来构建自己的交叉引用工具。有很多第三方交叉引用工具可以为您执行此操作,但我知道IBM i上没有任何免费工具。一个只包括我个人使用的清单列表是Hawkeye Pathfinder,MDCMS或Fresche X-Analysis。