1998/7/4
ここでは、訪問者の方が、送ってくださったスプールコピーのコマンドをご紹介いたします。作者の方からは、フリーソフトで、とのことでしたので、ダウンロードコーナーでも、アップさせていただきます。以下は、その方からのメールをHTMLにそのまま変換したものです。貴重な情報ありがとうございます。また、しっかりした解説や、パネルグループの作成など、完成度の高いコマンドと思います。これからもよろしくお願いします。
[2000-8-3] 追記:IBM
AS/400 Support Line Technical Document : このページの中で、各行の マークをクリックすると、記事が広がります。コマンドのsavfもあるようです。
利用既定
コマンド名 |
CRTDUPSPL |
サイズ |
32 KB |
ダウンロード |
@crtdupspl.lzh
|
解凍後のファイル名 |
@crtdupspl.savf |
DSPSAVFの結果
保管されたオブジェクトの表示−保管ファイル
保管された ライブラリー. : @CRTDUPSPL リリース・レベル . : V4R5M0
ASP . . . . . . . . : 1 データの圧縮 . . . : YES
保管ファイル . . . : @CRTDUPSPL 表示された オブジェクト : 6
ライブラリー . . : FTP 保管された OBJ 数 . : 7
レコード . . . . . : 169 アクセス・パス . . : 0
保管コマンド . . . : SAVLIB
活動時保管 . . . . : *NO
保管日/時刻 . . . : 04/06/25 12:28:34
OPT オブジェクト タイプ 属性 所有者 サイズ データ
@CRTDUPSPL *LIB PROD QPGMR 73728 YES
CRTDUPINST *PGM CLP QPGMR 40960 YES
CRTDUPSPLC *PGM CLP QPGMR 49152 YES
CRTDUPSPL *CMD QPGMR 4096 YES
AAALIB *PNLGRP QPGMR 8192 YES
CRTDUPSPLU *PNLGRP QPGMR 8192 YES
SRC *FILE PF QPGMR 98304 YES
非公開APIの QSPGETF と QSPPUTF
を使用し、スプール・ファイルの 複写を行います。
注 : ライブラリー QTEMP に内部処理用としてファイル
ZSPLWRK が 作成されます。
>>-CRTDUPSPL---FILE(- スプール・ファイル名 -)--------------------------> >--+------------------------------------------------+---------------->
| |
| +- * --------------------------------+ |
+--JOB(-+- 番号 / -- USER 名 / -- JOB 名 -+-)-+ >--+-------------------------+--------------------------------------->
| |
| +- *LAST -+ |
+--SPLNBR(-|- *ONLY -|-)--+
+- 番号 --+
>--+---------------------------------------------------+------------><
| |
| +- *JOB ------------------------------+ |
| | +- *LIBL/ -------+ | |
+--OUTQ(-+-+- LIBRARY 名 / -+- 出力待ち行列名 -+-)--+ |
FILE
複写するスプール・ファイルの名前を指定します。
これは必須パラメーターです。
JOB
複写するスプール・ファイルを作成したジョブの名前を指定します。
指定できる値は次のとおりです。
*
このコマンドを出したジョブが,そのスプール・ファイルを作成したジョブです。(省略時の値)
ジョブ名
スプール・ファイルを作成したジョブの名前を指定してください。
ユーザー名
そのもとでジョブが実行されるユーザー・プロフィールを識別する
ユーザー名を指定してください。
番号
システム割当てジョブ番号を指定してください。
SPLNBR
複写するジョブのスプール・ファイルの番号を指定します。
指定できる値は次のとおりです。
*LAST
最高の番号および指定されたファイル名のスプール・ファイルが
使用されます。(省略時の値)
*ONLY
ジョブ内の1つのスプール・ファイルだけが指定されたファイル名をもっています。したがって,スプール・ファイルの番号は不要です。
スプール・ファイル番号
複写する指定されたファイル名のスプール・ファイルの番号を指定してください。
OUTQ
複写されたスプールが入る待ち行列の名前を指定します。
指定できる値は次のとおりです。
*JOB
現行ジョブの出力待ち行列が使用されます。(省略時の値)
出力待ち行列
出力待ち行列の名前を指定します。
指定できるライブラリー値は次の通りです。
*LIBL
ライブラリーリストが使用されます。(省略時の値)
ライブラリー名
ライブラリー名を指定します。
オブジェクト |
タイプ |
属性 |
原始ファイル |
CRTDUPSPL |
*CMD |
|
ZTOOL/QCMDSRC(CRTDUPSPL) |
CRTDUPSPLC |
*PGM |
CLP |
ZTOOL/QCLSRC(CRTDUPSPLC) |
CRTDUPSPLU |
*PNLGRP |
|
ZTOOL/QPNLSRC(CRTDUPSPLU) |
使用上の注意
どうも常に QSPPUTF から CPI3485
が出るようなので、完全に複写されているかどうかは保証できません。
(V2R3M0)V3R7M0 では出なくなりました。
このコマンドではワーク・ファイルとして QTEMP/ZSPLWRK
を使用します。もし同名のファイルが存在した場合は CPP
の冒頭で削除されます。但しコマンド終了時点では削除されませんので、あとで検査することが可能です。絶対に
QSPGETF で作成される様式と違う QTEMP/ZSPLWRK
が存在しないことが保証されているなら、このインプリメントを省略することが可能です。
CPP の原始メンバーCRTDUPSPLC
の冒頭でこの処理を行っていますので、その部分を削除し再コンパイルして下さい。続けてこのコマンドを実行するときのパフォーマンスの向上になります。
将来 QSPPUTF と QSPGETF
がサポートされなくなる可能性もありますので注意が必要です。
技術情報
非公開APIの QSPGETF と QSPPUTF
のパラメータは次の通りです。
QSPGETF
1 |
*CHAR 10 |
スプール・ファイル名 |
2 |
*CHAR 20 |
データを複写する物理ファイル名とライブラリー名 |
3 |
*CHAR 26 |
スプールを作成した JOB(10), USER(10), NBR(6) |
4 |
*CHAR 2 |
スプール番号の BIN2 |
5 |
*CHAR 10 |
データを複写する物理ファイルのメンバー名 |
QSPPUTF
1 |
*CHAR 20 |
データが複写された物理ファイル名とライブラリー名 |
2 |
*CHAR 20 |
複写スプールを作成する OUTQ とそのライブラリー名 |
3 |
*CHAR 10 |
データが複写された物理ファイルのメンバー名 |
物理ファイルは自動的に作成されます。
JOB, USER, NBR には '*' が使用できます。
スプール番号に X'FFFF' を指定すると *LAST
になります。また X'0000' を指定すると *ONLY になります。
メンバー名には *FIRST, *LAST
等は使用できません。正しい *NAME
タイプのストリングスが必要です。
このコマンドでは物理ファイルに QTEMP/ZSPLWRK
メンバー名にZSPLWRK を CRTDUPSPLC 内で固定で持っています。
作成される物理ファイルは MAXMBRS = *NOMAXの属性を持っています。別のメンバー名 を付ければ、同じファイルに追加できます。
作成されるメンバーのテキストには結構役に立つ情報が記載されます。固定長で左からスプール名、スプール番号、作成ジョブ、頁数です。
作成された物理ファイルはSAV***/RST***はできますが、どういうわけかCPYFやCRTDUPOBJでエラーになります。(V3R7M0の時点で)
Command source (type:CMD
/*****************************************************************/
/*** TITLE: 複写スプールの作成 ( CMD:CRTDUPSPL) ***/
/*** USER : ********** AUTHOR:STDIO.H CREATE:95/05/24 ***/
/*****************************************************************/
CRTDUPSPL: CMD PROMPT(' 複写スプールの作成 ')
FILE: PARM KWD(FILE) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(' 複写元スプール・ファイル ')
JOB: PARM KWD(JOB) TYPE(QUAL1) DFT(*) SNGVAL((*)) +
PROMPT(' スプール作成ジョブ名 ')
SPLNBR: PARM KWD(SPLNBR) TYPE(*DEC) LEN(6) DFT(*LAST) +
RANGE(1 9999) SPCVAL((*LAST -1) (*ONLY +
0)) PROMPT(' スプール・ファイル番号 ')
OUTQ: PARM KWD(OUTQ) TYPE(QUAL2) DFT(*JOB) +
SNGVAL((*JOB)) FILE(*OUT) +
PROMPT(' 複写先出力待ち行列 ')
QUAL1: QUAL TYPE(*NAME) LEN(10)
QUAL TYPE(*NAME) LEN(10) PROMPT(' ユーザー ')
QUAL TYPE(*CHAR) LEN(6) RANGE(000000 999999) +
PROMPT(' 番号 ')
QUAL2: QUAL TYPE(*NAME) LEN(10) MIN(1)
QUAL TYPE(*CHAR) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL)) PROMPT(' ライブラリー ') |
CPP source (type:CLP)
/*****************************************************************/
/*** TITLE: コマンド CRTDUPSPL の CPP ( CLP:CRTDUPSPLC)***/
/*** USER : ********** AUTHOR:STDIO.H CREATE:95/05/24 ***/
/*****************************************************************/
PGM PARM(&P#SPLNM &P#JOB &P#SPLNBR &P#OUTQ)
DCL &P#SPLNM *CHAR 10 /* SPL NAME */
DCL &P#JOB *CHAR 26 /* QUAL JOB */
DCL &P#SPLNBR *DEC 6 /* SPL NBR */
DCL &P#OUTQ *CHAR 20 /* QUAL OUTQ */
DCL &WRKFILE *CHAR 20 /* QUAL WRKF */
DCL &WRKMBR *CHAR 10 /* WRKMBR */
DCL &WRKF *CHAR 10 'ZSPLWRK' /* WRKF */
DCL &WRKLIB *CHAR 10 'QTEMP' /* WRKF LIB */
DCL &EXIST *LGL 1 '1' /* WRKF EXIST? */
DCL &SPLNBR *CHAR 2 /* BIN2 SPLNBR */
DCL &OUTQ *CHAR 10 /* JOB OUTQ */
DCL &OUTQLIB *CHAR 10 /* JOB OUTQLIB */
DCL &PRTDEV *CHAR 10 /* JOB PRTDEV */
DCL &ERRORSW *LGL /* STD ERR */
DCL &MSGID *CHAR 7 /* STD ERR */
DCL &MSGDTA *CHAR 100 /* STD ERR */
DCL &MSGF *CHAR 10 /* STD ERR */
DCL &MSGFLIB *CHAR 10 /* STD ERR */
MONMSG MSGID(CPF0000) EXEC(GOTO STDERR1) /* STD ERR */
/* ワーク・ファイルの削除 */
CHGVAR &WRKFILE (&WRKF || &WRKLIB)
CHGVAR &WRKMBR &WRKF
CHKOBJ &WRKLIB/&WRKF *FILE
MONMSG MSGID(CPF0000) EXEC(CHGVAR &EXIST '0')
IF (&EXIST) (DLTF (&WRKLIB/&WRKF))
/* スプール番号の変換 (DEC6 TO BIN2) */
CHGVAR %BIN(&SPLNBR) &P#SPLNBR
/* OUTQ の処理 */
IF (%SST(&P#OUTQ 1 10) = '*JOB') DO
RTVJOBA OUTQ(&OUTQ) OUTQLIB(&OUTQLIB) PRTDEV(&PRTDEV)
IF (&OUTQ = '*DEV') DO
CHGVAR &OUTQ &PRTDEV
CHGVAR &OUTQLIB '*LIBL'
ENDDO
CHGVAR &P#OUTQ (&OUTQ || &OUTQLIB)
ENDDO
ELSE DO
CHGVAR &OUTQ %SST(&P#OUTQ 1 10)
CHGVAR &OUTQLIB %SST(&P#OUTQ 11 10)
CHKOBJ &OUTQLIB/&OUTQ *OUTQ
ENDDO
/* スプール・ファイルをワークへ (API:QSPGETF) */
CALL QSPGETF (&P#SPLNM &WRKFILE &P#JOB &SPLNBR &WRKMBR)
/* ワークから出力待ち行列へ (API:QSPPUTF) */
CALL QSPPUTF (&WRKFILE &P#OUTQ &WRKMBR)
/* 完了メッセージ */
SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) +
MSGDTA(' スプール・ファイルの複写が完了し +
た。 ') MSGTYPE(*COMP)
RETURN: RETURN
/* 標準エラー処理 */
STDERR1:IF COND(&ERRORSW) THEN(SNDPGMMSG MSGID(CPF9999) +
MSGF(QCPFMSG) MSGTYPE(*ESCAPE))
CHGVAR VAR(&ERRORSW) VALUE('1')
STDERR2:RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) +
MSGF(&MSGF) MSGFLIB(&MSGFLIB)
IF COND(&MSGID *EQ ' ') THEN(GOTO CMDLBL(STDERR3))
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*DIAG)
GOTO CMDLBL(STDERR2)
STDERR3:RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) +
MSGF(&MSGF) MSGFLIB(&MSGFLIB)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
ENDPGM |
Help Panelgroup source (type:PNLGRP)
.* *****************************************************************
.* *** TITLE: CMD CRTDUPSPL の HLPMDL (PNLGRP:CRTDUPSPLU)***
.* *** USER : ********** AUTHOR:STDIO.H CREATE:95/05/24 ***
.* *****************************************************************
:PNLGRP TXTMODE = DBCS.
:IMPORT PNLGRP ='AAALIB' NAME='LIBL4'.
.*********************************************************************
.* 拡張援助
.*********************************************************************
:HELP NAME='CRTDUPSPL/ALL'.
:IMHELP NAME='CRTDUPSPL'.
:IMHELP NAME='CRTDUPSPL/FILE'.
:IMHELP NAME='CRTDUPSPL/JOB'.
:IMHELP NAME='CRTDUPSPL/SPLNBR'.
:IMHELP NAME='CRTDUPSPL/OUTQ'.
:EHELP.
.*********************************************************************
.* 機能説明
.*********************************************************************
:HELP NAME='CRTDUPSPL'. 複写スプールの作成 (CRTDUPSPL) −操作援助
:P. 非公開APIの QSPGETF と QSPPUTF を使用し、スプール・ファイルの
複写を行います。
:NT. ライブラリー QTEMP に内部処理用としてファイル ZSPLWRK が作成
されます。 :ENT.
:EHELP.
.*********************************************************************
.* パラメータ:FROMFILE
.*********************************************************************
:HELP NAME='CRTDUPSPL/FILE'.
複写元スプール・ファイル (FILE) −操作援助
:XH3. 複写元スプール・ファイル (FILE)
:P. 複写するスプール・ファイルの名前を指定します。
:P. これは必須パラメーターです。
:EHELP.
.*********************************************************************
.* パラメータ:JOB
.*********************************************************************
:HELP NAME='CRTDUPSPL/JOB'.
ジョブ名 (JOB) −操作援助
:XH3. ジョブ名 (JOB)
:P. 複写するスプール・ファイルを作成したジョブの名前を指定します。
:P. 指定できる値は次のとおりです。
:PARML.
:PT.:PK DEF.*:EPK.
:PD. このコマンドを出したジョブが,そのスプール・ファイルを作成した
ジョブです。
:PT.:PK. ジョブ名 :EPK.
:PD. スプール・ファイルを作成したジョブの名前を指定してください。
:PT.:PK. ユーザー名 :EPK.
:PD. そのもとでジョブが実行されるユーザー・プロフィールを識別する
ユーザー名を指定してください。
:PT.:PK. 番号 :EPK.
:PD. システム割当てジョブ番号を指定してください。
:EPARML.
:EHELP.
.*********************************************************************
.* パラメータ:SPLNBR
.*********************************************************************
:HELP NAME='CRTDUPSPL/SPLNBR'.
スプール・ファイル番号 (SPLNBR) −操作援助
:XH3. スプール・ファイル番号 (SPLNBR)
:P. 複写するジョブのスプール・ファイルの番号を指定します。
:P. 指定できる値は次のとおりです。
:PARML.
:PT.:PK DEF.*LAST:EPK.
:PD. 最高の番号および指定されたファイル名のスプール・ファイルが使用
されます。
:PT.:PK.*ONLY:EPK.
:PD. ジョブ内の1つのスプール・ファイルだけが指定されたファイル名を
もっています。したがって,スプール・ファイルの番号は不要です。
:PT.:PK. スプール・ファイル番号 :EPK.
:PD. 複写する指定されたファイル名のスプール・ファイルの番号を指定し
てください。
:EPARML.
:EHELP.
.*********************************************************************
.* パラメータ:OUTQ
.*********************************************************************
:HELP NAME='CRTDUPSPL/OUTQ'.
複写先出力待ち行列 (OUTQ) −操作援助
:XH3. 複写先出力待ち行列 (OUTQ)
:P. 複写されたスプールが入る待ち行列の名前を指定します。
:P. 指定できる値は次のとおりです。
:PARML.
:PT.:PK DEF.*JOB:EPK.
:PD. 現行ジョブの出力待ち行列が使用されます。
:PT.:PK. 出力待ち行列 :EPK.
:PD. 出力待ち行列の名前を指定します。
:EPARML.
:IMHELP NAME='LIBL4'.
:EHELP.
.*********************************************************************
:EPNLGRP. |
Import Panelgroup source (type:PNLGRP)
.* *****************************************************************
.* *** TITLE: ライブラリー説明用モジュール ( PNLGRP:AAALIB) ***
.* *** USER : ********** AUTHOR:STDIO.H CREATE:94/07/29 ***
.* *****************************************************************
:PNLGRP TXTMODE = DBCS.
.*********************************************************************
.* ライブラリー指定1
.*********************************************************************
:HELP NAME='LIBL1'.
:P. 指定できるライブラリー値は次の通りです。
:PARML.
:PT.:PK DEF. *LIBL:EPK.
:PD. ライブラリーリストが使用されます。
:PT.:PK. *CURLIB:EPK.
:PD. 現行ライブラリーが使用されます。
:PT.:PK. ライブラリー名 :EPK.
:PD. ライブラリー名を指定します。
:EPARML.
:EHELP.
.*********************************************************************
.* ライブラリー指定2
.*********************************************************************
:HELP NAME='LIBL2'.
:P. 指定できるライブラリー値は次の通りです。
:PARML.
:PT.:PK DEF. *CURLIB:EPK.
:PD. 現行ライブラリーが使用されます。
:PT.:PK. ライブラリー名 :EPK.
:PD. ライブラリー名を指定します。
:EPARML.
:EHELP.
.*********************************************************************
.* ライブラリー指定3
.*********************************************************************
:HELP NAME='LIBL3'.
:P. 指定できるライブラリー値は次の通りです。
:PARML.
:PT.:PK DEF. *LIBL:EPK.
:PD. ライブラリーリストが使用されます。
:PT.:PK. *CURLIB:EPK.
:PD. 現行ライブラリーが使用されます。
:PT.:PK. *USRLIBL:EPK.
:PD. ジョブのライブラリー・リストのユーザー部分にリストされているラ
イブラリーだけが探索されます。
:PT.:PK. *ALL:EPK.
:PD.QSYS を含むシステム上のすべてのライブラリーが探索されます。
:PT.:PK. *ALLUSR:EPK.
:PD. すべてのユーザー・ライブラリーが探索されます。
:PT.:PK. ライブラリー名 :EPK.
:PD. ライブラリー名を指定します。
:EPARML.
:EHELP.
.*********************************************************************
.* ライブラリー指定4
.*********************************************************************
:HELP NAME='LIBL4'.
:P. 指定できるライブラリー値は次の通りです。
:PARML.
:PT.:PK DEF. *LIBL:EPK.
:PD. ライブラリーリストが使用されます。
:PT.:PK. ライブラリー名 :EPK.
:PD. ライブラリー名を指定します。
:EPARML.
:EHELP.
.*********************************************************************
:EPNLGRP. |
|