9.26.コマンド定義のリスト項目 | |||||||||
ユーザーコマンドを作る場合、面倒なのは、データの繰り返し指定。「リスト」と呼ばれるものです。マニュアルは、説明だけで、画面で表示されるコマンドの形態を見せてくれません。 リストには、
の3種類があります。 下の図で、キーワードSTRINGは混合リストを使った「リスト中リスト(List within List)」、となり、キーワードSPCTYPEは、単純リスト(Simple List)となります。
CMD PROMPT('ソースデータ置き換え')
PARM KWD(STRING) TYPE(SCNDTA) MIN(1) MAX(30) +
PROMPT('検索指定')
PARM KWD(SRCFILE) TYPE(SRCFILE) MIN(1) +
PROMPT('原始ファイル')
PARM KWD(BACKUP) TYPE(BACKUP) +
PROMPT('バックアップ原始ファイル')
PARM KWD(SRCMBR) TYPE(*GENERIC) LEN(10) +
SPCVAL((*ALL)) PROMPT('原始メンバー ')
PARM KWD(TOMBR) TYPE(*NAME) LEN(10) DFT(*GEN) +
SPCVAL((*GEN) (*SRCMBR)) +
PROMPT('バックアップ原始メンバー')
PARM KWD(COLUMN) TYPE(*CHAR) LEN(1) RSTD(*YES) +
DFT(*YES) SPCVAL((*YES 1) (*NO 0)) +
PROMPT('カラム単位の置き換え')
PARM KWD(SPCTYPE) TYPE(*CHAR) LEN(5) RSTD(*YES) +
DFT(*ALL) SPCVAL((*ALL) (*FSPC) (*ESPC) +
(*ISPC) (*CSPC) (*OSPC)) MAX(5) +
PROMPT('変換対象となる仕様書')
SRCFILE: QUAL TYPE(*NAME) LEN(10)
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL)) PROMPT('ライブラリー')
BACKUP: QUAL TYPE(*NAME) LEN(10) DFT(*NONE) SPCVAL((*NONE))
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL)) PROMPT('ライブラリー')
SCNDTA: ELEM TYPE(*CHAR) LEN(30) EXPR(*YES) +
PROMPT('検索文字')
ELEM TYPE(*CHAR) LEN(30) EXPR(*YES) +
PROMPT('置換文字')
単純リストの場合キーワードSRCTYPEに指定された内容は、下のようにプログラムに渡されます。
これは、簡単です。最初の2バイトのバイナリを数字にして、その数分、5バイトごとに切り出せばいいのです。CLPでも可能でしょう。 E SPC 5 5 ;
I******************************************************
I* D E F I N E D A T A - S T R U C T U R E *
I******************************************************
IDSSPC DS
I B 1 20SPCCNT
I 3 27 SPC
C******************************************************
C* DEFINITION MODULE ( PLIST FIELD KLIST ) *
C******************************************************
C *ENTRY PLIST :
C PARM DSSPC :
C******************************************************
C* M A I N - R O U T I N E
C******************************************************
C* :
C* :
C******************************************************
C* S U B - R O U T I N E
C******************************************************
C*----------------------------------------------------*
C *INZSR BEGSR :
C*----------------------------------------------------*
B001 C 1 DO SPCCNT II 30 :
B002 C SELEC :
002 C SPC,II WHEQ '*ALL' :
002 C MOVE *ON FSPC 1 :
002 C MOVE *ON ESPC 1 :
002 C MOVE *ON ISPC 1 :
002 C MOVE *ON CSPC 1 :
002 C MOVE *ON OSPC 1 :
002 C SPC,II WHEQ '*FSPC' :
002 C MOVE *ON FSPC :
002 C SPC,II WHEQ '*ESPC' :
002 C MOVE *ON ESPC :
002 C SPC,II WHEQ '*ISPC' :
002 C MOVE *ON ISPC :
002 C SPC,II WHEQ '*CSPC' :
002 C MOVE *ON CSPC :
002 C SPC,II WHEQ '*OSPC' :
002 C MOVE *ON OSPC :
E002 C END :
E001 C END :
C* :
C ENDSR :
リスト中リストマニュアル中の「変位」はDisplacementの翻訳ですが、オフセットと考えてもいいようです。仮に、(aaaaa bbbb) (cccc dddd) (eeee ffff)という値が入力されると、受け取るパラメータは以下のようになります。尚、最下段の数字は、実際には-1された数字で、戻されます。0から開始しているようです。従って、実際の桁数を取りだすためには、 実際の桁位置=変位+1 となります。また、リスト内の値は「最後の組」から、入るため、リスト1への変位は、いきなり大きな数字から始まります。
尚、上記の値は、必ず2組入ることを前提としています。コマンドで検査はしていません。(本当はするべきですが) 上の表からも分かるように、最大パラメータ長(バイト)は
となります。 E SCN 1922 1 ;
I******************************************************
I* D E F I N E D A T A - S T R U C T U R E *
I******************************************************
IDSSCN DS
I B 1 20SCNCNT
I 11922 SCN
I DS
I I 0 B 1 20OFFSET
I 1 2 OFFSEC
C******************************************************
C* DEFINITION MODULE ( PLIST FIELD KLIST ) *
C******************************************************
C *ENTRY PLIST :
C PARM DSSCN :
C******************************************************
C* M A I N - R O U T I N E
C******************************************************
C* :
C* :
C******************************************************
C* S U B - R O U T I N E
C******************************************************
C*----------------------------------------------------*
C *INZSR BEGSR :
C*----------------------------------------------------*
C Z-ADD3 STR :
C Z-ADD0 ST2 30 :
C Z-ADD0 ST3 30 :
C* :
B001 C 1 DO SCNCNT II :
001 C 2 SUBSTDSSCN:STR OFFSEC :リストへの変位取出
001 C OFFSET ADD 3 ST2 :1番目の値を取りだす。
001 C OFFSET ADD 33 ST3 :2番目の値を取りだす。
001 C 30 SUBSTDSSCN:ST2 SC,II :
001 C 30 SUBSTDSSCN:ST3 RP,II :
001 C ADD 2 STR :
E001 C END :
C* :
C ENDSR :
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
You are at K's tips-n-kicks of AS/400
|
|
|||
|
|