AS/400展望台

RPGプログラマを楽にするCGIDEV



ジェフ・サザーランド著

RPGプログラム中でHTMLをハンド・コードすることなく、ダイナミックなWebページを簡単に作成する。

CGIDEV、実際にはCGIDEV2ですが、この最新バージョンがフリーのWeb開発ツールキットであるEasy400の一部としてIBMから提供されています(www-922.ibm.com)。CGIDEV2はIBMのAPI用の使いやすいラッパーなどRPGの開発者の作業を楽にするためのいろいろなプロシージャを提供するサービス・プログラムです。CGIDEV2は、HTMLページをRPGプログラムにテンプレートとして取り込む方法、変数を置換する方法、HTMLページの取り消しを送信する方法を提供します。HTMLテンプレートを取り込むということは、RPGプログラム中に自分でコーディングした文を含んだHTMLを書かなくてよいということです。CGIDEV2とHTMLを使用するということはgreen-screenアプリケーションでDDSを使用するのと同じくらい簡単であるということです。

IBMは、特にWebプログラムを開発したいというRPGプログラマ向けのツールキットを設計しました。CGIDEV2はILEですので、Cobolにも使えるのです。このツールキットは使い勝手が良いだけではなく、誰もがすばやく使いこなせるようにできるよういくつかのサンプルも提供しています。

KOA社ではどのようにWeb開発を行っているか
KOA社では、Web開発用に2つのツールを使用します。我が社ではIBM iSeriesのNet.Dataを最初に使い、今でも使用しています。Net.DataはiSeries上でWeb開発を行うためのCLです。Net.Dataは容易に習得できて使いやすく、 SQL文経由でDB2/400のファイルにフルにアクセスすることができ、iSeriesアプリケーションとの間でデータの送受信を行うための方法を提供しています。

Net.Dataのマクロ(つまり、ソースコード・ファイル)はコンパイルされません。その代わり、HTTPサーバーがマクロ・ファイルを解釈するので、ソース・マクロの変更とその結果の確認が容易に行えます。もちろん、コンパイルされないアプリケーションのマイナス面は、不正な文などといったコード上の問題がアプリケーションを実行させるまではわからないということです。しかも解釈されたコードは通常コンパイルされたコードよりも実行速度が遅くなります。

しかし、KOA社で開発するWebアプリケーションに求められるものの中には、Net.Dataでは扱いにくいものもあります。たとえば、複数のファイルにアクセスして各ファイルから1つあるいは少数のレコードを取得する必要のあるアプリケーションは、SQL文では手に負えません。我々にとって、RPGではCHAINやSETLL/READシーケンス以上に簡単なデータ・アクセス手段はないので、CGIDEV2が登場するというわけです。RPGの優れた文字列処理や日付処理の組み込み関数(BIF)もなかなかのものです。

KOA社では、今でもこれら2つのツールを使用しています。簡単なWebアプリケーションで、入力を受け取ってデータのリストを返すようなSQL文1文でできるような場合はNet.Dataを使います。入出力を提供するテーブルを含むような(DDSサブファイルと比較して)もっと複雑なデータベースやユーザー・インタフェースを必要とする場合は、CGIDEV2に救いを求めます。

CGIDEV2の例
RPGとHTMLを少しとCGIDEV2を使って、項目の検索をし、ブラウザをUIメソッドとして使う簡単な例を見てみましょう。私は通常プロジェクトでまずUIから取り掛かります。ユーザーがアプリケーションとどのようにやり取りするのかを設計し、次にバックエンドを開発するというやり方が好みなのです。UIを設計するときは、RPG、HTML、CGIDEV2はまだ使いません。

ここで紹介するアプリケーション例では、UI用のページが3ページ必要です。最初のページは、ユーザーに項目番号を入力させるためのプロンプトを表示します(図1)。2番目のページは項目が見つかったときの結果を表示します(図2)。3番目のページは項目が見つからなかったときにユーザーが受け取るエラー・ページを表示します(図3)。

このアプリケーションでは、WDSc Web設計ツール、Page Designerを使いました。このツールには今までのところ良い印象をもっていますが、好きなWeb設計ツールなら何でも構いません。図4は、項目検索のプロンプトと結果表示用のページをWDScのWYSIWYGレイアウト・ツールに表示させているところです。HTMLはなるべく簡単になるようにしました。実際のアプリケーションでは、カスケーディング・スタイル・シート(CSS: Cascading Style Sheets)を使用したり、もっと色を使ったり、他の設計エレメントを使用したりすることになるでしょう。しかし、図1図2図3でおわかりの通り、ユーザー・インタフェースに色と画像を少し使いました。

