AS/400(1) - AS/400 (2)
でつないでいて、(1)で、開発した、ファイルのサイズ情報を収集するプログラムを、(2)にコピーして、さて、どうやって実行しようかななんて、思っているときは、FTPでRCMDを使ってみましょう。 つまりは、(1)から、(2)へFTPでログインして、プログラム実行して、ファイルを(1)へコピー(つまり、(1)から見て、GET)をすることで解決します。
1.
データ作成 by an RPG on Remote Machine 2.作成されたデータの取り出し
by GET
を、(1)からするのですね。まるで、(1)でRJEを起動しているかのようなものです。 最初にソースファイルを作成します。レコード長は92でも、112でもかまいません。また、作成するメンバータイプはTXTにしましょう。残念ながら、FTPコマンドを解釈して、編集エラーなどの検査をしてくれる機能はないので、プレーンな、TXTにするしかないのです。
手順1... FTPコマンドの準備
File : QFTPSRC ,Source Member : GETXXXX
0001.00 FTPUSER XXXXX
0002.00 BINARY
0003.00 CD XXXLIB
0004.00 QUOTE RCMD CALL XXXXXXXXX
0005.00 GET XXXLIB/FILE XXXLIBP/FILE.XXXX (REPLACE
0006.00 QUIT |
解説
0001.00 これは、このFTPのジョブが、相手のFTPサーバーにログインするときのユーザー名+パスワードです。この処理を通過すると、相手側にFTPのジョブができます。よく勘違いしている人がいますが、手動にてFTPを開始して、QUOTE
RCMD DSPJOBLOGをしても、それを実行しているJOBLOGが出てくるわけではなく、ログオン先のマシン(FTPサーバー側)に、そのスプールが出ています。したがって、QTEMPの所属も、実行元(クラインアント)ではなく、相手のサーバー側です。 0002.00 ここでは、AS/400
- AS/400間で考えていますので、無変換(Binary)です。 0003.00
これは、本当は無くてもいいのですが、実行環境にライブラリーXXXLIBを入れています。確か、CURLIBになっていると思います。 http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIQCD.HTM#HDRRZAIQCD 004.00 ここがポイントの1です。データをログオン先のあるファイルに書き出すプログラムを呼び出しています。CLPなどで、環境設定を含めるものを呼び出す方が合理的でしょう。また、MONMSGはきちんとしましょう。 http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIQRCMD.HTM#HDRRZAIQRCMD 0005.00
ここがポイントの2です。作成されたデータを、GETコマンドで、取り出しています。 http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIQGET.HTM#HDRRZAIQGET 0006.00
ログオフです。
手順2 ... バッチでFTP実行
PGM RMVM QFTPSRC MBR(GETXXXXLOG) OVRDBF INPUT QFTPSRC MBR(GETXXXX) OVRDBF OUTPUT QFTPLOG MBR(GETXXXX) FTP (' ホスト名やipアドレス') DLTOVR (INPUT OUTPUT) ..... LOGの内容から、実行が正常か判断するプログラムを流す ENDPGM |
INPUTやOUTPUTは、決まりごとです。
-
INPUTは、FTPジョブに与えられるコマンドを指定します。上記の例では、手順1の内容が、1行1ジョブステップとして手渡されます。
-
OUTPUTは、上記のジョブのログのエコーを記録します。上記の例では、コマンドを含むソースファイルと同じファイルで異なるメンバーに書き出しています。基本的にレコード追加のみなので、最初にRMVMしています。
※余談ですが、CLRPFM は、内部的には、RMVM + ADDPFMをしているだけのようです。
-
上記のようにした後で、FTPを開始すると、バッチで、ジョブを実行してくれます。
-
応用として、相手のライブラリーをSAVFに保管して、そのSAVFをGETする、という方法も考えられます。確か、前の会社でそんなことをしていました。
>Z君元気?
さらにもう一歩
エラーの出方
こんな感じになります
File Transfer Protocol
Previous FTP subcommands and messages:
> QUOTE RCMD CHGJOB LOGCLPGM(*YES)
250 Command CHGJOB LOGCLPGM(*YES) successful.
> QUOTE RCMD CALL TESTCL
550-Error occurred on command CALL TESTCL.
550 TEST.
> QUOTE RCMD DSPJOBLOG
250 Command DSPJOBLOG successful.
> QUOTE RCMD CALL TESTCL
550-Error occurred on command CALL TESTCL.
550 Function check. CPF1023 unmonitored by TESTCL at statement 200,
instruction X'000C'..
> QUOTE RCMD DSPJOBLOG
250 Command DSPJOBLOG successful.
Enter an FTP subcommand.
===>
F3=Exit F6=Print F9=Retrieve
F17=Top F18=Bottom F21=CL command line
|
FTPの実行環境
QTCPライブラリーの中のCLSを見てください。実行優先順位35、タイムスライシング2000、パージ*YESとなっています。対話型が実行優先順位20である点を除いては、省略値の対話型と同じ設定です。
バッチジョブ < FTPジョブ < 対話型ジョブ
の図式になります。気をつけてください。 追加
2002-5-4 Default wait Timesecondsにも注意してください。クラスのなかの値です。QINTERと比較してみてください。 そうそう、カXボウのシステム関係って技術力は期待できないようですね。気をつけてください、偽者って、結構多いのがこの業界ですよね。
FTP版DSPJOB
実行されるFTPサブコマンドで、STATを入れておき、あとで、LOGを見ると、問題解決になることがあります。
FTPセッションからコマンド入力
対話型FTPで、デバッグ中、どうしても、そのまま、ライブラリーや、ファイルの中身を見たくて、システムコマンド(DSPPFMなど)を使いたくなったら、
SYSCMD CALL QCMD
を使います。この例でよくわかると思いますが、SYSCMDは、クライアント側(ローカル内)でのコマンド実行です。(QUOTE
RCMDの逆です。)
タイムアウト
ところで、RCMDで、あまり長く実行されてしまうと、タイムアウトが起きます。てっきり、
QUOTE RCMD TIME 10000 10000
とかで、一時指定変更できるのかと思うと、そうではなく、時間にあると、応答が無いので、セッションが終わってしまいます。すぐに終わるプログラムなら問題ありません。 上記の例で、
QUOTE RCMD CALL PGMA * Time Out GET
file file
という状態で、GETまでいかない場合は、このPGMAのなかで、新たなFTPセッションを開き、今度は相手から、こちらに向けて、PUTする手があります。ややこしいのですが、 前提
このプログラムPGMAはあらかじめ同じものを、FTPクライアントのみならず、FTPサーバー側に作成済みであることが前提です。 この例では、
FTPクライアント: SYSAAA FTPサーバー:
SYSBBB, SYSCCC
となっており、3台のAS/400があることを前提とします。また、各マシンの上で作成されたデータは、SYSAAAに集積される前提です。
PGMA (SYSAAA)
PGM
DCL &SYSNAME *CHAR 8
DCL &GPLNAME *CHAR 10
MONMSG CPF0000
RTVNETA SYSNAME(&SYSNAME)
IF ( &SYSNAME = 'SYSAAA' ) CHGVAR &GPLNAME 'AAALIB'
ELSE IF ( &SYSNAME = 'SYSBBB' ) CHGVAR &GPLNAME 'BBBLIB'
ELSE IF ( &SYSNAME = 'SYSCCC' ) CHGVAR &GPLNAME 'CCCLIB'
CHGCURLIB &GPLNAME
CALL PGMB /* 転送されるデータの作成 */
IF ( &SYSNAME = 'SYSAAA' ) DO
RMVM &GPLNAME/QFTPLOG MBR( CKLSTP )
OVRDBF INPUT &GPLNAME/QFTPSRC MBR( CKLSTP )
OVRDBF OUTPUT &GPLNAME/QFTPLOG MBR( CKLSTP )
FTP RMTSYS(SYSBBB)
DLTOVR *ALL
RMVM &GPLNAME/QFTPLOG MBR( CKLSTP )
OVRDBF INPUT &GPLNAME/QFTPSRC MBR( CKLSTP )
OVRDBF OUTPUT &GPLNAME/QFTPLOG MBR( CKLSTP )
FTP RMTSYS(SYSCCC)
DLTOVR *ALL
ENDDO
IF ( &SYSNAME = 'SYSBBB' ) DO
RMVM &GPLNAME/QFTPLOG MBR( CKLSTP )
OVRDBF INPUT &GPLNAME/QFTPSRC MBR( CKLSTP )
OVRDBF OUTPUT &GPLNAME/QFTPLOG MBR( CKLSTP )
FTP RMTSYS(SYSAAA)
DLTOVR *ALL
ENDDO
IF ( &SYSNAME = 'SYSCCC' ) DO
RMVM &GPLNAME/QFTPLOG MBR( CKLSTP )
OVRDBF INPUT &GPLNAME/QFTPSRC MBR( CKLSTP )
OVRDBF OUTPUT &GPLNAME/QFTPLOG MBR( CKLSTP )
FTP RMTSYS(SYSAAA)
DLTOVR *ALL
ENDDO
RETURN
ENDPGM |
AAALIB/QFTPSRC.CKLSTP (SYSAAA内)
XXXXXXXXX PPPPPPPP
STAT
QUOTE RCMD CALL PGMA
QUIT |
BBBLIB/QFTPSRC.CKLSTP (SYSBBB内)
XXXXXXXXX PPPPPPPP
BINARY
STAT
PUT XXX/CHKLSTP AAALIB/CHKLSTPN
QUIT |
CCCLIB/QFTPSRC.CKLSTP (SYSCCC内)
XXXXXXXXX PPPPPPPP
BINARY
STAT
PUT XXX/CHKLSTP AAALIB/CHKLSTPS
QUIT |
関連記事:19.14.バッチFTPサンプル
2002/2/24 |