先に紹介したRTVSPLF(スプール・ファイルの検索)コマンドを
利用したFAX送信の例を紹介致します。
この例では仕入先(取引先)に対する注文書を
仕入先の範囲を指定して一括で注文書をFAX送信するサンプルを
示しています。
仕入先コードをひとつずつ指定する必要がない
高度な処理で実行されるようになっています。
例えば生産計画に対して所要量を展開して計算して
展開した部品の一覧をまとめて注文書を発行することができる。
このような所要量計算のときに仕入先コードをひとつずつ
入力指定することなどできません。
そこでこの例でもまとめて注文書を発行できるようにしています。
ただし注文書は仕入先毎として出力してFAXまたはメールで
送信しなければなりません。
今回の例ではすべてFAX送信であるが仕入先別にFAXであったり
メール送信と分かれて混在している場合でもこの方法で行えます。
[FAXSPL:コマンド]
スプールの FAX 番号で送信 (FAXSPL) 選択項目を入力して,実行キーを押してください。 仕入先 から . . . . . 文字値 まで . . . . . 9999 文字値 発注日 (YYMMDD) から . . 数値 (YYMMDD) まで . . 99999999 数値 出力 . . . . . . . . . . . . . > *FAX *, *PRINT, *FAX 終り F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
[FAXSPL:コマンドのソース]
ソースはこちらから
0001.00 CMD PROMPT(' スプールの FAX 番号で送信 ') 0002.00 PARM KWD(FROMSIR) TYPE(*CHAR) LEN(4) + 0003.00 PROMPT(' 仕入先 から ') 0004.00 PARM KWD(TOSIR) TYPE(*CHAR) LEN(4) + 0005.00 DFT(9999) PROMPT(' + 0006.00 まで ') 0007.00 PARM KWD(DATEFROM) TYPE(*DEC) LEN(8 0) + 0008.00 PROMPT(' 発注日 (YYMMDD) から ') 0009.00 PARM KWD(DATEEND) TYPE(*DEC) LEN(8 0) + 0010.00 DFT(99999999) PROMPT(' + 0011.00 (YYMMDD) まで ') 0012.00 PARM KWD(OUTPUT) TYPE(*CHAR) LEN(6) RSTD(*YES) + 0013.00 DFT(*PRINT) VALUES(* *PRINT *FAX) + 0014.00 PROMPT(' 出力 ')
[コンパイル]
CRTCMD CMD(QTROBJ/FAXSPL) PGM(QTROBJ/FAXSPLCL) SRCFILE(QTRSRC/QCMDSRC) AUT(*ALL)
[FAXSPLCL : CLPソース ]
ソースはこちらから
0001.00 PGM PARM(&SIRFROM &SIREND &DATEFROM &DATEEND + 0002.00 &OUTPUT) 0003.00 /*-------------------------------------------------------------------*/ 0004.00 /* FAXSPLCL : スプールの FAX 番号で送信 */ 0005.00 /* */ 0006.00 /* [ 注 ] この例では処理をできるだけ CLP で行うようにした例を */ 0007.00 /* 示しています。 */ 0008.00 /* */ 0009.00 /* (1) 指定した仕入先コードの範囲で RPG: FAXSPL を実行します。 */ 0010.00 /* (2) RPG: FAXSPL はひとつの仕入先の注文書だけを出力して */ 0011.00 /* 出力した仕入先コードをパラメータに戻します (SIRFROM) */ 0012.00 /* (3) 再び RPG:FAXSPL が呼び出されますが FAXSPL は */ 0013.00 /* パラメータ SIRFROM の次の仕入先の注文データを探して */ 0014.00 /* 印刷します。 */ 0015.00 /* (4) 印刷が終わればまた SIRFROM に戻して繰返し印刷を行います。 */ 0016.00 /* (5) SIREND まで印刷するか EOF になれば終了します。 */ 0017.00 /* */ 0018.00 /* 2021/02/28 作成 */ 0019.00 /*-------------------------------------------------------------------*/ 0020.00 DCL VAR(&SIRFROM) TYPE(*CHAR) LEN(4) 0021.00 DCL VAR(&SIREND) TYPE(*CHAR) LEN(4) 0022.00 DCL VAR(&NXTSIR) TYPE(*CHAR) LEN(4) 0023.00 DCL VAR(&DATEFROM) TYPE(*DEC) LEN(8 0) 0024.00 DCL VAR(&DATEEND) TYPE(*DEC) LEN(8 0) 0025.00 DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(6) 0026.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0027.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0028.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0029.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0030.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0031.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0032.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0033.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0034.00 VALUE('*ESCAPE ') 0035.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0036.00 VALUE(X'000074') /* 2 進数 */ 0037.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1) 0038.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0039.00 VALUE(X'00000000') 0040.00 DCL VAR(&DFTCCSID) TYPE(*DEC) LEN(5 0) 0041.00 DCL VAR(&RTNVAR) TYPE(*CHAR) LEN(128) 0042.00 DCL VAR(&FAXNO) TYPE(*CHAR) LEN(15) 0043.00 DCL VAR(&LR) TYPE(*CHAR) LEN(1) 0044.00 DCL VAR(&SRNMJ) TYPE(*CHAR) LEN(32) 0045.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0046.00 0047.00 /*( 環境の取得 )*/ 0048.00 RTVJOBA TYPE(&TYPE) DFTCCSID(&DFTCCSID) 0049.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0050.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0051.00 ENDDO /* バッチ */ 0052.00 ELSE CMD(DO) /* 対話式 */ 0053.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0054.00 ENDDO /* 対話式 */ 0055.00 0056.00 /*( パラメータの検査 )*/ 0057.00 CHGJOB CCSID(5035) 0058.00 0059.00 /*( プログラムの実行 )*/ 0060.00 NXTHAT: 0061.00 IF COND((&OUTPUT *EQ '*') *OR (&OUTPUT *EQ + 0062.00 '*FAX')) THEN(DO) 0063.00 OVRPRTF FILE(QPRINT) HOLD(*YES) USRDTA(' 注文書 ') + 0064.00 SECURE(*YES) OVRSCOPE(*JOB) 0065.00 ENDDO 0066.00 ELSE CMD(IF COND(&OUTPUT *EQ '*RONT') THEN(DO)) + 0067.00 /* 印刷 */ 0068.00 OVRPRTF FILE(QPRINT) USRDTA(' 注文書 ') + 0069.00 SECURE(*YES) OVRSCOPE(*JOB) 0070.00 ENDDO /* 印刷 */ 0071.00 OVRDBF FILE(HATTUL1) TOFILE(QTRFIL/HATTUL1) + 0072.00 SECURE(*YES) OVRSCOPE(*JOB) 0073.00 CALL PGM(QTROBJ/FAXSPL) PARM(&SIRFROM &SIREND + 0074.00 &DATEFROM &DATEEND &SRNMJ &LR) 0075.00 DLTOVR FILE(*ALL) LVL(*JOB) 0076.00 CHGJOB CCSID(&DFTCCSID) 0077.00 IF COND(&OUTPUT *EQ '*FAX') THEN(DO) /* *FAX */ 0078.00 /*( スプールの FAX 番号を検索 )*/ 0079.00 SPOOLWTR/RTVSPLF SPLF(QPRINT) JOB(*) SPLNO(*LAST) + 0080.00 POSITION(4 1 15) RTNVAR(&RTNVAR) 0081.00 CHGVAR VAR(&FAXNO) VALUE(%SST(&RTNVAR 1 15)) 0082.00 /*( CVTSPLF で FAX 送信する )*/ 0083.00 CVTSPLF SPLF(QPRINT) JOB(*) SPLNO(*LAST) + 0084.00 OUTPUT(*PDF) OPTION(*FAX) + 0085.00 RECIPIENT((&FAXNO &SRNMJ)) + 0086.00 FROM(0669938746) FAX_SUBJ(' 注文書 ') + 0087.00 FAXFROM(' 株式会社オフィスクアトロ ') + 0088.00 COVERPAGE(*NO) 0089.00 ENDDO /* *FAX */ 0090.00 ELSE CMD(IF COND(&OUTPUT *EQ '*') THEN(DO)) /* + 0091.00 表示 */ 0092.00 DSPSPLF FILE(QPRINT) JOB(*) SPLNBR(*LAST) 0093.00 DLTSPLF FILE(QPRINT) SPLNBR(*LAST) 0094.00 ENDDO /* 表示 */ 0095.00 ELSE CMD(DO) /* 印刷 */ 0096.00 ENDDO /* 印刷 */ 0097.00 /*-----------------------------------------------------*/ 0098.00 /* LR- 終了でなければ次の仕入先の処理へ戻る */ 0099.00 IF COND(&LR *NE '*') THEN(DO) 0100.00 GOTO NXTHAT 0101.00 ENDDO 0102.00 /*-----------------------------------------------------*/ 0103.00 IF COND(&OUTPUT *EQ '*FAX') THEN(DO) /* *FAX */ 0104.00 SNDPGMMSG MSG(' 注文書を FAX しました。 ') MSGTYPE(*DIAG) 0105.00 ENDDO /* *FAX */ 0106.00 ELSE CMD(IF COND(&OUTPUT *EQ '*') THEN(DO)) /* + 0107.00 表示 */ 0108.00 ENDDO /* 表示 */ 0109.00 ELSE CMD(DO) /* 印刷 */ 0110.00 SNDPGMMSG MSG(' 注文書を印刷しました。 ') MSGTYPE(*DIAG) 0111.00 ENDDO /* 印刷 */ 0112.00 RETURN 0113.00 0114.00 APIERR: 0115.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0116.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0117.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0118.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0119.00 GOTO SNDMSG 0120.00 0121.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0122.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0123.00 SNDMSGFLIB(&MSGFLIB) 0124.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0125.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0126.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0127.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0128.00 ENDDO 0129.00 ELSE CMD(DO) 0130.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0131.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0132.00 MSGTYPE(&MSGTYPE) 0133.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0134.00 ENDDO 0135.00 ENDPGM
[コンパイル]
CRTCLPGM QTROBJ/FAXSPLCL SRCFILE(QTRSRC/QCLSRC) AUT(*ALL)
[解説]
0071.00 OVRDBF FILE(HATTUL1) TOFILE(QTRFIL/HATTUL1) + 0072.00 SECURE(*YES) OVRSCOPE(*JOB) 0073.00 CALL PGM(QTROBJ/FAXSPL) PARM(&SIRFROM &SIREND + 0074.00 &DATEFROM &DATEEND &SRNMJ &LR) 0075.00 DLTOVR FILE(*ALL) LVL(*JOB)
で注文書を印刷出力すると
0078.00 /*( スプールの FAX 番号を検索 )*/ 0079.00 SPOOLWTR/RTVSPLF SPLF(QPRINT) JOB(*) SPLNO(*LAST) + 0080.00 POSITION(4 1 15) RTNVAR(&RTNVAR) 0081.00 CHGVAR VAR(&FAXNO) VALUE(%SST(&RTNVAR 1 15))
によって 4行目1桁目から15バイトのFAX番号をRTVSPLFコマンドによって取得します。
次に CVTSPLFコマンドによって
0082.00 /*( CVTSPLF で FAX 送信する )*/ 0083.00 CVTSPLF SPLF(QPRINT) JOB(*) SPLNO(*LAST) + 0084.00 OUTPUT(*PDF) OPTION(*FAX) + 0085.00 RECIPIENT((&FAXNO &SRNMJ)) + 0086.00 FROM(0669938746) FAX_SUBJ(' 注文書 ') + 0087.00 FAXFROM(' 株式会社オフィスクアトロ ') + 0088.00 COVERPAGE(*NO)
でスプールをFAX送信します。
0097.00 /*-----------------------------------------------------*/ 0098.00 /* LR- 終了でなければ次の仕入先の処理へ戻る */ 0099.00 IF COND(&LR *NE '*') THEN(DO) 0100.00 GOTO NXTHAT 0101.00 ENDDO 0102.00 /*-----------------------------------------------------*/
LR終了でなければ次の仕入先の注文データを処理します。
{ RPG : SPLFAX サンプル・ソース ]
ソースはこちらから
0001.00 H DFTNAME(FAXSPL) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** スプールの FAX 番号で送信 ********************************* 0003.00 FHATTUL1 IF E K DISK 0004.00 FSIREMT IF E K DISK 0005.00 FBUHINM IF E K DISK 0006.00 FQPRINT O F 132 PRINTER OFLIND(*INOF) 0007.00 F FORMLEN(66) 0008.00 F FORMOFL(62) 0009.00 F********************************************************************** 0010.00 0011.00 * CRTBNDRPG PGM(QTROBJ/FAXSPL) SRCFILE(QTRSRC/QRPGLESRC) 0012.00 * DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL) 0013.00 0014.00 *-------------------------------------------------------------------* 0015.00 * 2020/12/23 : 作成 0016.00 *-------------------------------------------------------------------* 0017.00 *( 作業変数 ) 0018.00 D AR S 1A DIM(256) 0019.00 D N S 4S 0 0020.00 D TRUE S 1A DIM(256) 0021.00 D TRUE# S 4B 0 INZ(0) 0022.00 D FALSE# S 4B 0 INZ(-1) 0023.00 D QUOT C CONST(X'7D') 0024.00 D OE C CONST(X'0E') 0025.00 D OF C CONST(X'0F') 0026.00 D NULL C CONST(X'00') 0027.00 0028.00 D HDR S 32 DIM(1) CTDATA PERRCD(1) 見出し 0029.00 D LIN S 1 DIM(132) 0030.00 0031.00 0032.00 C*-------------------------------------------------------------------------+ 0033.00 C *ENTRY PLIST | 0034.00 C PARM FROMSIR 4 | 0035.00 C PARM TOSIR 4 | 0036.00 C PARM DATEFROM 8 0 | 0037.00 C PARM DATEEND 8 0 | 0038.00 C PARM SRNMJ_ 32 | 0039.00 C PARM LR 1 | 0040.00 C*-------------------------------------------------------------------------+ 0041.00 C*----------------------------------------------------+ 0042.00 C SETKEY KLIST 0043.00 C KFLD HTSRCD 0044.00 C KFLD HTDATE 0045.00 C KFLD HTHTNO 0046.00 C KFLD HTGYO 0047.00 C*----------------------------------------------------+ 0048.00 C MOVEA *ALL'-' LIN 0049.00 C MOVEL FROMSIR HTSRCD 0050.00 C MOVEL DATEFROM HTDATE 0051.00 C MOVE *LOVAL HTHTNO 0052.00 C MOVE *LOVAL HTGYO 0053.00 C SETKEY SETGT HATTUL1 0054.00 C DO *HIVAL DO-*HIVAL 0055.00 C SETOFF 50 0056.00 C READ HATTUL1 50 0057.00 C 50 MOVE '*' LR 0058.00 C 50 LEAVE 0059.00 C SETKEY SETLL HATTUL1 0060.00 C*----------------------------------------------------+ 0061.00 C EQLKEY KLIST 0062.00 C KFLD HTSRCD 0063.00 C KFLD HTDATE 0064.00 C*----------------------------------------------------+ 0065.00 *( 次の仕入先を READ ) 0066.00 C DO *HIVAL DO-*HIVAL-EQL 0067.00 C SETOFF 50 0068.00 C EQLKEY READE HATTUL1 50 0069.00 C 50 MOVE '*' LR 0070.00 C 50 LEAVE 0071.00 C HTSRCD IFGT TOSIR 0072.00 C MOVE '*' LR 0073.00 C LEAVE 0074.00 C ENDIF 0075.00 C SETOFF 99 0076.00 C HTSRCD CHAIN SIREMT 99 0077.00 C MOVEL(P) SRNMJ SRNMJ_ 0078.00 C SETOFF 99 0079.00 C HTBHCD CHAIN BUHINM 99 0080.00 C*( 明細印刷 ) 0081.00 C*-------------------------------------------------------------------------+ 0082.00 C SETON 42 | 0083.00 C EXSR OUTPUT | 0084.00 C*-------------------------------------------------------------------------+ 0085.00 C ADD 1 KENSU 7 0 件数 0086.00 C ENDDO DO-*HIVAL-EQL 0087.00 C MOVEL HTSRCD FROMSIR 0088.00 *( 連続 READ はしないで CLP に戻す ) 0089.00 C LEAVE 0090.00 * 0091.00 C ENDDO DO-*HIVAL 0092.00 C SETON LR 0093.00 C RETURN 0094.00 C****************************************************** 0095.00 C OUTPUT BEGSR 0096.00 C****************************************************** 0097.00 C N40 SETON 4041 0098.00 C EXCEPT 0099.00 C OF SETOFF 40OF 0100.00 C SETOFF 414243 0101.00 C SETOFF 444546 0102.00 C SETOFF 474849 0103.00 C ENDSR 0104.00 OQPRINT E 41 1 04 0105.00 O SRFAX 15 FAX 番号埋め込み 0106.00 O E 41 2 0107.00 O UDATE Y 8 0108.00 O 14 ' 作成 ' 0109.00 O HDR(1) 82 0110.00 O 128 'PAGE.' 0111.00 O PAGE Z 131 0112.00 O E 41 1 0113.00 O HTSRCD 4 0114.00 O SRNMJ 38 0115.00 O 42 ' 様 ' 0116.00 O E 41 1 0117.00 O LIN 132 0118.00 O E 41 1 0119.00 O 8 ' コード ' 0120.00 O 20 ' 品 名 ' 0121.00 O 42 ' 単価 ' 0122.00 O 60 ' 発注数 ' 0123.00 O 80 ' 金額 ' 0124.00 O E 41 1 0125.00 O LIN 132 0126.00 O E 42 2 0127.00 O HTBHCD 12 0128.00 O BHNAME 33 0129.00 O HTTANK J 44 0130.00 O HTSUR J 60 0131.00 O HTKING J 80 0132.00 ** HDR 0133.00 注文書
[コンパイル]
CRTBNDRPG QTROBJ FAXSPL SRCFILE(QTRSRC/QRPGLESRC) DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
[解説]
このRPG: FAXSPLはCLPによって複数回LOOPによって呼び出される場合があります。
ただし一回の呼び出しのときに処理するのはひとつの仕入先だけです。
これは出力されるスプール毎にFAXが必要なのでひとつのスプールに
異なる仕入先の注文書が混在してはならないからです。
そのためひとつの仕入先の出力が終わればこのプログラムもその都度終了して
CLPに戻ります。
CLPにはどの仕入先まで処理したかを伝えるためにSIRFROMに処理した仕入先のコードを
入れてCLPに戻します。
次回の処理ではSIRFROMより大きな仕入先コードがSETGTによって選択されることに
注意してください。
[注]
スプールにFAX/メールの識別を入れておけば仕入先毎に次の処理を変えて
メール送信とすることも可能です。