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進数
0 0 CHAR(10) フィールド名
10 A CHAR(1) データ・タイプ
11 B CHAR(1) 使用状況
12 C BINARY(4) 出力バッファー位置
16 10 BINARY(4) 入力バッファー位置
20 14 BINARY(4) フィールドの長さ(バイト数)
24 18 BINARY(4) 桁数
28 1C BINARY(4) 小数点以下の桁数
32 20 CHAR(50) フィールド・テキストの記述
82 52 CHAR(2) 編集コード
84 54 BINARY(4) 編集語の長さ
88 58 CHAR(64) 編集語
152 98 CHAR(20) 列見出し 1
172 AC CHAR(20) 列見出し 2
192 C0 CHAR(20) 列見出し 3
212 D4 CHAR(10) 内部フィールド名
222 DE CHAR(30) 代替フィールド名
252 FC BINARY(4) 代替フィールドの長さ
256 100 BINARY(4) DBCS 文字の数
260 104 CHAR(1) 許容された NULL値の数
261 105 CHAR(1) 変数フィールド標識
262 106 CHAR(4) 日時形式
266 10A CHAR(1) 日時区切り記号
267 10B CHAR(1) 可変長さフィールド標識
268 10C BINARY(4) フィールド・テキストの記述 CCSID
272 110 BINARY(4) フィールド・データ CCSID
276 114 BINARY(4) フィールド列見出し CCSID
280 118 BINARY(4) フィールド編集語 CCSID
284 11C BINARY(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 してフィールドのリストを読み取っている。