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 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* QUSLFLD : フィールドの一覧表 */ 0004.00 /* */ 0005.00 /* QUSLFLD のサンプル */ 0006.00 /* */ 0007.00 /*---------------------------------------------------------*/ 0008.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0009.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0010.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0011.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0012.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) + 0013.00 VALUE('*LIBL ') 0014.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0015.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0016.00 VALUE(X'000074') /* 2 進数 */ 0017.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) + 0018.00 VALUE(X'0000007D') /* 2 進数開始位置 : + 0019.00 125 */ 0020.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) + 0021.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */ 0022.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) + 0023.00 VALUE(X'0000000000000000') 0024.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* + 0025.00 2 進数 オフセット */ 0026.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* + 0027.00 2 進数項目数 */ 0028.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* + 0029.00 2 進数リストサイズ */ 0030.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */ 0031.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */ 0032.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */ 0033.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ 0034.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(545) /* + 0035.00 受取データ */ 0036.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0037.00 VALUE(X'00000000') 0038.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0039.00 0040.00 RTVJOBA TYPE(&TYPE) 0041.00 /*( ユーザー・スペースの作成 )*/ 0042.00 CALL PGM(QUSCRTUS) PARM('USLFLD QTEMP ' + 0043.00 'PF ' 1000 ' ' '*ALL ' + 0044.00 'QUSLFLD 用ユーザー・スペース ' + 0045.00 '*YES ' &APIERR) 0046.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0047.00 GOTO APIERR 0048.00 ENDDO 0049.00 0050.00 /*( QUSLFLD の実行 )*/ 0051.00 CALL PGM(QUSLFLD) PARM('USLFLD QTEMP ' + 0052.00 'FLDL0100' 'SHOHIN QTRFIL ' + 0053.00 'SHOHINR ' '0' &APIERR) 0054.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0055.00 GOTO APIERR 0056.00 ENDDO 0057.00 0058.00 /*( リストデータ・セクションのオフセット値を検索 )*/ 0059.00 CALL PGM(QUSRTVUS) PARM('USLFLD QTEMP ' + 0060.00 &STRPOS &LENDTA &RCVVAR) 0061.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4)) 0062.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4)) 0063.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4)) 0064.00 0065.00 /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/ 0066.00 CHGVAR VAR(&STRPOS) VALUE(&OFFSET) 0067.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0068.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1) 0069.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0070.00 CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ) 0071.00 CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA)) 0072.00 CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR)) 0073.00 NXTRTV: 0074.00 CALL PGM(QUSRTVUS) PARM('USLFLD QTEMP ' + 0075.00 &STRPOS &LENDTA &RCVDTA) 0076.00 /*( 処理の開始 )*/ 0077.00 SNDPGMMSG MSG('FLD=' *CAT %SST(&RCVDTA 1 10)) + 0078.00 MSGTYPE(*DIAG) 0079.00 0080.00 /*( 処理の終了 )*/ 0081.00 IF COND(&N < &NOENT) THEN(DO) 0082.00 CHGVAR VAR(&N) VALUE(&N + 1) 0083.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0084.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN) 0085.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0086.00 GOTO NXTRTV 0087.00 ENDDO 0088.00 RETURN 0089.00 0090.00 APIERR: 0091.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0092.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0093.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0094.00 RTVMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 0095.00 MSG(&MSG) 0096.00 GOTO SNDMSG 0097.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0098.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0099.00 MSGFLIB(&MSGFLIB) 0100.00 SNDMSG: 0101.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0102.00 IF COND(&MSGID *EQ ' ') THEN(DO) 0103.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP) 0104.00 ENDDO 0105.00 ELSE CMD(DO) 0106.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0107.00 MSGDTA(&MSGDTA) TOMSGQ(*SYSOPR) + 0108.00 MSGTYPE(*COMP) 0109.00 ENDDO 0110.00 ENDDO /* バッチ */ 0111.00 ELSE CMD(DO) /* 対話型 */ 0112.00 IF COND(&MSGID *EQ ' ') THEN(DO) 0113.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0114.00 TOMSGQ(*TOPGMQ) MSGTYPE(*ESCAPE) 0115.00 ENDDO 0116.00 ELSE CMD(DO) 0117.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0118.00 MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) + 0119.00 MSGTYPE(*ESCAPE) 0120.00 ENDDO 0121.00 ENDDO /* 対話型 */ 0122.00 ENDPGM
【実行結果】
【解説】
最初に準備としてユーザー・スペース: QTEMP/USLFLD を
0041.00 /*( ユーザー・スペースの作成 )*/ 0042.00 CALL PGM(QUSCRTUS) PARM('USLFLD QTEMP ' + 0043.00 'PF ' 1000 ' ' '*ALL ' + 0044.00 'QUSLFLD 用ユーザー・スペース ' + 0045.00 '*YES ' &APIERR)
によって作成しておいてから
0050.00 /*( QUSLFLD の実行 )*/ 0051.00 CALL PGM(QUSLFLD) PARM('USLFLD QTEMP ' + 0052.00 'FLDL0100' 'SHOHIN QTRFIL ' + 0053.00 'SHOHINR ' '0' &APIERR)
によって QTRFIL/SHOHIN のフィールド一覧をユーザー・スペース: QTEMP/USLFLD に出力する。
次に
0058.00 /*( リストデータ・セクションのオフセット値を検索 )*/ 0059.00 CALL PGM(QUSRTVUS) PARM('USLFLD QTEMP ' + 0060.00 &STRPOS &LENDTA &RCVVAR) 0061.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4)) 0062.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4)) 0063.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))
によって開始オフセット &OFFSET と一項目の長さ&LSTSIZ を読み取って
0073.00 NXTRTV: 0074.00 CALL PGM(QUSRTVUS) PARM('USLFLD QTEMP ' + 0075.00 &STRPOS &LENDTA &RCVDTA) 0076.00 /*( 処理の開始 )*/ : : 0080.00 /*( 処理の終了 )*/ 0081.00 IF COND(&N < &NOENT) THEN(DO) 0082.00 CHGVAR VAR(&N) VALUE(&N + 1) 0083.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0084.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN) 0085.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0086.00 GOTO NXTRTV 0087.00 ENDDO
によって LOOP してフィールドのリストを読み取っている。