先の 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を作成するときは、より効果を発揮します。