2

RPGLE プログラムを駆動する CMD コマンド オブジェクトがあります。コマンドはいくつかの異なるパラメーターを使用して呼び出される可能性があり、そのうちのいくつかは相互に排他的であるため、RPGLE のデータ構造を使用して渡されたパラメーターを解析し、さまざまな位置でパラメーターを渡すさまざまなシナリオを処理できるようにします。

たとえば、CMD ファイルには次の内容があります。

CMD       PROMPT('Reprint Invoices and Credits')      

 PARM      KWD(ORDERNUM) TYPE(ORDER) +                 
           PROMPT('For order number:')                 

 PARM      KWD(INVDATE) TYPE(*DATE) PASSATR(*YES) +    
           PROMPT('For invoice date')                  

 PARM      KWD(DATERANGE) TYPE(DTRANGE) +              
           PROMPT('For date range:')      

 PARM      KWD(TRANSTYPE) TYPE(*CHAR) LEN(9) RSTD(*YES)      +
              DFT(*BOTH) VALUES(*INVOICES *CREDITS *BOTH)    +
              PASSATR(*YES) PROMPT('Transactions to print')   

 DTRANGE:  ELEM      TYPE(*DATE) MIN(1) PASSATR(*YES) +             
                     PROMPT('Beginning date')                       
           ELEM      TYPE(*DATE) MIN(1) PASSATR(*YES) +             
                     PROMPT('Ending date')                          

 ORDER:    ELEM      TYPE(*DEC) LEN(6) MIN(1) PASSATR(*YES) +       
                     PROMPT('Order number')                         
           ELEM      TYPE(*DEC) LEN(2) MIN(0) PASSATR(*YES) +       
                     PROMPT('Shipment number (optional)')           

           DEP       CTL(*ALWAYS) PARM(ORDERNUM INVDATE DATERANGE) +
                     NBRTRUE(*EQ 1)                                 

ユーザーは、注文番号、日付、日付範囲など、さまざまな基準で印刷できます。これら 3 つの方法のうち 1 つだけを選択できます。ユーザーの選択に応じて、パラメーターは呼び出された RPGLE プログラムに異なる方法で配信されます。

  ********************************************************************                           
  *      Parameters from CMD object INV_REPRNT                                                   

 D InputParms      DS                  TEMPLATE QUALIFIED                                        
 D  AllParms                    143A                                                             
 D  ParmType               2      2A                                        Can't find in manual 
 D                                                                          'Type' might be      
 D                                                                          a misnomer           
 D                                                                                               
 D  OrdDteAttr             3      3A                                        For attr's, see      
 D  OrderNum               4      7P 0                                      SEU help for         
 D  ShipAttr               8      8A                                        CMD PASSATR          
 D  Shipment               9     10P 0                                                           
 D  OrdInvCMAttr          21     21A                                                       
 D  OrdInvCM              22     30A                                        char  9        
 D                                                                                 
 D  InvDate@               4     10A                                               
 D  DteInvCMAttr          13     13A                                               
 D  DteInvCM              14     22A                                        char  9
 D                                                                                 
 D  BeginDateAttr         13     13A                                               
 D  BeginDate@            14     20A                                               
 D  EndDateAttr           21     21A                                               
 D  EndDate@              22     28A                                               
 D  RgeInvCMAttr          29     29A                                               
 D  RgeInvCM              30     38A                                        char  9

ご覧のとおり、TRANSTYPEシフト位置などの後のパラメーターの位置は、前のパラメーターのどれが選択されたかに応じて異なります。 OrdInvCM22 からDteInvCM始まり、14 からRgeInvCM始まり、30 から始まります。これは問題ではありません。このデータ構造とそれを使用するコードは、呼び出している不思議な小さな属性に基づいて、読み取る正しい位置を選択できるからですParmType。私が知る限り、この属性は、インターネット上の CL マニュアルや SEU エディターに含まれるヘルプ (PASSATRオンライン マニュアルにない情報がある) のどこにも記載されていません。pass 属性に関連する の動作を少しまとめましたParmType。使用するには十分ですが、完全に理解するには不十分です。

解析を容易にするためのいくつかの定数PASSATR(すべての可能性ではありません):

 D Null            C                   CONST(X'00')                                            
 D Parm2           C                   CONST(X'02')                                            
 D NumSpecd        C                   CONST(X'A1')                         1010 0001          
 D NumUnspecd      C                   CONST(X'21')                         0010 0001          
 D CharQSpecd      C                   CONST(X'C5')                         1100 0101 Quoted   
 D CharQUnspecd    C                   CONST(X'45')                         0100 0101 Quoted   
 D CharUQSpecd     C                   CONST(X'85')                         1000 0101 Unquoted 
 D CharUQUnspecd   C                   CONST(X'05')                         0000 0101 Unquoted 
 D                                                                                             
 D IsSpecd         C                   CONST(X'80')                         >= 1000 0000       

私はそれを発見しました:

 IF P.ParmType = Null;         
   IF P.OrdDteAttr >= IsSpecd; 
     // this is a single date
   ELSE;
     IF P.BeginDateAttr >= IsSpecd;
       // this is a data range
     ELSE;
       // this is error condition I have not gotten yet
     ENDIF;
   ENDIF;
 ELSE;
   IF P.OrdDteAttr >= IsSpecd;
     // this is an order number
   ELSE;
     // this is error condition I have not gotten yet
   ENDIF;
 ENDIF;

つまり、ParmTypeパラメータが日付または日付範囲の場合、 の 16 進値は '00' になります。パラメータが「オーダー番号」のParmTypeパックされた *DEC (6P 0) の場合、16 進値は「02」になります。

ParmTypeさまざまなパラメーターの組み合わせを受け入れることができるプログラムを確実に作成できるように、この値がどのように特定の数値に設定されるかを理解したいと思います。また、データ範囲フィールドが単一の日付のように 4 ではなく 14 から始まる特定の理由もわかりません。この事実を利用して必要な区別をすることができましたが、コマンド システムが意図的にこれを行ったかどうかはわかりません。同じデータ型の可能性が 2 つあることがわかったからです。または、これが単なるラッキー ブレークであり、発生が保証されていない場合です。請求書番号など、追加のパックされたパラメータを選択肢として追加したい場合、同様の質問が発生します。'A1' の 'PASSATR' 16 進値は、それが梱包されていることを示しますが、どのタイプ (注文番号または請求書番号) かはわかりません。コマンドシステムが日付範囲で行ったのと同様に位置をシフトする可能性がありますが、私はその特定の実験を実行していません.

要するに、これらのフィールドに何が含まれ、どこに配置されるかを予測できるように、コマンドがパラメーターリストを作成する方法に関するドキュメントまたは少なくとも推定アルゴリズムはありますか?

4

3 に答える 3

0

PASSATR 属性について述べた Bob Cozzi の記事を漠然と思い出しました。多分それは役立つでしょう... https://www.mcpressonline.com/programming/rpg/retriving-user-space-data

于 2017-08-02T22:52:19.660 に答える