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進数
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 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 してフィールドのリストを読み取っている。