Ibm midrange 理解ibmi中的DSPPGM命令
我试图理解在程序上使用DSPPGM命令时显示的详细信息的含义 假设命令如下所示:Ibm midrange 理解ibmi中的DSPPGM命令,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我试图理解在程序上使用DSPPGM命令时显示的详细信息的含义 假设命令如下所示: DSPPGM PGM(SE046R) DETAIL(*ALL) Program . . . . . . . : SE046R Library . . . . . . . : HGBASQUA Owner . . . . . . . . : QPGMR Program attribu
DSPPGM PGM(SE046R) DETAIL(*ALL)
Program . . . . . . . : SE046R Library . . . . . . . : HGBASQUA
Owner . . . . . . . . : QPGMR
Program attribute . . : RPGLE
Detail . . . . . . . . : *MODULE
Type options, press Enter.
5=Display description 6=Print description
Creation Optimization Debug
Opt Module Library Attribute Date Level Data
SE046R QTEMP RPGLE 06/28/17 *NONE *YES
显示为*模块的详细信息如下:
DSPPGM PGM(SE046R) DETAIL(*ALL)
Program . . . . . . . : SE046R Library . . . . . . . : HGBASQUA
Owner . . . . . . . . : QPGMR
Program attribute . . : RPGLE
Detail . . . . . . . . : *MODULE
Type options, press Enter.
5=Display description 6=Print description
Creation Optimization Debug
Opt Module Library Attribute Date Level Data
SE046R QTEMP RPGLE 06/28/17 *NONE *YES
我不明白的是为什么SE046R显示为一个模块。因为没有类型为MODULE的同名对象
接下来是服务计划的详细信息。以下是绑定到程序的服务程序列表吗?除了SE045RS之外,一切似乎都是某种系统定义的东西
Service
Program Library Activation Signature
QC2SYS QSYS *IMMED 000000000000000000009485A3A2A8A2
SE045RS *LIBL *IMMED A584A90E326C57B523D38F7C6803F7C4
QRNXIE QSYS *IMMED D8D9D5E7C9C540404040404040404040
QRNXUTIL QSYS *IMMED D8D9D5E7E4E3C9D34040404040404040
QRNXDUMP QSYS *IMMED D8D9D5E7C4E4D4D74040404040404040
QLEAWI QSYS *IMMED 44F70FABA08585397BDF0CF195F82EC1
此外,SE045RS是一个服务程序,它在执行DSPSRVPGM命令时显示SE045RM,我猜这意味着服务程序由一个名为SE045RM的模块组成
SE046R中有对SE045RM中定义的过程的过程调用。我完全理解这一点,但有没有可能反过来呢?也就是说,SE046R中定义了一个程序,我可以在SE045RM模块中定义的程序中使用它吗
更新-1:
好的,所以决定将过程移动到SE045RM,并且过程中使用的任何局部变量现在都必须作为参数传递。这将意味着以下几点:
LongMsg = 'Program ' + %Trim(P_Program) +
' encountered a SQL error code ' +
%Char(P_SQLError01) + ' while trying to ' + %Trim(P_ActText) + ' for ' +
%char(Input_Company) + ':' + %trim(Input_Int_Hdr) + ':' +
%trim(Input_Order) + ':' + %char(Input_Line_Itm_Seq) + ':' +
%char(Input_Rel_Seq) + ':' + %trim(Input_VIN);
以上所有字段都是SE046R的本地字段,在SE046R中工作得很好,但现在必须将这些字段作为参数传递给过程。问题是,传递和上述一样多的参数,再传递大约4个参数,这是一个好的做法吗?这大约是SQLSoftError过程调用的13个参数。这是一件好事吗
我不明白的是为什么SE046R显示为一个模块。因为没有类型为MODULE的同名对象
ILE程序总是在两步过程中从模块创建的
一般来说,没有。如果你想共享一个过程,它属于*SRVPGM。我只想对Charles的答案做一个补充 SE046R中有对SE045RM中定义的过程的过程调用。我完全理解这一点,但有没有可能反过来呢?也就是说,SE046R中定义了一个程序,我可以在SE045RM模块中定义的程序中使用它吗 通常不会。如果您希望共享一个过程,它属于*SRVPGM 通常是因为您可以这样做,但不能使用绑定调用。您需要使用一种称为回调的技术。在这种情况下,SE046R定义了SE045RS中的程序所需的程序。SE046R中的过程是回调过程。SE046R将定义一个指向回调的过程指针,然后将该过程指针传递给SE045RS中需要“回调”到SE046R中的过程。一个常用的例子是C中的qsort函数。qsort可以对任何数组进行排序,因为它使用回调告诉它两个元素是否相等或一个大于另一个。Qsort本身不知道差异,也不能比较数组的两个部分,但是定义数组的程序可以知道这些信息,并且可以基于这些知识进行比较。好的,我现在正在闲逛。这就是按过程指针调用过程的方式:
dcl-s procptr Pointer(*proc);
dcl-pr MyProc;
parm1 ...
parm2 ...
end-pr;
dcl-pr proc ExtProc(procptr);
parm1 ...
parm2 ...
end-pr;
...
procptr = %paddr(MyProc);
...
proc(parm1: parm2);
过程指针的好处在于,它可以像任何其他指针一样作为参数传递,并在另一端用于调用过程。与其他语言中的指针相比,过程指针的一个优点是它们只能用于引用过程,不能用于引用数据,反之亦然。您不能获取过程指针并将其传递给数据指针,然后尝试像修改数据一样修改它。IBM我知道其中的区别,会抛出一个错误。谢谢Murph的回答,但我公司的编码标准不允许我尝试指针技术。我使用SE045RM中SE046R中定义的过程的实际需要来自高级资源的指令后代码审查。因此,每当执行SQL语句(Sqlcod不为零或不为100)后SE045RM中出现SQL错误时,指令将使用已经定义但在SE046R中的SQLError过程。但是,我明白,除了上面定义的方法之外,使用其他方法是不可能的?因此,作为替代方案,将SQLError定义移动到SE045RM是否可行?添加一条新注释作为上述注释中达到的字符限制。。SE046R中对SQLError的调用应该可以正常工作,因为它可以在SE045RM中找到过程定义,该过程定义由SRVPGM SE045S绑定。我采用的方法是定义一个新过程来处理SE045RM中的SQL错误。但这显然是一个标志,我被要求重用现有的代码。在这种情况下,请回想一下,这是不合适的。最好将SQLError过程重构为公共服务程序模块。你可能在未来的其他地方也需要它。请注意,SE046R的全局变量在SE045RM中不会是全局变量,因此您可能需要进行一些修改,以便将全局变量移动到参数中。全局变量问题正是我现在面临的问题。SQLError过程包含在其中,参考