この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.7 顧客情報の印刷処理
●帳票印刷の方法
 まずはじめに,Visual Basicで帳票印刷をするには,どのような方法があるのかをまとめておく。Visual Basicで帳票印刷するには,さまざまな方法があるが,主に次のような手法が使われることが多い。

DataReportオブジェクトを使う方法
 Visual Basic 6.0で新規に追加されたDataReportオブジェクトを使って帳票を作成する方法である。DataReportオブジェクトは,Visual Basicのメニューから[プロジェクト]−[Data Reportの追加]を選択することでプロジェクトに追加することができる。追加したDataReportオブジェクトは,DataReportデザイナを使い,GUIで各フィールドの印刷位置やラベルの文字列などを指定することができる(Fig.7-39)。
 通常,DataReportオブジェクトのDataSourceプロパティにはDataEnvironmentオブジェクトを割り当て,DataMemberプロパティにはDataEnvironmentオブジェクトで設定したデータベースに対して実行するコマンド(主にSELECT文)を結び付けることが多い。その場合,DataEnvironmentオブジェクトで設定したコマンドを実行して得られる各フィールドをドラッグ&ドロップしてDataReportオブジェクト上に配置できるために便利なのだが,これは2階層アプリケーションにおける話である。N階層アプリケーションでは,プレゼンテーション層がDataEnvironmentオブジェクトで定義したコマンドを直接データベースに対して発行してデータを取得することは許されないため(許されないというよりも,そうするとN階層アプリケーションにならない),この方法は使えない。よって,N階層アプリケーションでDataReportオブジェクトを使う際には,DataEnvironmentオブジェクトを使わずに,ビジネスロジックから返されるADODB.Recordsetオブジェクトを割り当てるという手法をとる。この方法についての詳細は,KnowregeBaseのQ190411を参照してほしい。
 DataReportオブジェクトを使う方法は簡便であるため,多くのVisual Basicで作られたアプリケーションは,帳票印刷するためにDataReportオブジェクトを使っている。DataReportオブジェクトは,カンマ区切りテキストファイルやHTMLファイルに書き出す機能,印刷結果をプレビューする機能などを備えているため,かなり便利である。
 しかし,少々複雑なことをしようとすると,DataReportオブジェクトでは実現が困難になる。その典型的な例が,用紙幅が変わってしまうようなケースである。DataReportオブジェクトを設定するGUI画面(Fig.7-39)では用紙の横幅も指定できるのだが(縦幅は用紙の高さに応じて適時自動的に調整される),アプリケーションを実行したときに選択されるデフォルトプリンタに設定されている用紙の横幅が設計時の用紙の横幅よりも小さいときには,実行時エラーが発生してしまう。よって,印刷するまえに,デフォルトプリンタの用紙の横幅がDataReportオブジェクトで設定した横幅よりも小さいときには,動的にDataReportオブジェクトの横幅を用紙の幅にまで狭める処理を実装する必要がある(より単純化するには,たとえば,あらかじめ用紙サイズをA4サイズなどに決め打ちしてしまい,印刷時にユーザーがA4サイズよりも小さな幅を指定したら,「A4サイズより小さな用紙サイズに印刷できません」などというエラーメッセージを表示してもよいが,使いにくいアプリケーションという誹りは免れないだろう)。また,見栄えを気にするのであれば,用紙幅に合わせて印刷位置を調節したり,表全体をセンタリング処理したりするような処理も必要となってくる。
 
CrystalReportsを使う方法
 CrystalReportsは,Visual Basic 5.0に付属していた帳票作成用アプリケーションである。当時はよく使われていたが,現在はDataReportオブジェクトを使ったものに置き換わりつつある。
 CrystalReportsはVisual Basicからは独立しており,CrystalReports自身が直接データベースに接続してデータを取得して帳票を作成する形態となる。すなわち,ビジネスロジックから取得したデータ列から帳票を作るという作業には向かず,N階層モデルのアプリケーションにおける帳票印刷にはあまり適していない。
 
市販のActiveXコントロールを使う方法
 ActiveXコントロールのベンダからは,便利な機能を持った帳票作成用のActiveXコントロールが多数発売されている。これらのActiveXコントロールを使えば,比較的簡単に帳票を作成することができる。どのようなActiveXコントロールがあるのかを知りたければ,ActiveXベンダ会のホームページを参照してみるとよいだろう。
 
Excelを使って出力する方法
 帳票を作成するときには,Excelを使用する方法も有力である。ExcelをActiveXコントロールとして使い,各セルにデータベースから取得したフィールドの値を埋め込むのである。
 この方法だと,かなり柔軟な表を作成できるうえ,グラフの描画なども簡単である。さらに,印刷処理そのものはExcelに任せればよいので,アプリケーション側で改ページ処理をしたり,用紙サイズを設定したりといった雑多な処理を実装しなくてすむ。
 しかし,アプリケーションの実行にあたってはExcelがインストールされていることが前提となってしまうので,実行環境を選ぶという問題がある。そのため,この方法は市販のアプリケーションにはあまり使われない。実行環境をある程度制約してもかまわない社内システムなどに向いているといえるだろう。
 
Printerオブジェクトを使う方法
 最後の方法は,Printerオブジェクトを使って帳票を作成する方法である。Printerオブジェクトは,Visual Basicにおいてデフォルトプリンタを示すオブジェクトである。Printメソッドを使えば文字列を出力することができ,Lineメソッドを使えば線や四角形を描くこともできる。
 Printerオブジェクトを使って帳票を出力する場合,帳票を描画するために,逐一座標を指定して文字や罫線を描いてゆく必要がある。つまり,かなりの手間がかかることになる。しかし逆にいえば,任意の図形を描画できるため,帳票以外に,たとえばグラフを出力できるなど,汎用性は高い。

 では,これらのうち,どの方法を使えばよいのだろうか。結論からいえば,それは時と場合による。ActiveXコントロールを別途購入するだけの開発費を確保できるのであれば, ActiveXコントロールを用いる方法が最も効率的だろう。あるいは,アプリケーションを使うクライアントのすべてにExcelがインストールされていることがわかっているのであれば,Excelを使用する方法も便利である。逆に,汎用的な方法が必要であれば,DataReportオブジェクトかPrinterオブジェクトを利用するのがよいだろう。

 この連載では,あまり特殊な環境を想定したくないので,DataReportオブジェクトかPrinterオブジェクトを利用する方法を採用したい。では,このうちどちらを用いるのかだが,これはどちらも捨てがたい選択肢である。DataReportオブジェクトを使う方法は,何よりも手軽である点が魅力である半面,帳票しか印刷できないため,汎用性という点では難がある。一方,Printerオブジェクトを使う方法は,処理が複雑化する半面,帳票以外にもさまざまな印刷を実現できるという点が魅力となっている。

 どちらをとるか最後まで迷ったのだが,この連載ではPrinterオブジェクトを使うことにした。処理がやや複雑になるのは否めないが,Visual Basicにおける印刷処理全般を知っておいても損はないだろうという判断からである。また,DataReportオブジェクトを使った帳票作成は,すでに多数の文献が存在するので,あえてここで説明しなくても読者は多くの情報を得ることができるだろうという思いもある。

 それでは,以下,Printerオブジェクトを使った帳票作成処理について説明する。

Fig.7-39 DataReportオブジェクト(DataReportデザイナ)
fig7_39

prevpg.gif Chapter 7 37/65 nextpg.gif