図5 はitemlookup.htmlファイルの内容を表示したもので、項目検索用のプロンプトと結果表示用のフォームのHTMLが含まれています。図6 はerrorforms.htmlファイルの内容を表示したもので、エラー表示用のフォームのHTMLが含まれています。CGIDEV2を使用すると、1つのソースファイル中に任意のページ数のWebページを置くことができ、/$マーカーを使って各フォームやページを分離します。たとえば図5に示す通り、initialformとresultformの2つのフォーム・テンプレートを1つのHTMLファイル中で設計しました。これらのフォームをRPGプログラムに組み入れる方法については後述します。

/%price%/のような/%variable_name%/マーカーに注意してください。CGIDEV2は変数プレースホルダを使用するので、RPGでは変数名に値を入れることができます。ディスプレイ・ファイルではこのプレースホルダをフィールドとみなしてください。

ユーザー・インタフェースの設計が終わったら、RPGプログラムを作成します。プログラムのロジックは次の通り簡単です。

 1. プロンプト・フォームを表示する(図1)。
 2. ユーザーが項目番号を入力して[検索]ボタンをクリックするのを待つ。
 3. HTMLフォームから項目番号を取り出す。
 4. 項目マスター・データベース・ファイルの中から項目番号を検索する。
 5. 以下のように結果を戻す。
  a. 項目が見つかった場合、項目の画像などの項目情報を表示する(図2)。
  b. 項目が見つからなかった場合、フォーム中にエラー・メッセージを戻します。
   フォームには[再検索]ボタンがあり、もう一度検索したいときにクリックすると
   ステップ1に戻ります(図3)。

図7 にITEMLOOKUPプログラムのRPGソースコードを示します。ITEMLOOKUPはiSeries上でコンパイルされ、Webサーバーがユーザーに項目番号を入力させたり、項目情報を表示したり、項目が見つからなかったときにエラー・ページを表示したりする必要があるときはいつでも呼び出されます。フォームのアクション・パラメータ(図5中のA)は呼び出すサーバー・プログラムを指定しています。

ソースコードをステップごとに見ていきましょう(以下に示す項目の文字は図7に文字で示したセクションに対応しています)。

A. もちろんCGIDEV2とRPGではDB2/400のすべてのファイルに簡単にアクセスできます。ファイルの場所を指定しました。一般的に、プログラマが最初にCGIやWebアプリケーションを始めるときにライブラリ・リストの問題が生じます。ファイルがCGIライブラリ中にない場合、EXTFILEキーワードを使用するか、またはWebサーバーのジョブ・ライブラリ・リストでライブラリを手作業で更新してファイルが確実に見つかるようにしなければなりません。

B. CGIDEV2用のプロトタイプと変数が1つ以上のコピー・メンバーと登場します。

C. このアプリケーション用に定義する必要のあった変数はこの2つの作業用変数だけです。

D. このコードはCGIDEV2のバッファをクリアし、私たちが作成したHTMLフォームを組み入れています。GetHtmlifsMultの呼び出しは、複数のディスプレイ・ファイルをオープンしていると考えてください。GetHtmlifsMultサブ・プロシージャは一回の呼び出しで複数の外部定義HTML IFSファイル(すなわちストリーム・ファイル)をメモリ中に読み込みます。

E. このステップは重要です。Webサーバーが私のプログラムに対してリクエスト・フォーム・フィールドに何かを送り返す場合、その値を取り出すことができます。そのリクエストが何も取り出せなかった場合は、それがアプリケーションに対する最初のリクエストであり、図1に示す最初のフォームを表示しなければならないことがわかります。フォームがブラウザに表示されると、Requestという隠しフィールドに「lookup」という値が入っている点に注意してください(図5のB)。ユーザーが項目番号に値を入力して[検索]をクリックすると、Requestフォーム・フィールドには「lookup」という値が入り、ここに示すステップで私のアプリケーションがその値を取り出します。こうしてようやく項目マスター・データベース・ファイルであるITEMS1ファイルで番号を検索できることがわかります。

F. SELECTロジックの部分に入るとき、Requestフィールドの値に基づいて検索をしなければならないことがわかります。検索を実行するには、ユーザーがWebフォームの項目番号エントリ中に入力した値をZhbGetVar呼び出しを使って取り出します。その結果はITEMS1のNumberフィールドに入れられます。ファイルを見に行ってその結果によってどうするかを決めます。

