SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)

帳票Windowsアプリ実践構築ガイド
ActiveReports for .NETを使いこなす!

  • X ポスト
  • このエントリーをはてなブックマークに追加

レポートをプレビュー表示する

 帳票定義体ができたら、mdbファイルからデータを取得してプレビュー表示する部分を作成します。プレビュー表示は、WindowsフォームにActiveReportsのViewerコントロールを配置して行います。「CZ0905Bound」では、下記のような手順で作業を行いました。

  1. mdbファイルとexeファイルが同じフォルダに配置されて動作するようにmdbファイルもプロジェクトに追加して、[出力ディレクトリにコピー]プロパティを「常にコピーする」に設定。
  2. Windowsフォームをプロジェクトに追加するか、新しいプロジェクトの作成時に自動的に作成されていたForm1.vbを、CZ0905Bound_Form.vbにリネーム。
  3. クラスファイルを追加し、CZ0905Bound.vbというファイル名に。
図3:「CZ0905bound」サンプルプロジェクトの構成
図3:「CZ0905bound」サンプルプロジェクトの構成

クラスにコードを記述する

 CZ0905Boundクラスには、mdbファイルからデータを取得してDataSetを作成するコードを記述しています。Windowsフォームファイルとは別のファイルにしているのは、UI部分とデータアクセス部分を分離しておいた方がコードの見通しがよく、データソースをSQL ServerやOracleなどに切り替える時も変更範囲が明確化するためです。

リスト2:CZ0905Bound.vb
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)。

※1

DataSetに加えた変更はmdbファイルに反映してないため、mdbファイルの内容が変わるような事はありません。

Windowsフォームにコードを記述する

 Windowsフォームの画面デザインはActiveReportsのViewerコントロールを貼り付け、Dockプロパティを「Fill」にすれば完成です。そして、DataSetと帳票定義体の2つをViewerコントロールに渡して、プレビュー表示するコードを記述しています。

リスト3:CZ0905Bound_Form.vb
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

実行

図4:CZ0905boundの実行結果
図4:CZ0905boundの実行結果

 実行時には、請求書NO「WS-DF502」のデータを増やし、2ページに渡って印字されるようにしています。このように複数ページに渡るテストデータを用意しておく事で、同一グループ複数ページの挙動が調べられます。テストデータ作成時のちょっとした工夫ですが、後から予期せぬ問題が起きないようにするためには、非常に重要な事です。

次のページ
レポートを印刷する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3911 2009/05/14 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング