最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

13.10.SNDDSTの有効利用

[ Previous ] [ HOME ] [ Upper ] [ Next ]


SNDDSTを使って、AS/400からメールを送ることができるのなら、ダウンロードもそれでできないかという発想から、ファイル指定して、メールアドレスを指定すると、CSV変換して、メールを送る、コマンドを作ってみました。

AS/400からメールを発行する部分は、こちらを参照してください。V4R3以降はマニュアルに出ておらず、InfoCenterに出ています。実は、自分も、いろいろ、ほかの人に教わってつながったので、偉そうなことはいえないのですが、つながってしまうと簡単です。

また、ここでは、V4R5を前提として考えています。

SMTP, POPなどの設定が終われば、AS/400から、SNDDSTというコマンドで、Internetメールを出すことができます。そもそも、SNDDSTは、オフィスビジョン400(OV400)のコマンドとして、その文書の配布目的で使われていました。それが今は、拡張されて、インターネットメールを送ることにも、使われています。また、いつからサポートされたか、不明確なのですが、TYPE(*LMSG)を使うと、ドキュメント以外にただメッセージを送ることも可能です。但し、今回は、メールに添付するのが目的ですので、TYPE(*DOC)を使います。

さて、目指しているコマンドは、

  1. CSVファイルを作る。

  2. SNDDSTで、それをアタッチして送る。

です。

CSVファイルを作るコマンド自体は、システムコマンド、ユーザー定義コマンド(つまり自作)のどちらかでしょうが、ここでは、前者のシステムコマンドを利用するやり方を考えます。CPYTOIMPFです。

また、特殊なプログラム(RTVSQLLOGR)を呼び出していますが、これは、CSV化されたファイルの長さを求めるためのものです。

では、早速、CLPを見てみましょう。

PGM (&FLLB &MBR &DOCNAM &MSG &IMPORTANCE &TOINTNET)

     DCL &FLLB       *CHAR    30
     DCL &MBR        *CHAR    10
     DCL &DOCNAM     *CHAR    12
     DCL &MSG        *CHAR   256
     DCL &IMPORTANCE *CHAR     7
     DCL &TOINTNET   *CHAR   866       /* 2 + 2*8 + (100+4+2)*8 */

     DCL &MSGDTA     *CHAR    50
     DCL &RCDLEN     *DEC     (7 0)
     DCL &WRKDOC#    *DEC     (7 0)
     DCL &WRKDOC#C   *CHAR     7
     DCL &WRKFILE    *CHAR    10
     DCL &FILE       *CHAR    10
     DCL &FLIB       *CHAR    10
     DCL &POS        *DEC  (5 0)
     DCL &TOFILELEN  *DEC  (5 0)

     DCL &WRKFLR     *CHAR    10    'CVTCSV '
     DCL &DTAARA     *CHAR    10    'CVTCSV '
     DCL &RCDLENC    *CHAR     5
     DCL &GPLNAME    *CHAR    10      'QGPL'
     DCL &SYSNAME    *CHAR     8
     DCL &NBRLST     *DEC     (5 0)
     DCL &POS1       *DEC     (5 0)
     DCL &POS2       *DEC     (5 0)
     DCL &COUNT      *DEC     (5 0)

     DCL &EML        *CHAR   100
     DCL &RCT        *CHAR     4

     DCL &PRI        *CHAR  1000
     DCL &CC         *CHAR  1000
     DCL &BCC        *CHAR  1000

     DCL &SNDDST     *CHAR  4000

     MONMSG  CPF0000 *N GOTO END

    IF ( %BIN( &TOINTNET  1   2 ) = 0 ) RETURN

     CHGVAR &FILE %SST(&FLLB 1  10)
     CHGVAR &FLIB %SST(&FLLB 11 10)

     CHKOBJ &FLIB/&FILE *FILE MBR(&MBR) AUT(*READ)

/*--------------------------------------*/
/* CREATE WORK FOLDER                   */
/*--------------------------------------*/

    CRTFLR &WRKFLR  TEXT('Work Folder to convert CSV file') AUT(*ALL)
    MONMSG  CPF0000

