RPG

197. 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 H DFTNAME(QUSLFLD) DATEDIT(*YMD/)                                      
0002.00 F******** QUSLFLD: フィールド一覧のテスト *****************************
0003.00 F*                                                                     
0004.00 F*****************************************************************     
0005.00  /COPY QSYSINC/QRPGLESRC,QUS                                           
0006.00  /COPY QSYSINC/QRPGLESRC,QUSLFLD                                       
0007.00                                                                        
0008.00 D FILFILLIB       S             20A   INZ('SHOHIN    QTRFIL    ')      
0009.00                                                                        
0010.00 D APIERR          DS                                                   
0011.00 D  GETBYT                 1      4B 0 INZ(160)                         
0012.00 D  AVLBYT                 5      8B 0 INZ(0)                           
0013.00 D  MSGID                  9     15                                     
0014.00 D  MSGDTA                17    160                                     
0015.00                                                                        
0016.00 D USRSPC          DS                                                   
0017.00 D  USNAME                       10A   INZ('QUSLFLD   ')                
0018.00 D  USLIB                        10A   INZ('QTEMP     ')                
0019.00                                                                        
0020.00 D MSGFFLIB        DS                                                   
0021.00 D  MSGF                         10A   INZ('QCPFMSG   ')                
0022.00 D  MSGFLIB                      10A   INZ('QSYS      ')                
0023.00                                                                        
0024.00 D HEDSTR          DS           256                                     
0025.00 D  OFFSET                 1      4B 0                                  
0026.00 D  NOENTR                 9     12B 0                                  
0027.00 D  LSTSIZ                13     16B 0                                  
0028.00                                                                        
0029.00 D SPCBIN          DS                                                   
0030.00 D  INZSIZ                       10I 0 INZ(1000)                        
0031.00 D  MSGDTALEN                    10I 0 INZ(100)                         
0032.00 D  PGMSTKCNT                    10I 0 INZ(1)                           
0033.00 D  STRPOS                       10I 0                                  
0034.00 D  LENDTA                       10I 0                                  
0035.00 D  N                             4S 0                                  
0036.00                                                                        
0037.00 C*(1) QUSCRTUS: ユーザー・スペースの作成                               
0038.00 C*----------------------------------------------------+                
0039.00 C                   CALL      'QUSCRTUS'                               
0040.00 C                   PARM                    USRSPC                     
0041.00 C                   PARM      'PF        '  EXATTR           10        
0042.00 C                   PARM                    INZSIZ                     
0043.00 C                   PARM      ' '           INZCHR            1        
0044.00 C                   PARM      '*ALL      '  AUT              10        
0045.00 C                   PARM                    TEXT             50        
0046.00 C                   PARM      '*YES      '  REPLACE          10        
0047.00 C                   PARM                    APIERR                     
0048.00 C*----------------------------------------------------+                
0049.00 C     AVLBYT        CABNE     *ZEROS        SNDERR                     
0050.00                                                                        
0051.00 C*(2) QUSLFLD: フィールド一覧                                          
0052.00 C*----------------------------------------------------+                
0053.00 C                   CALL      QUSLFLD                                  
0054.00 C                   PARM                    USRSPC                     
0055.00 C                   PARM      'FLDL0100'    FOTMAT            8        
0056.00 C                   PARM                    FILFILLIB                  
0057.00 C                   PARM      'SHOHINR   '  RECORD           10        
0058.00 C                   PARM      '0'           TEMP              1        
0059.00 C                   PARM                    APIERR                     
0060.00 C*----------------------------------------------------+                
0061.00 C     AVLBYT        CABNE     *ZEROS        SNDERR                     
0062.00                                                                        
0063.00 C*(3) QUSRTVUS : ヘッダー構造の読み取り                                
0064.00 C*----------------------------------------------------+                
0065.00 C                   CALL      'QUSRTVUS'                               
0066.00 C                   PARM                    USRSPC                     
0067.00 C                   PARM      125           STRPOS                         |
0068.00 C                   PARM      16            LENDTA                         |
0069.00 C                   PARM                    HEDSTR                     
0070.00 C                   PARM                    APIERR                     
0071.00 C*----------------------------------------------------+                
072.00 C     AVLBYT        CABNE     *ZEROS        SNDERR                                   
073.00                                                                                      
074.00 C*(4) QUSRTVUS : リスト・セクションの読み取り                                        
075.00 C*    HEADER によって OFFSET,LSTSIZ を受取った                                       
076.00 C                   Z-ADD     OFFSET        STRPOS                                   
077.00 C                   ADD       1             STRPOS                                   
078.00 C                   Z-ADD     LSTSIZ        LENDTA                                   
079.00 C*     リスト・サイズの分だけ LOOP して検索                                          
080.00 C     1             DO        NOENTR        N                              N=1-NOENTR
081.00 C*----------------------------------------------------+                              
082.00 C                   CALL      'QUSRTVUS'                           99      |         
083.00 C                   PARM                    USRSPC                         |         
084.00 C                   PARM                    STRPOS                         |         
085.00 C                   PARM                    LENDTA                         |         
086.00 C                   PARM                    QUSL0100                       |         
087.00 C*----------------------------------------------------+                              
088.00 C*      ------( 処理の開始 - ここから )------                                        
089.00 C     'FLD='        CAT(P)    QUSFN02:0     DSP40            40                      
090.00 C     DSP40         DSPLY                                                            
091.00 C*      ------( 処理の終了 - ここまで )------                                        
092.00 C                   ADD       LENDTA        STRPOS                                   
093.00 C                   END                                                    N=1-NOENTR
094.00                                                                                      
095.00 C                   MOVE      *ON           *INLR                                    
0096.00 C     '** END **'   DSPLY                   ANS               1             
0097.00 C                   RETURN                                                  
0098.00 C     SNDERR        TAG                                                     
0099.00 C     GETBYT        SUB       15            MSGDTALEN                       
0100.00 C*----------------------------------------------------+                     
0101.00 C                   CALL(E)   'QMHSNDPM'                                    
0102.00 C                   PARM                    MSGID                          |
0103.00 C                   PARM                    MSGFFLIB                       |
0104.00 C                   PARM                    MSGDTA                         |
0105.00 C                   PARM                    MSGDTALEN                      |
0106.00 C                   PARM      '*ESCAPE   '  MSGTYPE          10            |
0107.00 C                   PARM      '*         '  PGMQUE           10            |
0108.00 C                   PARM                    PGMSTKCNT                      |
0109.00 C                   PARM      '    '        MSGKEY            4            |
0110.00 C                   PARM                    APIERR                          
0111.00 C*----------------------------------------------------+                     
0112.00 C                   MOVE      *ON           *INLR                           
0113.00 C                   RETURN                                                  

