[英]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.