CL

75. QUSLFLD フィールドのリスト API

QUSLFLD はデータ・ベースのフィールド構成の一覧を表示するための API である。
フィールドの一覧を取得したい場面は数多く発生するはずであるが
そのようなときには QUSLFLD でフィールド・リストをいきなり出力することはできない。
先に紹介した QUSLRCD によってレコード様式名を検索してからレコード様式名を使って
QUSLFLD で初めてフィールドの一覧を出力することになる。
フィールドの一覧は結果をユーザー・スペースに出力されるので
QUSLFLD を実行する前には QUSCRTUS によって事前にユーザー・スペースを
QTEMP などに作成しておく必要がある。

パラメータ

必須パラメータ・グループ:

1.修飾ユーザー・スペース名入力Char(20)
2.形式名入力Char(8)
3.修飾ファイル名入力Char(20)
4.レコード様式名入力Char(10)の配列(*)
5.一時変更処理入力Char(1)

任意選択パラメータ:

6.エラー・コード入出力Char(*)

QUSLFLD は次の目的で使用することができる。

  • フィールド形式名リストを作成する。
  • QUERY のようなアプリケーションを作成する。
  • DFU のようなアプリケーションを作成する。
  • レコード・レイアウトを出力するための文書化プログラムを作成する。

修飾ユーザー・スペース名

ユーザー・スペース名 + ライブラリー名 を指定する

形式名

FLDL0100 フィールド情報

修飾ファイル名

ファイル名 + ライブラリー名

レコード様式名

入力 CHAR(10)

一時変更処理

'0' 一時変更なしを指定すること

FLDL0100 形式

オフセットタイプフィールド
10進数16進数
00CHAR(10)フィールド名
10ACHAR(1)データ・タイプ
11BCHAR(1)使用状況
12CBINARY(4)出力バッファー位置
1610BINARY(4)入力バッファー位置
2014BINARY(4)フィールドの長さ(バイト数)
2418BINARY(4)桁数
281CBINARY(4)小数点以下の桁数
3220CHAR(50)フィールド・テキストの記述
8252CHAR(2)編集コード
8454BINARY(4)編集語の長さ
8858CHAR(64)編集語
15298CHAR(20)列見出し 1
172ACCHAR(20)列見出し 2
192C0CHAR(20)列見出し 3
212D4CHAR(10)内部フィールド名
222DECHAR(30)代替フィールド名
252FCBINARY(4)代替フィールドの長さ
256100BINARY(4)DBCS 文字の数
260104CHAR(1)許容された NULL値の数
261105CHAR(1)変数フィールド標識
262106CHAR(4)日時形式
26610ACHAR(1)日時区切り記号
26710BCHAR(1)可変長さフィールド標識
26810CBINARY(4)フィールド・テキストの記述 CCSID
272110BINARY(4)フィールド・データ CCSID
276114BINARY(4)フィールド列見出し CCSID
280118BINARY(4)フィールド編集語 CCSID
28411CBINARY(4)UCS-2 表示フィールド長

これはデータ・ベース QTRFIL/SHOHIN のフィールド一覧を検索するプログラムである。

