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