C/400

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