[英]Understanding DSPPGM command in IBM i
我试图了解在程序上使用DSPPGM命令显示的详细信息的含义。
假设命令如下:
DSPPGM PGM(SE046R) DETAIL(*ALL)
显示为* MODULE的详细信息如下:
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中可以很好地工作,但是现在这些必须作为参数传递给Procedure。 问题是传递与上述一样多的参数以及大约4个以上的良好实践吗? 这大约是SQLSoftError的Procedure调用的13个参数。 这是一件好事吗?
我在这里不明白的是为什么SE046R显示为模块。 因为没有该名称的对象具有MODULE类型。
ILE程序总是通过两步过程从模块创建的。
CRTBNDxxx用于从同名的单个来源创建* PGM对象,它只是一种快捷方式,可以自动为您完成两个步骤。
接下来是服务程序的详细信息。 以下是与该程序绑定的服务程序列表吗? 除了SE045RS,一切似乎都是某种系统定义的东西?
正确,QSYS中的Qxxxx服务程序是系统对象,并且会自动绑定到其中。
SE046R中存在对SE045RM中定义的过程的过程调用。 我完全理解这一点,但是反过来可能吗? 那就是SE046R中定义了一个过程,我可以在SE045RM模块中定义的过程中使用它吗?
通常,不会。 如果要共享过程,则该过程属于* SRVPGM。
我只想对查尔斯的答案做一个补充。
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 i知道它们之间的区别,并且会抛出错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.