Discover AS/400

AS/400に関する覚書

意外に簡単なRPGでWEB(入力PGM編)

「意外に簡単なRPGでWEB(照会PGM編)」では簡単な照会PGMの開発例を紹介しました。

この記事では、簡単な入力PGMの例を紹介していきます。
実際に開発しての感想ですが、機能としては簡単なものですがコーディングは、タイトルに反して難しいものとなってしまいました。

「意外に簡単なRPGでWEB(照会PGM編)」の記事を読んでいない方は、読んでみてください。

では、今回作成するアプリケーションの全体像ですが、商品マスターのメンテナンスです。
【第1画面】固定的なhtmlより商品コードを入力します。
【第2画面】第1画面よりcgiが起動されて、AS400上の商品マスターを参照した結果のhtmlを出力する。メンテナンス後更新ボタンを押します。
【第3画面】更新完了画面。

■詳細作業

1)第1画面のhtmlソースの作成【レイアウト】
  以下のhtmlをIFS上の/MYWEB/T0101.htmで保管します。
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>商品編集</title>
</head>
<body>
<p>商品編集</p>
<form method=GET action="/cgi-bin/T0201">
<input type=hidden name=ACTION value=INIT>
<p>商品コード:<input type="text" name="SHSHCD" size="20"></p>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>

ここでのポイントは、formタグのaction=/cgi-bin/T0201です
cgi-binはAS400のWRKHTTPCGHで以下のような定義を行っています。
   EXEC /cgi-bin/* /QSYS.LIB/MYLIB.LIB/*

この画面より商品コードに00000001を入力ご送信ボタンをおすと、以下のようなurlが実行されます。
   http://192.168.1.1/cgi-bin/T0201?ACTION=INIT&SHSHCD=00000001
HTTPCFGでcgi-binはMYLIBに設定しているので、このurlリクエストでMYLIB/T0201のプログラムが起動されます。

2)ソースファイルの作成
   CCSID=5035のソースファイルを作成します。作成するメンバーはILE-RPGですのでRPGLEソースを作ります。
> CRTSRCPF FILE(MYLIB/QRPGLESRC) RCDLEN(112) IGCDTA(*YES) CCSID(5035)
ライブラリー MYLIB にファイル QRPGLESRC が作成された。

3)RPGソースの作成
CCSID5035のプログラムを作成するので、エミュレータのコードページを939英数小文字に設定して、サインオン後にCHGJOB CCSID(5035)のコマンドで環境を5035にします。
ソースの登録を行います。   ここからダウンロード→RPG DDS

照会の例との違いは、第2画面を最初に表示するのは一緒なのですが、更新部分が追加になっています。
1つのRPGで初期表示と更新アクションの両方を行っています。
RPGでそれを判断するのが、HTMLで定義している"ACTION"という変数です。
・ACTION=INITの場合DBからセットして表示させます。
・ACTION=CHCKの場合、ブラウザーから入力されたデータをDBに更新します。
※チェックルーチンはこの例ではHTML上でJavaScriptで行っています。

各サブルーチンでは以下の働きをしています。
・STDIN:ブラウザーからの受け取るパラメータを取得してます。(一般的なCGIではPARSEといいます)
・DECODE:ブラウザーから漢字のフィールドを受け取り直後はSJISで入っているので、IBM漢字に変換しています。(一般的なCGIではDECODEといいます)
・HTMLOUT1:ACTION=INITの時のHTMLの出力を行っているサブルーチン
・HTMLOU2:ACTION=CHCKの時、更新後画面をHTML出力します。
・UPDT:DBの更新を行います。

4)コンパイル
PF,RPGをコンパイルします。
  > CRTPF MYLIB/WMSH MYLIB/QDDSSRC
ライブラリー MYLIB にファイル WMSH が作成された。
メンバー WMSH が MYLIB のファイル WMSH に追加された。
> CRTRPGMOD MODULE(MYLIB/T0201) SRCFILE(MYLIB/QRPGLESRC) DBGVIEW(*ALL)
モジュール T0201 がライブラリー MYLIB に入れられました。最高の重大度は
00 。 04/05/16 の 09:00:00 に作成されました。
> CRTPGM PGM(MYLIB/T0201) BNDSRVPGM(QTCP/QTMHCGI)
プログラム T0201 がライブラリー MYLIB に作成された。

5)実行
ブラウザーのアドレス欄に第1画面のhtmlを指定する。
   http://192.168.1.1./MYWEB/T0201.htm

ここでブラウザー上に表示されない場合には、以下を確認してみましょう。
・urlが間違っていないか。
・HTTPCFGの確認(ポート番号など指定していないか)
・httpサーバーを起動しているか。

表示された場合には、商品コードを入力して送信ボタンを押します。

第2画面が出ない場合は、「AS/400 V3 TCP/IP機能とインターネット」研修用資料 の7章に載っているデバッグを行ってみてください。

この例題で商品名称のデコードを行っていますがもう少し詳しく記述します。
WEBではURL欄で使用できる文字コードは7BIT-ASCII(128文字)だそうです。


漢字は数千字なので到底7BIT-ASCIIでは表現し切れません。
そこで、”%xx”で16進で表現することで、漢字なども表現できているようです。

以下で例を示します。
・WEBでの入力:
・url欄での文字列:%83p%83i%83%5C%83j%83b%83N%82b%82c%83v%83%8C%83C%83%84%81%5B

各文字をurlエンコードと対比すると
パ=%83p
ナ=%83i
ソ=%83%5C

各文字を16進にすると
パ=x'8370'
ナ=x'8369'
ソ=x'835C'
このようになります。

つまり%の後ろ2つのキャラクターは16進で表現された1バイトです。%がついていない場合はそのままのキャラクターの文字コードが使用されるようなルールの様です。
サンプルソース中のDECODEサブルーチンは%の後ろの2つのキャラクターを1バイトにするために16進変換しています。%がついていない場合にはそのまま1バイトを使用します。
それらのSJISの文字列をQDCXLATEのAPIを使用してIBM漢字へ変換しています。

HOME : TOP

Category

Archive