意外に簡単な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で保管します。
ここでのポイントは、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ソースを作ります。
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をコンパイルします。
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進で表現することで、漢字なども表現できているようです。
サンプルソース中のDECODEサブルーチンは%の後ろの2つのキャラクターを1バイトにするために16進変換しています。%がついていない場合にはそのまま1バイトを使用します。
それらのSJISの文字列をQDCXLATEのAPIを使用してIBM漢字へ変換しています。
この記事では、簡単な入力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'
このようになります。
サンプルソース中のDECODEサブルーチンは%の後ろの2つのキャラクターを1バイトにするために16進変換しています。%がついていない場合にはそのまま1バイトを使用します。
それらのSJISの文字列をQDCXLATEのAPIを使用してIBM漢字へ変換しています。