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