C400

95. 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 #include <stdio.h>                                                             
0002.00 #include <stdlib.h>                                                            
0003.00 #include <string.h>                                                            
0004.00 #include <QUSCRTUS.h>                                                          
0005.00 #include <QUSLRCD.h>                                                           
0006.00 #include <QUSLFLD.h>                                                           
0007.00 #include <QUSRTVUS.h>                                                          
0008.00 #include <decimal.h>                                                           
0009.00 #include <signal.h>                                                            
0010.00 #include <errno.h>                                                             
0011.00                                                                                
0012.00 #define TRUE         0                                                         
0013.00 #define FALSE       -1                                                         
0014.00                                                                                
0015.00 typedef struct {                                                               
0016.00    char NM[10];                                                                
0017.00    char LIB[10];                                                               
0018.00 } QNAME;     /* Define the qualified name                            */        
0019.00 QNAME         inname;                  /*  Qualified user space name */        
0020.00 typedef struct {                                                               
0021.00    int  BYTESPRO;                                                              
0022.00    int  BYTESAVL;                                                              
0023.00    char EXCPID[7];                                                             
0024.00    char RESRVD;                                                             
0025.00    char EXCPDATA[100];                                                      
0026.00 } ERRSTRUCTURE;     /* Define the error return structure            */      
0027.00 ERRSTRUCTURE  errcode;                 /* Error Code Structure       */     
0028.00   volatile _INTRPT_Hndlr_Parms_T ca;                                        
0029.00                                                                             
0030.00 void main(void){                                                            
0031.00 char          extattrib[10];           /*  External attributes       */     
0032.00 long int      initialsize;                                                  
0033.00 char          initialvalue;                                                 
0034.00 char          authority[10];                                                
0035.00 char          description[50];                                              
0036.00 char          replace[10], reffillib[21], RECORD[11], buff[51];             
0037.00   typedef struct {                                                          
0038.00     char fldnam[10];                                                        
0039.00     char fldtyp[1];                                                         
0040.00     int  input;                                                             
0041.00     int  fldbyte;                                                           
0042.00     int  fldlen;                                                            
0043.00     int  flddec;                                                            
0044.00     char colhdg1[20];                                                       
0045.00     char colhdg2[20];                                                       
0046.00     char colhdg3[20];                                                       
0047.00     char fldtxt[50];                                                        
0048.00   } FLDBUF;                                          
0049.00   FLDBUF fldbuf[2048];                               
0050.00   int  fldsu = 0, offset, size, i;                   
0051.00 typedef _Packed struct header_struct {               
0052.00      char user_data[64];                             
0053.00      int  generic_header_size;                       
0054.00      char header_version[4];                         
0055.00      char format_name[8];                            
0056.00      char program_name[10];                          
0057.00      char time_generated[13];                        
0058.00      char information_status;                        
0059.00      int  usrspc_used;                               
0060.00      int  parm_section_offset;                       
0061.00      int  parm_section_size;                         
0062.00      int  header_section_offset;                     
0063.00      int  header_section_size;                       
0064.00      int  list_section_offset;                       
0065.00      int  list_section_size;                         
0066.00      int  number_of_entries;                         
0067.00      int  size_of_entry;                             
0068.00 } header_struct;                                     
0069.00 header_struct inspace;                               
0070.00     Qdb_Lfld_FLDL0100_t FLDL0100;                    
0071.00                                                      
0072.00     printf("** TESTUSLFLD: フィールド一覧表 **\n");                       
0073.00     getchar();                                                            
0074.00     /*(1) ユーザー・スペースを作成 */                                     
0075.00      errcode.BYTESPRO = errcode.BYTESAVL = 0;                             
0076.00      memset(&inname, 0, sizeof(QNAME));                                   
0077.00      memcpy(inname.NM, "QUSLFLD   ", 10);                                 
0078.00      memcpy(inname.LIB, "QTEMP     ", sizeof(inname.LIB));                
0079.00      initialsize = 1000;                                                  
0080.00      initialvalue = '\0';                                                 
0081.00      memcpy(authority, "*ALL      ", sizeof(authority));                  
0082.00      memset(description, ' ', sizeof(description));                       
0083.00      memcpy(replace, "*YES      ", sizeof(replace));                      
0084.00      memcpy(extattrib, "PF        ", sizeof(extattrib));                  
0085.00     QUSCRTUS((char *)(&inname), extattrib, initialsize,                   
0086.00               &initialvalue, authority, description, replace,             
0087.00              (char *)(&errcode));                                         
0088.00                                                                           
0089.00     /*(2) フィールド一覧を作成 */                                         
0090.00     strcpy(reffillib, "SHOHIN    QTRFIL    ");                            
0091.00     strcpy(RECORD, "SHOHINR   ");                                         
0092.00     QUSLFLD("QUSLFLD   QTEMP     ", "FLDL0100", reffillib, RECORD,        
0093.00          "1", (char *)(&errcode));                                        
0094.00     QUSRTVUS("QUSLFLD   QTEMP     ",0x01,sizeof(inspace),&inspace,        
0095.00         (char*)&errcode);                                                 
0096.00      offset = inspace.list_section_offset +1;                                   
0097.00      size   = inspace.size_of_entry;                                            
0098.00      for(i = 0; i<inspace.number_of_entries; i++){/*for-loop*/                  
0099.00        QUSRTVUS("QUSLFLD   QTEMP     ", offset, size, (char*)&FLDL0100,         
0100.00           (char*)&errcode);                                                     
0101.00        /*--------------( 処理の開始 )-----------------*/                        
0102.00        fldsu ++;                                                                
0103.00        memcpy(fldbuf[i].fldnam, FLDL0100.Field_Name, 10);                       
0104.00        memcpy(buff, fldbuf[i].fldnam, 10);                                      
0105.00        buff[10] = 0x00;                                                         
0106.00        printf("[%d] fldname = %s\n", fldsu, buff);                              
0107.00        fldbuf[i].fldtyp[0] = FLDL0100.Data_Type;                                
0108.00        fldbuf[i].input     = FLDL0100.Input_Buffer_Position;                    
0109.00        fldbuf[i].fldbyte   = FLDL0100.Field_Length_Bytes;                       
0110.00        if(FLDL0100.Digits != 0)                                                 
0111.00          fldbuf[i].fldlen    = FLDL0100.Digits;                                 
0112.00        else fldbuf[i].fldlen = FLDL0100.Field_Length_Bytes;                     
0113.00        fldbuf[i].flddec    = FLDL0100.Decimal_Positions;                        
0114.00        memcpy(fldbuf[i].colhdg1, FLDL0100.Column_Heading1, 20);                 
0115.00        memcpy(fldbuf[i].colhdg2, FLDL0100.Column_Heading2, 20);                 
0116.00        memcpy(fldbuf[i].colhdg3, FLDL0100.Column_Heading3, 20);                 
0117.00        memcpy(fldbuf[i].fldtxt,  FLDL0100.Field_Text_Description, 50);          
0118.00        /*--------------( 処理の終了 )-----------------*/                        
0119.00        offset += inspace.size_of_entry;                                         
0120.00      }/*for-loop*/                                                
0121.00      printf("=> %d 個のフィールドが見つかりました。 \n", fldsu);  
0122.00      getchar();                                                   
0123.00 }
【実行結果】
【解説】

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

0085.00     QUSCRTUS((char *)(&inname), extattrib, initialsize,                   
0086.00               &initialvalue, authority, description, replace,             
0087.00              (char *)(&errcode));

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

0092.00     QUSLFLD("QUSLFLD   QTEMP     ", "FLDL0100", reffillib, RECORD,        
0093.00          "1", (char *)(&errcode));

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

次に

0094.00     QUSRTVUS("QUSLFLD   QTEMP     ",0x01,sizeof(inspace),&inspace,        
0095.00         (char*)&errcode);

によって開始オフセット offset と一項目の長さ inspace.size_of_entry を読み取って

0098.00      for(i = 0; i<inspace.number_of_entries; i++){/*for-loop*/                  
0099.00        QUSRTVUS("QUSLFLD   QTEMP     ", offset, size, (char*)&FLDL0100,         
0100.00           (char*)&errcode);                                                     
0101.00        /*--------------( 処理の開始 )-----------------*/ 
                                    :
                                    :
0118.00        /*--------------( 処理の終了 )-----------------*/                        
0119.00        offset += inspace.size_of_entry;                                         
0120.00      }/*for-loop*/

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