ウェブのレポートはご自分で!
情報を配布する際の鍵を握るメディアはレポートです。残念ながら我等が愛するIBM iサーバーでレポートを作成するとなるとその選択肢は、紙に印刷するかスプール・キュー上にある間に表示させるかのいずれかになります。どちらも満足できる方法ではありませんし、両方ともモダン化という現在の業界のトレンドとは相容れないものです。しかし、ちょっとしたテクニックを利用すれば既存のレポートをブラウザ上に簡単に表示させることができます。
本稿では、グリーンスクリーンのレポートを平易なHTMLドキュメントに変換してから機能豊富で見た目も美しい色鮮やかなHTMLドキュメントに変換する方法をご紹介します。こうした出力を得るのにはIFSの基本的な知識とHTMLの通り一遍の知識があれば十分です。
背景を少々
最初に知っておきたいのは、IBM iにはデフォルトのHTTPサーバーが構成されているということです。そのサーバーの名前はAPACHEDFTです。このサーバーは/www/apachedft/htdocsというパス名にあるIFSディレクトリにあるHTMLドキュメントを表示します。HTMLドキュメントは簡単なテキスト・ドキュメントにタグがついたものであり、そのタグを使ってテキストを指定された方法で表示するようにブラウザに指示します。たとえば、次のようなコードをテキスト・ドキュメントに入力し.html (または単に.htm)という拡張子を付けて保存するとHelloという文字が太字になってブラウザ上に表示されます。
<html> <head><title>Hello</title></head> <body> <b>Hello</b> </body></html>
このコードをDB2のソースファイルに入力してそのメンバー名をHELLOとします。以下のようにQHTMLSRCを作成することをお勧めします。
CRTSRCPF mylib/QHTMLSRC RCDLEN(500)
IFSコマンドCPYTOIMPFを使用してソース・メンバーを前述のIFSディレクトリにコピーします。
CPYTOIMPF mylib/QHTMLSRC hello '/www/apachedft/htdocs/Hello.html'
そして次のように、このドキュメントに対して*PUBLIC権限を付与します。
CHGAUT '/www/apachedft/htdocs/Hello.html' *RWX
ページを表示するにはブラウザのアドレス・バーにhttp://your_server/Hello.htmlと入力します。ここでyour_serverは使用しているIBM iのIPアドレスになります。または、CFGTCPコマンドでアクセス可能なホスト・テーブル・エントリ中に指定されているサーバー名を使用することもできます。
簡単なウェブ・レポート
一般的にブラウザは余白や改行、復帰などを空白文字として扱い、表示するときに圧縮します。グリーンスクリーンのレポートにこれが起こると列がばらばらになってしまいます。レポートのフォーマットを維持するためにはHTMLの<pre>というタグを使います。このpreはpreformattediの省略形です。グリーンスクリーンのレポートのテキストを<pre>と</pre>の間に入れれば列の間隔と揃えを維持することができます。さらにレポートのテキストを<pre>タグで終わるヘッダーHTMLと</pre>で始まるフッターHTMLで囲んでおきます。HTMLソース・ドキュメントは図―1のコードのようになります。
図―2はこのレポートをブラウザ上に表示したもので。図―2のHTMLレポートはまだ見た目はきれいなものではありませんが、緑色のバーの紙に印刷したときのオリジナルのレポートよりはずっと見栄えがよくなっています。標準のヘッダー・テキストやフッター・テキストはそれぞれ図―3Aと図―3Bに示したようにそれぞれに固有のQHTMLSRCのソース・メンバーの中に置くことができます。したがって、コピー・コマンドを何回か使用するとRPGを使わずにCLだけでHTMLドキュメントを作成することができます。CLプログラム例を図―3Cに示します。
データ・キューと出力キュー
データ・キューを出力キューにつなぐことができるという事実はあまり知られていません。出力キューにレポートが到着するとデータ・キューにエントリが送られます。データ・キューにエントリが到着するたびに起動して出力キューに対して新しいエントリがあることを知らせ、レポートの情報を抽出してHTMLに変換しIFSに保存するというプログラムを書くこともできます。
データ・キューの作成には次のコマンドを使用します。
CRTDTAQ DTAQ(QGPL/MYDTAQ) MAXLEN(200)
次に、以下のようにデータ・キューを出力キューにつなぎます。
CHGOUTQ OUTQ(QGPL/MYOUTQ) DTAQ(QGPL/MYDTAQ)
新しいスプール・ファイルが出力キューに追加された時(あるいは既存のスプール・ファイルが*RDYにセットされた時)は必ず、データ・キューにエントリが送信されます。データ・キューに送信されたデータは、WRKOUTQコマンドを実行して得られる情報に非常に似ています。
データ・キューのエントリが到着するのを待ってスプール・ファイルの詳細を構文解析するプログラムを書くこともできます(図―4)。次に図―5に示したコードを実行しますが、CPYSPLFコマンドを使用すると次のようなコードになります。
CPYSPLF FILE(&SPLFILE) TOFILE(QTEMP/SPOOL)
JOB(&NUM/&USER/&JOB) SPLNBR(&SPLFN)
このテクニックを使うとIFSディレクトリに一群のHTMLレポートを作成することができます。ちょっとしたQShell (QSH)コードを書けば、図―6に示す通り、IFSディレクトリ(たとえばreportsディレクトリ)内のすべてのHTMLレポートの一覧を取得し、DB2ファイル(たとえばこれもREPORTSと呼ばれる)内の詳細を取得することもできます。
これまでのところRPGプログラムは全く必要ありませんでしたが、HTMLの「メニュー」を作成するにはDB2ファイルを読んでHTMLメニューを表示する出力ファイルを作成する必要があります。それではこのプログラムをRPGで書いてみましょう。
スタイルを身につける
大した手間をかけずにウェブ・レポートにちょっとしたスタイルを付け加えることができます。図―1に示すレポートは<hr />タグを使用しています。このタグはページ上に水平線を書くためのものです。元のレポート中にあるこのタグ2つをイメージ・ファイルで置き換えると色と深さのある仕切りを作ることもできます。
RPGのような言語を使用すると表示の仕方をより良いものにするように元のレポートを修正できます。図―7では、レポートの最初の4行で<b>および</b>というタグが適用されたコンテンツが含まれていますのでこの4行は太字で表示されます。ご覧になっておわかりの通り、<span class=color>タグと<span class=white>を交互に使って緑色のバー(あるいはピンクのバー)の紙の外観を作り直してみました。図―7の一番上で<style>タグと</style>で囲まれたカスケード・スタイル・シート(CSS: Cascading Style Sheets)ディレクティブがelement: style; (たとえばbackground-color: black;)のようにフォーマットされています。ピンクのバーの紙の外観を作成するにはCSSとHTMLの<span>タグを一緒に使用します。図―8に表示されたレポートは、私見ではありますが、とても美しいレポートに仕上がっていると思います。
グリーンスクリーンのレポートをブラウザ用に変換する際に一番気をつけなければいけないのは、印刷する際のページ替えを元の通りに保つことです。CSSのテクニックを使用してページ替えをコントロールすることができます。それには次のようにCSSを、<style>...</style>タグで囲ったコードを書きます。
@media print { p.TOP { page-break-before:always; } }
グリーンスクリーンからブラウザ用にレポートを変換するプログラムがページ替え条件に合致したことを見つけるたびに、次のようなHTMLコードの行を記述しなければなりません。
<p class=TOP> </p>
モダン化してウェブへ
レポートをブラウザに表示させると事実上サブ・ファイルを使用しなくても良いようにできます。サブ・ファイル・プログラムを書くことの複雑さのほとんどはこれによりなくなります。特に、スクロールや印刷はブラウザによって処理されるので複雑です。嬉しいことに、私がここでご説明したテクニックを一人前の職人プログラマが使用することで、オープン・ソースのテクニックを勉強してからでなくてもモダン化してウェブに対応することができます。
今後の本シリーズの記事に注目してください。RPGのSPECIALファイルを使用し、exitプログラムを指定してI/Oを処理することでグリーンスクリーンのレポートを作成する方法をご紹介します。exitプログラムをCGIプログラムとして作成することでレポートをブラウザ上で実行して表示させることができます。