/*--------------------------------------*/
/* CREATE WORK FILE                     */
/*--------------------------------------*/

     CHKOBJ  &GPLNAME/&DTAARA *DTAARA
     MONMSG CPF9800 *N  DO
     CRTDTAARA &GPLNAME/&DTAARA TYPE(*DEC) LEN(7 0) +
               VALUE(0) TEXT(''For Generate Conversion File Name')    
     ENDDO

     RTVDTAARA   &GPLNAME/&DTAARA  &WRKDOC#
     CHGVAR      &WRKDOC#        ( &WRKDOC# + 1 )
     CHGDTAARA   &GPLNAME/&DTAARA  &WRKDOC#

     CHGVAR      &WRKDOC#C         &WRKDOC#
     CHGVAR      &WRKFILE        ( 'C' |< &WRKDOC#C )

     IF (&DOCNAM = '*GEN   ') DO
        CHGVAR  &DOCNAM   ' '
        CHGVAR  &DOCNAM  (&WRKFILE |< '.CSV')
     ENDDO

     IF (&DOCNAM = '*FILE  ') DO
        CHGVAR  &DOCNAM   ' '
        CHGVAR  &DOCNAM  (&FILE |< '.CSV')
     ENDDO

(1)

 
/*--------------------------------------*/
/* SET  RECORD LENGTH OF WORK FILE      */
/*--------------------------------------*/

     DLTF    QTEMP/&WRKFILE
             MONMSG  CPF0000
     CRTPF   QTEMP/&WRKFILE  RCDLEN( 1 )

     OVRDBF  &FILE  &FLIB/&FILE MBR(&MBR) NBRRCDS(1)
     CPYTOIMPF  (&FLIB/&FILE &MBR) +
                 TOFILE(QTEMP/&WRKFILE) MBROPT(*REPLACE) +
                 STRDLM(*NONE)

     MONMSG  CPF2817 *N  DO
        CALL     RTVSQLLOGR  ('SQL0404'  &MSGDTA)
        CHGVAR  &POS         ( %BIN(&MSGDTA  1 2) + 5 )
        CHGVAR  &TOFILELEN    %BIN(&MSGDTA  &POS  2)
        CHGVAR  &RCDLENC      &TOFILELEN
     ENDDO

     DLTOVR  &FILE
     DLTF    QTEMP/&WRKFILE
             MONMSG  CPF0000

 CRTWRKFILE:

     CHKOBJ QTEMP/&WRKFILE  *FILE
     MONMSG CPF9800 *N  DO
            CRTPF   QTEMP/&WRKFILE  RCDLEN(&RCDLENC)
     ENDDO

/*--------------------------------------*/
/* CONVERT DATA  (TO CSV )              */
/*--------------------------------------*/

     CLRPFM     QTEMP/&WRKFILE

     CPYTOIMPF  (&FLIB/&FILE &MBR) +
                 TOFILE(QTEMP/&WRKFILE) MBROPT(*REPLACE) +
                 STRDLM(*NONE)

/*--------------------------------------*/
/* COPY FILE TO DOCUMENT                */
/*--------------------------------------*/

   CPYTOPCD QTEMP/&WRKFILE TOFLR(&WRKFLR) TODOC(&DOCNAM) REPLACE(*YES)
 

(2)

 

/*--------------------------------------*/
/* GET MAIL ADDRESS AND TYPE            */
/*--------------------------------------*/

     CHGVAR   &COUNT   0
     CHGVAR   &NBRLST  %BIN( &TOINTNET  1   2)
     CHGVAR   &PRI     ' '
     CHGVAR   &CC      ' '
     CHGVAR   &BCC     ' '
     CHGVAR   &POS1    0
     CHGVAR   &POS2    0

   LOOP:

     CHGVAR        &COUNT       ( &COUNT + 1          )
     CHGVAR        &POS1        ( 2  + &COUNT * 2 - 1 )
     CHGVAR        &POS2  ( %BIN( &TOINTNET &POS1   2 ) + 1 + 2 )
     CHGVAR        &EML     %SST( &TOINTNET &POS2 100 )
     CHGVAR        &POS2        ( &POS2  + 100        )
     CHGVAR        &RCT     %SST( &TOINTNET &POS2   4 )

   IF (&EML *NE '*NONE') DO
     IF (&RCT = '*PRI') CHGVAR &PRI (&PRI|< '('''|< &EML |< ''' *PRI)')
     IF (&RCT = '*CC ') CHGVAR &CC  (&CC |< '('''|< &EML |< ''' *CC )')
     IF (&RCT = '*BCC') CHGVAR &BCC (&BCC|< '('''|< &EML |< ''' *BCC)')
   ENDDO

   IF ( &COUNT < &NBRLST ) GOTO LOOP

/*--------------------------------------*/
/* SEND DOC BY SNDDST                   */
/*--------------------------------------*/

   CHGVAR  &SNDDST +
         ('SNDDST TYPE(*DOC) +
            TOINTNET('|< &PRI        |<   &CC   |<   &BCC  |< ') +
                DSTD('|< &DOCNAM     |<') +
               MSG('''|< &MSG        |<''') +
                 DOC('|< &DOCNAM     |<') +
          IMPORTANCE('|< &IMPORTANCE |<') +
              CFMDEL( *YES              ) +
                 FLR('|< &WRKFLR     |<')')

   CALL QCMDEXC  (&SNDDST  4000)

   SNDPGMMSG  MSG( &SNDDST ) MSGTYPE( *COMP )

(3)

/*--------------------------------------*/
/* Delete Work File and Doc.            */
/*--------------------------------------*/

  DLTF       QTEMP/&WRKFILE
             MONMSG  CPF0000

END:

RETURN
ENDPGM

(1)フォルダーとドキュメント名の準備

簡単なので、説明は省きます。

(2)データをCSV化する

ここで、CPF2817でモニターしているのは、ちょっと、わけがあります。この最初のCPYTOIMFでは、わざとエラーを起こさせています。よく見ればわかりますが、レコード長1のファイルにコピーしています。さらに、そのときのメッセージで「長さは...であるべき」の...の部分を取り出しています。詳しくは、13.9.SQLのログを取り出そうを見てください。

(3)SNDDSTのコマンドの実行

メールアドレスをパラメータでもらい、SNDDSTに入れる際、*PRI, *CC, *BCCの指定をそのまますると、うまくコマンドが解釈してくれないので、QCMDEXCを使っています。CSVを添付ファイルにして、メールを送るので、TYPEは*DOCですね。

なお、SUBJECTを入れていないので、それを入れたほうが、受取人の人は助かるでしょう。

2002-4-28


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送