レポートをプレビュー表示する
帳票定義体ができたら、mdbファイルからデータを取得してプレビュー表示する部分を作成します。プレビュー表示は、WindowsフォームにActiveReportsのViewerコントロールを配置して行います。「CZ0905Bound」では、下記のような手順で作業を行いました。
- mdbファイルとexeファイルが同じフォルダに配置されて動作するようにmdbファイルもプロジェクトに追加して、[出力ディレクトリにコピー]プロパティを「常にコピーする」に設定。
- Windowsフォームをプロジェクトに追加するか、新しいプロジェクトの作成時に自動的に作成されていたForm1.vbを、CZ0905Bound_Form.vbにリネーム。
- クラスファイルを追加し、CZ0905Bound.vbというファイル名に。
クラスにコードを記述する
CZ0905Boundクラスには、mdbファイルからデータを取得してDataSetを作成するコードを記述しています。Windowsフォームファイルとは別のファイルにしているのは、UI部分とデータアクセス部分を分離しておいた方がコードの見通しがよく、データソースをSQL ServerやOracleなどに切り替える時も変更範囲が明確化するためです。
Public Class CZ0905Bound Implements IDisposable Private connectionString As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Password={1};User ID={0};" & _ "Data Source=" & _ System.IO.Path.Combine(My.Application.Info.DirectoryPath, _ "BILL.MDB") Public Function GetRecords(ByVal userID As String, ByVal password As String) As DataSet Dim ds As New DataSet Using _cn As New OleDb.OleDbConnection( _ String.Format(connectionString, userID, password)) _cn.Open() Using _cmd As New OleDb.OleDbCommand Dim sqlString As String = _ "SELECT Bill.*, BillCondition.*, Customers.CustomerName " & _ "FROM Customers " & _ "INNER JOIN (Bill INNER JOIN BillCondition " & _ "ON Bill.BillNo = BillCondition.BillNo)" & _ "ON Customers.CustomerID = Bill.CustomerID " & _ "ORDER BY Bill.CustomerID,Bill.BillNo,Bill.Date,Bill.SlipNo" _cmd.CommandText = sqlString _cmd.Connection = _cn Using _da As New OleDb.OleDbDataAdapter _da.SelectCommand = _cmd _da.Fill(ds) 'Priceを計算する For Each row As DataRow In ds.Tables(0).Rows row.BeginEdit() row("Price") = CType(row("Number"), Decimal) * _ CType(row("UnitPrice"), Decimal) row.EndEdit() Next End Using End Using _cn.Close() End Using Return ds End Function End Class
記述したコードは、ADO.NETにおけるDataAdapterクラスの基本的な使い方に準拠しています。少し特殊なのは、mdbファイルの[Price]項目に値が入っていないので、FillメソッドでDataSetに値を取得した後にPrice値を計算し、DataSetの[Price]項目に値を設定している点です(※1)。
DataSetに加えた変更はmdbファイルに反映してないため、mdbファイルの内容が変わるような事はありません。
Windowsフォームにコードを記述する
Windowsフォームの画面デザインはActiveReportsのViewerコントロールを貼り付け、Dockプロパティを「Fill」にすれば完成です。そして、DataSetと帳票定義体の2つをViewerコントロールに渡して、プレビュー表示するコードを記述しています。
Public Class CZ0905bound_Form Private Sub Form1_Shown(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Shown Dim rpt As New Seikyu_Report() Application.DoEvents() Using _prco As New CZ0905Bound rpt.DataSource = _prco.GetRecords("admin", "").Tables(0) Viewer1.Document = rpt.Document rpt.Run() End Using End Sub End Class
実行
実行時には、請求書NO「WS-DF502」のデータを増やし、2ページに渡って印字されるようにしています。このように複数ページに渡るテストデータを用意しておく事で、同一グループ複数ページの挙動が調べられます。テストデータ作成時のちょっとした工夫ですが、後から予期せぬ問題が起きないようにするためには、非常に重要な事です。