ここでは注文書をまとめてバッチ処理で仕入先へ一括発注する適用業務の例を紹介します。
必要条件
IBM iからインターネットへの接続が可能であることが必要です。
お客さまのIBM iがインターネットに接続可能であるかどうかは
SpoolライターVer5.0のPINGCHKコマンドによって調べることができます。
[例] SPOOLWTR/PINGCHK + [実行]
サンプルのデータ・ベース構成
発注ファイル (QTRFIL/HATTU)
仕入先マスター(QTRFIL/SIREMT)
メール・アドレス(QUSRTEMP/MAILADR)
処理の概要
コマンド: SNDHAT によって仕入先と発注日期間を指定して入力して
CLP: SNDHATCL によって処理します。
コマンド : SNDHAT
処理画面
注文書メール送信 (SNDHAT)
選択項目を入力して,実行キーを押してください。
仕入先 から . . . . . 文字値
まで . . . . . 9999 文字値
発注日 (YYMMDD) から . . 数値
(YYMMDD) まで . . 99999999 数値
出力 . . . . . . . . . . . . . > *MAIL *, *PRINT, *MAIL
ログ出力 . . . . . . . . . . . *YES *YES, *NO
終り
F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し
F13= この画面の使用法 F24= キーの続き
【 コマンド : SNDHAT 】
0001.00 CMD PROMPT(' 注文書メール送信 ')
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 *MAIL) +
0014.00 PROMPT(' 出力 ')
0015.00 PARM KWD(LOG) TYPE(*CHAR) LEN(4) RSTD(*YES) +
0016.00 DFT(*NO) VALUES(*YES *NO) PMTCTL(MAIL) +
0017.00 PROMPT(' ログ出力 ')
0018.00 MAIL: PMTCTL CTL(OUTPUT) COND((*EQ *MAIL))
CLP : SNDHATCL
SNDHATCLは入力された選択値をRPGプログラム SNDHATに渡して
発注ファイルを抽出して処理します。
SNDHATCLでは仕入先毎にRPG: SNDHAT で注文書を出力し
CVTSPLFによってメール送信します。
【 CLP: SNDHATCL 】
0001.00 PGM PARM(&SIRFROM &SIREND &DATEFROM &DATEEND +
0002.00 &OUTPUT &LOG)
0003.00 /*-------------------------------------------------------------------*/
0004.00 /* SNDHATCL : 注文書メール送信 */
0005.00 /* */
0006.00 /* 2020/12/20 作成 */
0007.00 /*-------------------------------------------------------------------*/
0008.00 DCL VAR(&SIRFROM) TYPE(*CHAR) LEN(4)
0009.00 DCL VAR(&SIREND) TYPE(*CHAR) LEN(4)
0010.00 DCL VAR(&DATEFROM) TYPE(*DEC) LEN(8 0)
0011.00 DCL VAR(&DATEEND) TYPE(*DEC) LEN(8 0)
0012.00 DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(6)
0013.00 DCL VAR(&LOG) TYPE(*CHAR) LEN(4)
0014.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0015.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0016.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0017.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0018.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0019.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0020.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0021.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0022.00 VALUE('*ESCAPE ')
0023.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0024.00 VALUE(X'000074') /* 2 進数 */
0025.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1)
0026.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0027.00 VALUE(X'00000000')
0028.00 DCL VAR(&DFTCCSID) TYPE(*DEC) LEN(5 0)
0029.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0030.00
0031.00 /*( 環境の取得 )*/
0032.00 RTVJOBA TYPE(&TYPE) DFTCCSID(&DFTCCSID)
0033.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0034.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0035.00 ENDDO /* バッチ */
0036.00 ELSE CMD(DO) /* 対話式 */
0037.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0038.00 ENDDO /* 対話式 */
0039.00
0040.00 /*( パラメータの検査 )*/
0041.00 CHGJOB CCSID(5035)
0042.00
0043.00 /*( プログラムの実行 )*/
0044.00 OVRDBF FILE(HATTUL1) TOFILE(QTRFIL/HATTUL1) +
0045.00 SECURE(*YES) OVRSCOPE(*JOB)
0046.00 CALL PGM(QTROBJ/SNDHAT) PARM(&SIRFROM &SIREND +
0047.00 &DATEFROM &DATEEND &OUTPUT &LOG)
0048.00 DLTOVR FILE(HATTUL1) LVL(*JOB)
0049.00 CHGJOB CCSID(&DFTCCSID)
0050.00 RETURN
0051.00
0052.00 APIERR:
0053.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0054.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0055.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0056.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0057.00 GOTO SNDMSG
0058.00
0059.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0060.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0061.00 SNDMSGFLIB(&MSGFLIB)
0062.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0063.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0064.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0065.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0066.00 ENDDO
0067.00 ELSE CMD(DO)
0068.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0069.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0070.00 MSGTYPE(&MSGTYPE)
0071.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0072.00 ENDDO
0073.00 ENDPGM
RPG : SNDHAT
RPGプログラム: SNDHAT の中からコマンド:CVTSPLFを呼出してPDF変換を 行い処理したスプールは DLTSPLFコマンドで削除します。
【 RPG: SNDHAT 】
0001.00 H DFTNAME(SNDHAT) DATEDIT(*YMD/) BNDDIR('QC2LE')
0002.00 F********** 注文書メール送信 ******************************************
0003.00 FHATTUL1 IF E K DISK
0004.00 FSIREMT IF E K DISK
0005.00 FBUHINM IF E K DISK
0006.00 FMAILADR IF E K DISK EXTFILE('QUSRTEMP/MAILADR')
0007.00 FQPRINT O F 132 PRINTER OFLIND(*INOF) USROPN
0008.00 F FORMLEN(66)
0009.00 F FORMOFL(62)
0010.00 F**********************************************************************
0011.00
0012.00 * CRTBNDRPG PGM(QTROBJ/SNDHAT) SRCFILE(QTRSRC/QRPGLESRC)
0013.00 * DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
0014.00
0015.00 *-------------------------------------------------------------------*
0016.00 * 2020/12/21 : 作成
0017.00 *-------------------------------------------------------------------*
0018.00 *( 作業変数 )
0019.00 D AR S 1A DIM(256)
0020.00 D CMD S 1024A
0021.00 D N S 4S 0
0022.00 D TRUE S 1A DIM(256)
0023.00 D TRUE# S 4B 0 INZ(0)
0024.00 D FALSE# S 4B 0 INZ(-1)
0025.00 D QUOT C CONST(X'7D')
0026.00 D OE C CONST(X'0E')
0027.00 D OF C CONST(X'0F')
0028.00 D NULL C CONST(X'00')
0029.00
0030.00 D HDR S 32 DIM(1) CTDATA PERRCD(1) 見出し
0031.00 D LIN S 1 DIM(132)
0032.00
0033.00 D SYSTEM PR 10I 0 EXTPROC('system')
0034.00 D CMD * VALUE OPTIONS(*STRING)
0035.00
0036.00 C*-------------------------------------------------------------------------+
0037.00 C *ENTRY PLIST |
0038.00 C PARM FROMSIR 4 |
0039.00 C PARM TOSIR 4 |
0040.00 C PARM DATEFROM 8 0 |
0041.00 C PARM DATEEND 8 0 |
0042.00 C PARM OUTPUT_ 6 |
0043.00 C PARM LOG_ 4 |
0044.00 C*-------------------------------------------------------------------------+
0045.00 C*----------------------------------------------------+
0046.00 C SETKEY KLIST
0047.00 C KFLD HTSRCD
0048.00 C KFLD HTDATE
0049.00 C KFLD HTHTNO
0050.00 C KFLD HTGYO
0051.00 C*----------------------------------------------------+
0052.00 C MOVEA *ALL'-' LIN
0053.00 C MOVEL FROMSIR HTSRCD
0054.00 C MOVEL DATEFROM HTDATE
0055.00 C MOVE *LOVAL HTHTNO
0056.00 C MOVE *LOVAL HTGYO
0057.00 C SETKEY SETLL HATTUL1
0058.00 C DO *HIVAL DO-*HIVAL
0059.00 C SETOFF 50
0060.00 C READ HATTUL1 50
0061.00 C 50 LEAVE
0062.00 C SETKEY SETLL HATTUL1
0063.00 C*----------------------------------------------------+
0064.00 C EQLKEY KLIST
0065.00 C KFLD HTSRCD
0066.00 C KFLD HTDATE
0067.00 C*----------------------------------------------------+
0068.00 C EXSR OVRPRTF
0069.00 C OPEN QPRINT 90
0070.00 C *IN90 IFEQ *OFF QPRINT
0071.00 C DO *HIVAL DO-*HIVAL-EQL
0072.00 C SETOFF 50
0073.00 C EQLKEY READE HATTUL1 50
0074.00 C 50 LEAVE
0075.00 C SETOFF 99
0076.00 C HTSRCD CHAIN SIREMT 99
0077.00 C SETOFF 99
0078.00 C HTBHCD CHAIN BUHINM 99
0079.00 C MOVEL(P) HTSRCD USER
0080.00 C USER CHAIN MAILADR 99
0081.00 C*( 明細印刷 )
0082.00 C*-------------------------------------------------------------------------+
0083.00 C SETON 42 |
0084.00 C EXSR OUTPUT |
0085.00 C*-------------------------------------------------------------------------+
0086.00 C ADD 1 KENSU 7 0 件数
0087.00 C ENDDO DO-*HIVAL-EQL
0088.00 C CLOSE QPRINT
0089.00 *
0090.00 C SELECT SELECT
0091.00 C WHEN OUTPUT_ = '* '
0092.00 C EXSR DSPLY
0093.00 C WHEN OUTPUT_ = '*PRINT'
0094.00 C EXSR PRINT
0095.00 C WHEN OUTPUT_ = '*MAIL '
0096.00 C EXSR SNDMAIL
0097.00 C ENDSL SELECT
0098.00 C EXSR DLTOVR
0099.00 *
0100.00 C ENDIF QPRINT
0101.00 *
0102.00 C ENDDO DO-*HIVAL
0103.00 C SETON LR
0104.00 C RETURN
0105.00 C******************************************************
0106.00 C OVRPRTF BEGSR
0107.00 C******************************************************
0108.00 C IF OUTPUT_ = '* ' OR OVRPRTF
0109.00 C OUTPUT_ = '*MAIL '
0110.00 /FREE
0111.00 SYSTEM('OVRPRTF FILE(QPRINT) HOLD(*YES) USRDTA('' 注文書 '') -
0112.00 SECURE(*YES) OVRSCOPE(*JOB)');
0113.00 /END-FREE
0114.00 C ELSE OVRPRTF
0115.00 /FREE
0116.00 SYSTEM('OVRPRTF FILE(QPRINT) USRDTA('' 注文書 '') -
0117.00 SECURE(*YES) OVRSCOPE(*JOB)');
0118.00 /END-FREE
0119.00 C ENDIF OVRPRTF
0120.00 C ENDSR
0121.00 C******************************************************
0122.00 C DLTOVR BEGSR
0123.00 C******************************************************
0124.00 /FREE
0125.00 SYSTEM('DLTOVR FILE(QPRINT) LVL(*JOB)');
0126.00 SYSTEM('DLTSPLF FILE(QPRINT) SPLNBR(*LAST)');
0127.00 /END-FREE
0128.00 C ENDSR
0129.00 C******************************************************
0130.00 C DSPLY BEGSR
0131.00 C******************************************************
0132.00 /FREE
0133.00 SYSTEM('DSPSPLF FILE(QPRINT) SPLNBR(*LAST)');
0134.00 /END-FREE
0135.00 C ENDSR
0136.00 C******************************************************
0137.00 C PRINT BEGSR
0138.00 C******************************************************
0139.00 C ENDSR
0140.00 C******************************************************
0141.00 C SNDMAIL BEGSR
0142.00 C******************************************************
0143.00 /FREE
0144.00 CMD = 'SPOOLWTR/CVTSPLF SPLF(QPRINT) JOB(*) SPLNO(*LAST) ' +
0145.00 ' OUTPUT(*PDF) ' +
0146.00 'OPTION(*MAIL) FROMADR(info@officequattro.com) TOADDR(' +
0147.00 %TRIMR(ADDR) +
0148.00 ') SUBJECT('' 注文書 '') ADDFILE(*SPLF) ' +
0149.00 ' SMTPLOG(' + %TRIMR(LOG_) + ') ' +
0150.00 ' SMTPSERVER(*FROMADR) SMTPPORT(25)';
0151.00 SYSTEM(CMD);
0152.00 /END-FREE
0153.00 C ENDSR
0154.00 C******************************************************
0155.00 C OUTPUT BEGSR
0156.00 C******************************************************
0157.00 C N40 SETON 4041
0158.00 C EXCEPT
0159.00 C OF SETOFF 40OF
0160.00 C SETOFF 414243
0161.00 C SETOFF 444546
0162.00 C SETOFF 474849
0163.00 C ENDSR
0164.00 OQPRINT E 41 2 06
0165.00 O UDATE Y 8
0166.00 O 14 ' 作成 '
0167.00 O HDR(1) 82
0168.00 O 128 'PAGE.'
0169.00 O PAGE Z 131
0170.00 O E 41 1
0171.00 O HTSRCD 4
0172.00 O SRNMJ 38
0173.00 O 42 ' 様 '
0174.00 O E 41 1
0175.00 O LIN 132
0176.00 O E 41 1
0177.00 O 8 ' コード '
0178.00 O 20 ' 品 名 '
0179.00 O 42 ' 単価 '
0180.00 O 60 ' 発注数 '
0181.00 O 80 ' 金額 '
0182.00 O E 41 1
0183.00 O LIN 132
0184.00 O E 42 2
0185.00 O HTBHCD 12
0186.00 O BHNAME 33
0187.00 O HTTANK J 44
0188.00 O HTSUR J 60
0189.00 O HTKING J 80
0190.00 DR
0190.00 ** HDR
注文書
【 解説 】
仕入先のメール・アドレスは
0006.00 FMAILADR IF E K DISK EXTFILE('QUSRTEMP/MAILADR')
にコマンド WRKMAILADR(メール・アドレスの登録) によって宛先として
登録されています。
注文データは仕入先毎にまとめて注文書にして印刷しますので
0073.00 C EQLKEY READE HATTUL1 50
によって仕入先別にまとめて読み取っています。
注文書を印刷出力してからは
表示のときは
0133.00 SYSTEM('DSPSPLF FILE(QPRINT) SPLNBR(*LAST)');
で表示装置に表示して
メールのときは
0143.00 /FREE
0144.00 CMD = 'SPOOLWTR/CVTSPLF SPLF(QPRINT) JOB(*) SPLNO(*LAST) ' +
0145.00 ' OUTPUT(*PDF) ' +
0146.00 'OPTION(*MAIL) FROMADR(info@officequattro.com) TOADDR(' +
0147.00 %TRIMR(ADDR) +
0148.00 ') SUBJECT('' 注文書 '') ADDFILE(*SPLF) ' +
0149.00 ' SMTPLOG(' + %TRIMR(LOG_) + ') ' +
0150.00 ' SMTPSERVER(*FROMADR) SMTPPORT(25)';
0151.00 SYSTEM(CMD);
0152.00 /END-FREE
で、CVTSPLFコマンドでIBM iから直接、相手方へメール送信します。
SYSTEMコマンドで IBM iのコマンドを実行することができます。
これは
0001.00 H DFTNAME(SNDHAT) DATEDIT(*YMD/) BNDDIR('QC2LE')
によって バインド・ディレクトリー QC2LE を定義していますので
RPGプログラムからC言語の関数を呼べるようになっています。
関数systemは
0033.00 D SYSTEM PR 10I 0 EXTPROC('system')
0034.00 D CMD * VALUE OPTIONS(*STRING)
によって大文字の関数SYSTEMとして再定義されています。
SYSTEM関数に渡すコマンド文はRPGのフリー・フォーマットで書かれていることに
注意してください。
このように文字列の結合処理はフリー・フォーマットで記述したほうが
見た目にも直観的でわかりやすくなります。
QCMDEXC関数を呼び出すよりもSYSTEM関数を利用したほうが
わかりやすく工数も少なくて済みます。