先の CGI003 は正しく動作するものの、漢字の入力では処理が更に困難となり、文字化けの発生の可能性もある。
更には将来の保守や拡張も困難であることは理解されたと思います。
それではこれらの問題点を EnterpriseServer ではどのように解決されるのでしょうか?
まず CGI003 でも CGIの内部に配列として HTMLテンプレートを用意して、これに値を埋め込むという
汎用的な手法を試みましたが、更に一歩進めてHTMLを外部のテンプレートとすれば、保守が容易になることが
期待されます。しかもIFSにASCIIのままで保存しておけばEBCDIC から ASCIIへの変換のオーバーヘッドを生じることもありません。
IFS (Integrated File System) とは System i の UNIX互換のファイル・システムのことです。
IFSについては前述で既に学習されているはずです。
EnterpriseServer では 「RPGエンジン」と呼ばれるサービス・モジュールが提供されており
(RPGENGINE *SRVPGM)
QTCP/QTMHCGI
をバインドする代わりに ASNET.COM/RPGENGINE
というサービス・モジュールをバインドして、その提供されるプロシージャーを使用することができます。
EnterpriseServer では
( OPENHTMLというプロシージャーでオープンします。)
( SETFLDというプロシージャーによって埋め込みます。)
(WRITEプロシージャーによって出力します。)
ブラウザからの値の取得は CGIPARM
というプロシージャーだけで行います。
従来の CGI では CGI003 でご覧になったように
という作業が必要であり、これらがCGIを複雑なものにしていましたが「RPGエンジン」をバインドすることによってこれらの 1〜3の作業は全く必要でなくなります。 例えば RPG-CGI の中では
EVAL VALUE = CGIPARM('SHCODE ')
と、わずか一行だけ記述するだけで、RPGエンジンの中では必要なPERSE & DECODE
があなたに代わって
実行されます。
「Alaska」とは EnterpriseServer によって提供される日本語処理用のHTTPサーバーです。
Alaska は通常、日本語OS/400環境で使用されている CCSID=5026環境での動作が保証されています。
従って Alaska の利用によって
という利点があります。これらをまとめると、
というように欠点であったものが、長所となることになります。
さらに HTML & CGI のセットは「eStudio」という編集ツールによって Wizard生成 することもできます。
つまり公開データ・ペースがわかれば、わずか数分でとにもかくにも動作するCGI と HTMLの組み合わせを
生成することができます。
新規に開発するよりも、生成されたものを修正していくほうが効率的である場合が
多いものです。
それでは次に Enterprise Server のRPGエンジンをバインドした実例をご紹介しましょう。
次の CGI004 は eStudio の WebWizard というWizard生成機能 を使って自動生成されたCGIソースであり、人的な追加や修正は一切、行っていません。 この生成を行うのはわずか数分間だけの作業によるものです。
0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OFFICE QUATTRO CO,.LTD JAPAN 2002-') 0002.00 F********** 単票の表示 CGI ******************************************* 0003.00 FSHOHIN IF E K DISK USROPN 0004.00 F INFSR(*PSSR) 0005.00 F********************************************************************** 0006.00 /COPY ASNET.USR/QRPGLESRC,PROTOTYPE 0007.00 D RTVERR C CONST(' レコード検索エラー ') 0008.00 D NOTFOUND C CONST(' レコードが見つからない。 0009.00 C*----------------------------------------------------- 0010.00 C TRNKEY KLIST 0011.00 C KFLD SHCODE 0012.00 C****************************************************** 0013.00 C* メイン・ルーチン 0014.00 C****************************************************** 0015.00 C EXSR OPEN 0016.00 C 99 GOTO END 0017.00 C EXSR STDIN 0018.00 C SETOFF 99 0019.00 C TRNKEY CHAIN SHOHIN 99 0020.00 C *IN99 IFEQ *ON 0021.00 C EXSR ERRMSG 0022.00 C ELSE 0023.00 C EXSR CHECK 0024.00 C EXSR HTMLOUT 0025.00 C END 0026.00 C CLOF TAG 0027.00 C EXSR CLOSE 0028.00 C END TAG 0029.00 C SETON LR 0030.00 C RETURN 0031.00 C****************************************************** 0032.00 C STDIN BEGSR 0033.00 C****************************************************** 0034.00 C*( HTML からの標準入力されたフィールド値の受け取り ) 0035.00 CSR EVAL TEMPLATE = CGIPARM('@TEMPLATE ') 0036.00 CSR MOVEL TEMPLATE FLD7 7 0037.00 CSR FLD7 CABEQ '*ERROR*' END 0038.00 C*( HTML からフィールド値の取得 ) 0039.00 CSR MOVE *BLANKS VALUE 0040.00 CSR EVAL VALUE = CGIPARM('SHCODE ') 0041.00 CSR MOVEL VALUE SHCODE 0042.00 C*( テンプレートを宣言 ) 0043.00 CSR EVAL RESULT = OPENHTML(TEMPLATE) 0044.00 CSR RESULT CABEQ FALSE CLOF 0045.00 CSR ENDSR 0046.00 C****************************************************** 0047.00 C CHECK BEGSR 0048.00 C****************************************************** 0049.00 CSR ENDSR 0050.00 C****************************************************** 0051.00 C HTMLOUT BEGSR 0052.00 C****************************************************** 0053.00 C*( 出力イメージの HTML テンプレートにフィールド値を埋め込む ) 0054.00 CSR MOVE *BLANKS VALUE 0055.00 CSR MOVEL SHCODE VALUE 0056.00 CSR CALLP SETFLD('SHCODE ': VALUE) 0057.00 CSR MOVE *BLANKS VALUE 0058.00 CSR MOVEL SHNAME VALUE 0059.00 CSR CALLP SETFLD('SHNAME ': VALUE) 0060.00 CSR MOVE *BLANKS VALUE 0061.00 CSR MOVEL SHTANK VALUE 0062.00 CSR CALLP SETFLD('SHTANK ': VALUE) 0063.00 CSR MOVE *BLANKS VALUE 0064.00 CSR MOVEL SHSCOD VALUE 0065.00 CSR CALLP SETFLD('SHSCOD ': VALUE) 0066.00 C*( HTML の出力 ) 0067.00 C CALLP WRITE 0068.00 CSR WRTEND ENDSR 0069.00 C****************************************************** 0070.00 C OPEN BEGSR 0071.00 C****************************************************** 0072.00 C*( OVRDBF SHOHIN TOFILE(QTRFIL /SHOHIN ) 0073.00 C CALLP OVRDBF('SHOHIN ': 0074.00 C 'SHOHIN ': 0075.00 C 'QTRFIL ') 0076.00 CSRN99 OPEN SHOHIN 99 0077.00 CSRN99 SETON 81 0078.00 CSR ENDSR 0079.00 C****************************************************** 0080.00 C CLOSE BEGSR 0081.00 C****************************************************** 0082.00 C CALLP DLTOVR('SHOHIN ') 0083.00 CSR 81 CLOSE SHOHIN 99 0084.00 CSR ENDSR 0085.00 C****************************************************** 0086.00 C ERRMSG BEGSR 0087.00 C****************************************************** 0088.00 CSR MOVE 'CPF9898' MSGID 0089.00 CSR MOVE 'QCPFMSG ' MSGF 0090.00 CSR MOVE 'QSYS ' MSGLIB 0091.00 CSR MOVEL RTVERR MSGTXT 0092.00 CSR MOVEL NOTFOUND MSG 0093.00 CSR CALLP SNDERRMSG('RPGCGI': 'CHAIN' : MSGID : 0094.00 C MSGF : MSGLIB : MSGTXT : MSG) 0095.00 CSR ENDSR 0096.00 /COPY ASNET.USR/QRPGLESRC,PSSR
先の CGI003 の 344ステップに比べて 96ステップと 1/3 以下 の小さな CGIとなっています。
しかも今度は商品コードが見つからなかった場合は、予想できないエラーが発生した場合への
対策も追加されています。
ざっと眺めただけでは通常の適用業務でこれまで開発されてきたRPGプログラムとそんなに
変わるようでもありません。
CGI独自の PERSE や DECODEなどの処理が隠蔽されているからです。
0038.00 C*( HTML からフィールド値の取得 ) 0039.00 CSR MOVE *BLANKS VALUE 0040.00 CSR EVAL VALUE = CGIPARM('SHCODE ') 0041.00 CSR MOVEL VALUE SHCODE
によってHTMLからの入力値を受け取っています。
0042.00 C*( テンプレートを宣言 ) 0043.00 CSR EVAL RESULT = OPENHTML(TEMPLATE)
によってHTMLテンプレートをオープンして、
0053.00 C*( 出力イメージの HTML テンプレートにフィールド値を埋め込む ) 0054.00 CSR MOVE *BLANKS VALUE 0055.00 CSR MOVEL SHCODE VALUE 0056.00 CSR CALLP SETFLD('SHCODE ': VALUE)
によって値をHTMLテンプレートに埋め込んでいます。最後には
0066.00 C*( HTML の出力 ) 0067.00 C CALLP WRITE
によって HTML を ASCIIのままで出力しています。
ずいぶんとシンプルな CGI に出来上がりました。
従来の CGI003 に比べていかにスッキリとして贅肉の取れたようなCGIに仕上がっているのかが、
おわかり頂けたと思います。ご参考までに生成されたHTMLも次に紹介します。
<html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title> 商品マスターファイル </title> </head> <body> <center><h1> 商品マスターファイル </h1></center> <hr> <pre> <table cellpadding="1" cellspacing="0" border="0" bordercolor="#000000"> <REPORT> <tr> <td>商品 コード </td> <td>:</td> <td><FLD NAME=SHCODE>##########</FLD></td> </tr> <tr> <td>商品名 </td> <td>:</td> <td><FLD NAME=SHNAME>########################</FLD></td> </tr> <tr> <td>単価 </td> <td>:</td> <td><FLD NAME=SHTANK>#######</FLD></td> </tr> <tr> <td>品種 コード </td> <td>:</td> <td><FLD NAME=SHSCOD>####</FLD></td> </tr> </REPORT> </table> </pre> <a href="/AS400-NET.USR/PROJECT/CGI004/DB2_DSPDSPHED.HTM"> 検索条件の入力に戻る </a> </body> </html>
例えば、
CALLP SETFLD('SHCODE ': VALUE)
によるフィールド値の埋め込みは
<FLD NAME=SHCODE>##########</FLD>
の 「##########」
の部分に文字 「#」の個数 の分だけ埋め込みが行われるようになっています。
この外部HTMLテンプレートはブラウザでも出力イメージとして表示することができますし、
ホームページ・ビルダーやFrontPage などのHTML編集ツールによって編集することもできます。
(サブ・ファイルのような)リスト形式のHTMLを作成するときは、より効果を発揮します。