Ibm midrange 理解ibmi中的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命令时显示的详细信息的含义

假设命令如下所示:

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程序总是在两步过程中从模块创建的

  • CRTxxxMOD
  • CRTPGM
  • CRTBNDxxx用于从同一名称的单个源创建*PGM对象,它只是一个快捷方式,可以自动完成这两个步骤

    接下来是服务计划的详细信息。以下是绑定到程序的服务程序列表吗?除了SE045RS之外,一切似乎都是某种系统定义的东西

    正确,QSYS中的Qxxxx服务程序是系统对象,并自动绑定

    SE046R中有对SE045RM中定义的过程的过程调用。我完全理解这一点,但有没有可能反过来呢?也就是说,SE046R中定义了一个程序,我可以在SE045RM模块中定义的程序中使用它吗


    一般来说,没有。如果你想共享一个过程,它属于*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过程包含在其中,参考