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