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
シフト位置などの後のパラメーターの位置は、前のパラメーターのどれが選択されたかに応じて異なります。 OrdInvCM
22 から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 進値は、それが梱包されていることを示しますが、どのタイプ (注文番号または請求書番号) かはわかりません。コマンドシステムが日付範囲で行ったのと同様に位置をシフトする可能性がありますが、私はその特定の実験を実行していません.
要するに、これらのフィールドに何が含まれ、どこに配置されるかを予測できるように、コマンドがパラメーターリストを作成する方法に関するドキュメントまたは少なくとも推定アルゴリズムはありますか?