G. 項目番号が見つかりました。次にupdHTMLVarプロシージャを使ってブラウザに戻すHTML変数の値を計算します。たとえば、updHTMLvar('desc' : descript );はdescriptの値を使って、表示するフォーム中で/%desc%/を参照している個所を更新(つまり置換)します。このプロセスの終わりで、WrtSectionプロシージャに対してHTMLソースからのフォームの名前を使ってフォームをブラウザに書き戻します。簡単ですね!

H. 項目番号が見つかりません。この場合、updHTMLVarプロシージャを使って、エラー・メッセージ・フォーム中の/%number%/を更新し、WrtSectionプロシージャを使ってエラー・フォームを書き出します。

I. Requestフィールドに「lookup」以外の値が入っている場合は、最初のフォームを表示して項目番号を入力させます(図1)。

J. すべて終了です。WrtSection('*fini')はCGIDEV2で使用され、処理中の作業がすべて終了したのですべての出力をブラウザに返さなければならない、ということを示します。最後にちょっとした後片付けです。すべてのファイルを閉じてください。

このソースコードをレビューすると、アプリケーションがブラウザUIを使用できるようになるまでそう大変ではないとおわかりいただけると思います。しかも個々でご紹介した例は比較的簡単なものではありますが、KOA社ではsubfile入出力アプリケーションに似たアプリケーションをCGIDEV2を使用して開発しています。CGIDEV2アプリケーションを作ってみてうまく動けば、この便利でしかも無料のツールを他のアプリケーションにも使ってみたくなるでしょう。IBMのCGIDEV2のウェブサイト(www-922.ibm.com/easy400p/framer1.html?url=/cgidev2/start)も忘れずに訪れて、そこに掲載されている例をご覧になってください。我々もそうしてCGIDEV2をすばやく学習しました。

CGIとは何か、どのように動作するのか?
CGIはCommon Gateway Interfaceの略で、i5上のApacheやWindows上のMicrosoft IISなどといった、あらゆるプラットフォーム上で実行されるWebサーバーとブラウザがやり取りするための標準的な方法です。CGIを使用すると、ユーザーがリクエストを出してそれに対する結果が返ってくるといった、ダイナミックなWebページを作ることができます。ダイナミックなWebページは、毎回同じ情報が表示される静的なWebページとは異なります。

CGIは次のように動作します。Webサーバー上で、1つ以上のCGIアプリケーション(つまりプログラム)によりリクエストが生成されます。サーバー側のCGIアプリケーションがリクエストを受け取ると、それを実行して結果のページを表示します。通常は、サーバーがCGIアプリケーションを使用していると、次の例のように、URLには「cgi」とか「cgi-bin」などといった文字列が含まれます。

http://www.mywebserver.com/cgi-bin/mywebapp?parm1=12345&parm2=zipcode.

上記のようなURLがi5のWebサーバー上で使用されると、「cgi-bin」の部分がリクエストをサーバー側のcgi-binアプリケーションへ送ります。Webサーバー上では、cgi-binはCGIプログラムが格納されているライブラリにマップされます。その代わりとして、CGIアプリケーションはURLが指定したMYWEBAPPプログラムを呼び出し、プログラムにparm1とparm2という2つの変数を渡します。

上記で紹介したアプリケーションはi5の言語であればどれでも記述することができますが、RPGで書くのが良い選択です。このアプリケーションはi5サーバー上で実行でき、parm1とparm2という変数にアクセスできます。変数parm1には「12345」という値が渡され、変数parm2には「zipcode」という値が渡されます。アプリケーション内では、アプリケーションに対して渡された変数にはIBMが提供するAPIを使用してアクセスし、Webブラウザに送り返す結果のページを準備してください。

ここで説明したアプリケーションではいくつかのAPIを使う必要があり、しかも複雑なAPIを使わなければならない場合もあります。どれくらい複雑かというと、これらのAPIを使用して出力をWebブラウザに返すには、DDSを使用せずにgreen-screen出力を準備するようなもので、長い文字列の中にすべての画面出力を準備することになります。やればできないことはありませんが、やる気をなくさせるような作業です。このような複雑なものであるため、KOA社ではCGIDEVの存在を初めて聞いたときに大変興味を持ったのです。

ジェフ・サザーランド氏はベル・データ鰍フ提携先、米Penton Media, Inc.が発行するiSeries NEWS誌のテクニカル・エディタで、モンタナ州ビリングス市にあるKampgrounds of America社の情報サービス担当副社長です。




↑このページのトップへ
TOPPAGE

BELLDATA, Inc. Copyright reserved.