最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

9.26.コマンド定義のリスト項目

[ Previous ] [ HOME ] [ Upper ] [ Next ]


AS/400 アドバンスト・シリーズCL(制御言語)プログラミングバージョン 3 9.0 第9章 コマンドの定義より

単純リスト(Simple List)

CL または HLL を使ってコマンドを実行すると、単純リスト内の要素は以下の形式でコマンド処理プログラムに渡されます。

渡される値の数は、長さが 2 桁(バイト)の 2 進数値で指定されます。この値は、実際に入力された値の数(つまり、渡される値の数)を示すものであり、指定可能な値の数ではありません。

渡される値の数 . . .

リスト中リスト (List within List)

CL または HLL を使用するコマンドを実行すると、リスト内リストは以下の形式でコマンド処理プログラムに渡されます。

リストの数は、2 桁の 2 進数値として渡されます。リストの数に続いて、各リストへの変位を示す値が渡されます(リストに入力された値ではありません)。各変位は、LISTDSPL パラメーターの値に従って、4 桁 または 2 桁の 2 進数値として渡されます。

リストの数 リスト 1への変位 リスト 2への変位 リスト nへの変位 ... 値の数 値の数 ...

リストの数は、2 桁の 2 進数値として渡されます。リストの数に続いて、各リストへの変位を示す値が渡されます(リストに入力された値ではありません)。各変位は、LISTDSPL パラメーターの値に従って、4 桁 または 2 桁の 2 進数値として渡されます。

ユーザーコマンドを作る場合、面倒なのは、データの繰り返し指定。「リスト」と呼ばれるものです。マニュアルは、説明だけで、画面で表示されるコマンドの形態を見せてくれません。

リストには、

単純リスト Simple List

単純リストは、パラメーターにより指定されたタイプの 1 つまたは複数の値を受け入れることができます。

混合リスト Mixed List

混合リストは、個別に定義された一連の値を受け入れるもので、それぞれの値は、通常意味もタイプも異なり、リスト内で一定の位置を占めています。

リスト中リスト List within List

リスト内リストとは、次のようなリストのことです。 1 つのパラメーターに対し複数回指定することのできるリスト(単純リストまたは混合リスト)混合リスト内の 1 つの値として指定することのできるリスト

の3種類があります。

下の図で、キーワードSTRINGは混合リストを使った「リスト中リスト(List within List)」、となり、キーワードSPCTYPEは、単純リスト(Simple List)となります。

rplsrcpmp.gif (12246 バイト)

             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に指定された内容は、下のようにプログラムに渡されます。

指定されたリスト項目の数 リスト1 リスト2 リスト3
2バイト binary 5バイト文字 5バイト文字 5バイト文字
0003 *FSPC *ESPC *ISPC

これは、簡単です。最初の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への変位は、いきなり大きな数字から始まります。

001 002 003 004 005 006 007 008 009 010 011 ...... 040 041 ... 070 071 072 073 ... 102 103 ... 132 133 134 135 ... 164 165 ... 194
リストの数 リスト 1への変位 リスト 2への変位 リスト 3への変位 リスト3 リスト2 リスト1
リスト3の値の数 リスト3値1 リスト3値2 リスト2の値の数 リスト2値1 リスト2値2 リスト1の値の数 リスト1値1 リスト1値2
2バイト binary 2or4バイトbinary 2or4バイトbinary 2or4バイトbinary 2バイトbinary 30バイト文字 30バイト文字 2バイトbinary 30バイト文字 30バイト文字 2バイトbinary 30バイト文字 30バイト文字
0003 0132
(+1)
0070
(+1)
0008
(+1)
0002 eeee ffff 0002 ccccc ddddd 0002 aaaaa bbbbb

尚、上記の値は、必ず2組入ることを前提としています。コマンドで検査はしていません。(本当はするべきですが)

上の表からも分かるように、最大パラメータ長(バイト)は

= 2 + (最大リスト数 * 2 (または4;ここでは2バイト)) + (リストの値2バイト + リストの値の総長さ ) * リスト数 

= 2 + (30 * 2 ) + (2 + 30 + 30) * 30

= 2 + 60 + 1860

= 1922

となります。

     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                           :           

[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送