2017-06-29 117 views
0

プログラムでDSPPGMコマンドを使用して表示される詳細の意味を理解しようとしています。IBM iのDSPPGMコマンドの理解

と仮定コマンドは以下の通りです:MODULEは以下の通りです*として

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でMODULEからなることを意味を推測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に対してローカルであり、その内部で完全に働いているだろうが、今、これらはプロシージャにパラメータとして渡さなければなりません。質問は上記のように多くのパラメータを渡しており、約4つより良い方法があります。これは、SQLSoftErrorのプロシージャー呼び出しに約13のパラメーターになります。これは良いことですか?

答えて

1

ここで私が理解できないのは、SE046Rがモジュールとして表示される理由です。 MODULE型のこの名前のオブジェクトがないためです。

ILEプログラムは、常に2段階のプロセスでモジュールから作成されます。

  1. CRTxxxMOD
  2. CRTPGM

同じ名前の単一のソースから* PGMオブジェクトを作成するために使用されるCRTBNDxxxは、単に自動的にあなたのための両方の手順を行いショートカットです。

次はサービスプログラムの詳細です。以下のものはプログラムに結び付けられたサービスプログラムのリストですか? SE045RSを除いて、すべてのものは何らかのシステム定義のものと思われますか?

QSYSのQxxxxサービス・プログラムは、システム・オブジェクトであり、自動的にバインドされます。

SE046Rには、SE045RMで定義された手順にプロシージャコールがあります。私は完全にそれに打ち勝っていますが、他の方法では可能でしょうか?つまり、SE046R内で定義されたプロシージャがあるのですが、SE045RMモジュール内で定義されたプロシージャ内で使用できますか?

一般的に、プロシージャを共有する場合は、* SRVPGMに属します。

0

私はチャールズの答えに1つの補遺を作りたいだけです。

手順はSE045RM内で定義された手順にSE046Rに呼び出しがあります。私は完全にそれに打ち勝っていますが、他の方法では可能でしょうか?つまり、SE046R内で定義されたプロシージャがあるのですが、SE045RMモジュール内で定義されたプロシージャ内で使用できますか?

一般的に、プロシージャを共有する場合は、* SRVPGMに属します。

通常は実行できますが、バインドされた呼び出しではできません。コールバックと呼ばれる手法を使用する必要があります。この場合、SE046RはSE045RSの手順で必要とされる手順を定義します。 SE046Rのプロシージャはコールバックプロシージャです。 SE046Rはコールバックへのプロシージャポインタを定義し、そのプロシージャポインタをSE045RS内のSE046Rに 'コールバック'する必要があるプロシージャに渡します。一般的に使用されている例として、Cのqsort関数があります。Qsortは、2つの要素が等しいか1つが大きいかどうかをコールバックを使用するため、配列を並べ替えることができます。 Qsort自体は違いを知らず、2つの配列を比較することはできませんが、配列を定義したプログラムはその情報を知ることができ、その知識に基づいて比較を行うことができます。私は今や散歩しています。これは、手続きポインタで手続きを呼び出すと、どのように見えるかをされています

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はその違いを知っており、エラーが発生します。

+0

私の会社のコーディング標準はポインタテクニックを試してもらえませんが、答えはMurphです。 SE045RMのSE046R内で定義された手順を実際に使用する必要があるのは、シニアリソースによる命令ポストコードレビューです。したがって、SQL文(Sqlcodがゼロでないか100ではない)の実行後にSE045RMにSQLエラーが存在する場合は、常にSE046Rですでに定義されているSQLErrorプロシージャを使用します。しかし、あなたが上で定義した方法以外の方法を使用することによってこれは可能ではないでしょう、と私は理解していますか?代わりに、SQLErrorディフィニションをSE045RMの作業に移すのでしょうか? –

+0

新しいコメントをchar limitとして追加すると、上記の値に達しました.. SE046R内のSQLErrorの呼び出しは、SRVPGM SE045SによってバインドされているSE045RMのプロシージャ定義を検索するように機能するはずです。私が従ったアプローチは、SE045RMでSQLエラーを処理するための新しいプロシージャを定義することでした。しかし、これは明らかにフラグとして提起され、私は既存のコードを再利用するよう求められました。考えてください –

+0

この場合、コールバックは本当に適切ではありません。 SQLErrorプロシージャを共通のサービスプログラムモジュールにリファクタリングすることが最善です。あなたはおそらく将来他の場所でそれを必要とするでしょう。 SE046RでグローバルなものはSE045RMではグローバルではないので、グローバル変数をパラメータに移動するためにいくつかの変更が必要な場合があります。 – jmarkmurphy

関連する問題