0001.00              PGM                                                                
0002.00 /*---------------------------------------------------------*/                   
0003.00 /*   QUSLFLD   :  フィールドの一覧表                       */                   
0004.00 /*                                                         */                   
0005.00 /*     QUSLFLD のサンプル                                  */                   
0006.00 /*                                                         */                   
0007.00 /*---------------------------------------------------------*/                   
0008.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                           
0009.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                          
0010.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                          
0011.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                          
0012.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) +                     
0013.00                           VALUE('*LIBL     ')                                   
0014.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                       
0015.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +                     
0016.00                           VALUE(X'000074') /* 2 進数  */                        
0017.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +                       
0018.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +             
0019.00                           125 */                                                
0020.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +                       
0021.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */         
0022.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +                      
0023.00                           VALUE(X'0000000000000000')                            
0024.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +                 
0025.00                           2 進数 オフセット */                                    
0026.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +                 
0027.00                           2 進数項目数  */                                   
0028.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +                 
0029.00                           2 進数リストサイズ  */                             
0030.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */           
0031.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */          
0032.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */           
0033.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */      
0034.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(545) /* +               
0035.00                            受取データ  */                                    
0036.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                     
0037.00                           VALUE(X'00000000')                                 
0038.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))              
0039.00                                                                              
0040.00              RTVJOBA    TYPE(&TYPE)                                          
0041.00 /*( ユーザー・スペースの作成 )*/                                             
0042.00              CALL       PGM(QUSCRTUS) PARM('USLFLD    QTEMP     ' +          
0043.00                           'PF        ' 1000 ' ' '*ALL      ' +               
0044.00                           'QUSLFLD 用ユーザー・スペース ' +                  
0045.00                           '*YES      ' &APIERR)                              
0046.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)          
0047.00              GOTO       APIERR                                               
0048.00              ENDDO                                                        
0049.00                                                                           
0050.00 /*( QUSLFLD の実行 )*/                                                    
0051.00              CALL       PGM(QUSLFLD) PARM('USLFLD    QTEMP     ' +        
0052.00                           'FLDL0100' 'SHOHIN    QTRFIL    ' +             
0053.00                           'SHOHINR   ' '0' &APIERR)                       
0054.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)       
0055.00              GOTO       APIERR                                            
0056.00              ENDDO                                                        
0057.00                                                                           
0058.00   /*( リストデータ・セクションのオフセット値を検索 )*/                    
0059.00              CALL       PGM(QUSRTVUS) PARM('USLFLD    QTEMP     ' +       
0060.00                           &STRPOS &LENDTA &RCVVAR)                        
0061.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))             
0062.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))             
0063.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))            
0064.00                                                                           
0065.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/                 
0066.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)                       
0067.00              CHGVAR     VAR(&DEC08) VALUE(%BIN(&STRPOS))                  
0068.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + 1)                     
0069.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                  
0070.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)                       
0071.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))                 
0072.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))                        
0073.00 NXTRTV:                                                                         
0074.00              CALL       PGM(QUSRTVUS) PARM('USLFLD    QTEMP     ' +             
0075.00                           &STRPOS &LENDTA &RCVDTA)                              
0076.00              /*( 処理の開始 )*/                                                 
0077.00              SNDPGMMSG  MSG('FLD=' *CAT %SST(&RCVDTA 1 10)) +                   
0078.00                           MSGTYPE(*DIAG)                                        
0079.00                                                                                 
0080.00              /*( 処理の終了 )*/                                                 
0081.00              IF         COND(&N < &NOENT) THEN(DO)                              
0082.00              CHGVAR     VAR(&N) VALUE(&N + 1)                                   
0083.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))                       
0084.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)                     
0085.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                        
0086.00              GOTO       NXTRTV                                                  
0087.00              ENDDO                                                              
0088.00              RETURN                                                             
0089.00                                                                                 
0090.00  APIERR:                                                                        
0091.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))                    
0092.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                          
0093.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))                
0094.00              RTVMSG     MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +           
0095.00                           MSG(&MSG)                                             
0096.00              GOTO       SNDMSG                                              
0097.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +                 
0098.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +       
0099.00                           MSGFLIB(&MSGFLIB)                                 
0100.00  SNDMSG:                                                                    
0101.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */         
0102.00              IF         COND(&MSGID *EQ ' ') THEN(DO)                       
0103.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)            
0104.00              ENDDO                                                          
0105.00              ELSE       CMD(DO)                                             
0106.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +                
0107.00                           MSGDTA(&MSGDTA) TOMSGQ(*SYSOPR) +                 
0108.00                           MSGTYPE(*COMP)                                    
0109.00              ENDDO                                                          
0110.00              ENDDO      /*  バッチ  */                                      
0111.00              ELSE       CMD(DO) /*  対話型  */                              
0112.00              IF         COND(&MSGID *EQ ' ') THEN(DO)                       
0113.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +         
0114.00                           TOMSGQ(*TOPGMQ) MSGTYPE(*ESCAPE)                  
0115.00              ENDDO                                                          
0116.00              ELSE       CMD(DO)                                             
0117.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +                
0118.00                           MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +                 
0119.00                           MSGTYPE(*ESCAPE)                                  
0120.00              ENDDO                                
0121.00              ENDDO      /*  対話型  */            
0122.00              ENDPGM                                                         
【実行結果】
【解説】

最初に準備としてユーザー・スペース: QTEMP/USLFLD

0041.00 /*( ユーザー・スペースの作成 )*/                                             
0042.00              CALL       PGM(QUSCRTUS) PARM('USLFLD    QTEMP     ' +          
0043.00                           'PF        ' 1000 ' ' '*ALL      ' +               
0044.00                           'QUSLFLD 用ユーザー・スペース ' +                  
0045.00                           '*YES      ' &APIERR)                              

によって作成しておいてから

0050.00 /*( QUSLFLD の実行 )*/                                                    
0051.00              CALL       PGM(QUSLFLD) PARM('USLFLD    QTEMP     ' +        
0052.00                           'FLDL0100' 'SHOHIN    QTRFIL    ' +             
0053.00                           'SHOHINR   ' '0' &APIERR)                       

によって QTRFIL/SHOHIN のフィールド一覧をユーザー・スペース: QTEMP/USLFLD に出力する。

次に

0058.00   /*( リストデータ・セクションのオフセット値を検索 )*/                    
0059.00              CALL       PGM(QUSRTVUS) PARM('USLFLD    QTEMP     ' +       
0060.00                           &STRPOS &LENDTA &RCVVAR)                        
0061.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))             
0062.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))             
0063.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))            

によって開始オフセット &OFFSET と一項目の長さ &LSTSIZ を読み取って

0073.00 NXTRTV:                                                                         
0074.00              CALL       PGM(QUSRTVUS) PARM('USLFLD    QTEMP     ' +             
0075.00                           &STRPOS &LENDTA &RCVDTA)                              
0076.00              /*( 処理の開始 )*/                                                 
                           :
                           :                                                                      
0080.00              /*( 処理の終了 )*/                                                 
0081.00              IF         COND(&N < &NOENT) THEN(DO)                              
0082.00              CHGVAR     VAR(&N) VALUE(&N + 1)                                   
0083.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))                       
0084.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)                     
0085.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                        
0086.00              GOTO       NXTRTV                                                  
0087.00              ENDDO                                                              

によって LOOP してフィールドのリストを読み取っている。