【コンパイル】
CRTBNDRPG PGM(MYLIB/QUSLFLD) SRCFILE(MYSRCLOIB/QRPGLESRC) AUT(*ALL)

【実行結果】
【解説】

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

0037.00 C*(1) QUSCRTUS: ユーザー・スペースの作成                       
0038.00 C*----------------------------------------------------+        
0039.00 C                   CALL      'QUSCRTUS'                       
0040.00 C                   PARM                    USRSPC             
0041.00 C                   PARM      'PF        '  EXATTR           10
0042.00 C                   PARM                    INZSIZ             
0043.00 C                   PARM      ' '           INZCHR            1
0044.00 C                   PARM      '*ALL      '  AUT              10
0045.00 C                   PARM                    TEXT             50
0046.00 C                   PARM      '*YES      '  REPLACE          10
0047.00 C                   PARM                    APIERR             
0048.00 C*----------------------------------------------------+        

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

0051.00 C*(2) QUSLFLD: フィールド一覧                                  
0052.00 C*----------------------------------------------------+        
0053.00 C                   CALL      QUSLFLD                          
0054.00 C                   PARM                    USRSPC             
0055.00 C                   PARM      'FLDL0100'    FOTMAT            8
0056.00 C                   PARM                    FILFILLIB          
0057.00 C                   PARM      'SHOHINR   '  RECORD           10
0058.00 C                   PARM      '0'           TEMP              1
0059.00 C                   PARM                    APIERR             
0060.00 C*----------------------------------------------------+        

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

次に

0063.00 C*(3) QUSRTVUS : ヘッダー構造の読み取り                                     
0064.00 C*----------------------------------------------------+                     
0065.00 C                   CALL      'QUSRTVUS'                                    
0066.00 C                   PARM                    USRSPC                          
0067.00 C                   PARM      125           STRPOS                         |
0068.00 C                   PARM      16            LENDTA                         |
0069.00 C                   PARM                    HEDSTR                          
0070.00 C                   PARM                    APIERR                          
0071.00 C*----------------------------------------------------+                     

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

079.00 C*     リスト・サイズの分だけ LOOP して検索                                          
080.00 C     1             DO        NOENTR        N                              N=1-NOENTR
081.00 C*----------------------------------------------------+                              
082.00 C                   CALL      'QUSRTVUS'                           99      |         
083.00 C                   PARM                    USRSPC                         |         
084.00 C                   PARM                    STRPOS                         |         
085.00 C                   PARM                    LENDTA                         |         
086.00 C                   PARM                    QUSL0100                       |         
087.00 C*----------------------------------------------------+                              
088.00 C*      ------( 処理の開始 - ここから )------    
                            :
                            :
091.00 C*      ------( 処理の終了 - ここまで )------
092.00 C                   ADD       LENDTA        STRPOS
093.00 C                   END

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