SHOEISHA iD

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

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

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

Salesforceに日本の帳票パワーを注入する

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

帳票定義

 準備ができたら帳票定義を行います。RDLレポートにはTableコントロールがあり手軽に一覧表が作成できます。

図11 Tableコントロール
図11 Tableコントロール

 Tableコントロールをレポートデザイナーにドラッグ&ドロップするとヘッダ、詳細、フッターの3行から構成されたグリッドが表示されます。この詳細部分にDataSetに定義したフィールドを割り当てます。

図12 Tableにフィールドを割り当てる
図12 Tableにフィールドを割り当てる

 詳細にフィールドを割り当てると自動的にヘッダにフィールド名が入ります。またセル同士を繋げて一つにしたり、詳細を複数行で定義したりすることもできます。今回のサンプルでは、最終的に詳細を2段にして次のような定義を行いました。

図13 帳票定義の完成
図13 帳票定義の完成

 これにTableのコントロール罫線やLineコントロールを使用して罫線を引いてあげると、より帳票っぽくなるでしょう。

Viewerコンポーネントの設置

 いきなり印刷してしまってもいいのですが、プリンターが手元にない時にも確認ができるように、MainWindowにビューアーを設置してプレビュー表示できるようにしましょう。

 そのためには、まずツールボックスにViewerコンポーネントを追加します。

図14 Viewerコンポーネント
図14 Viewerコンポーネント

 追加できたらWPFデザイナーでWPFウィンドウを表示しておき、ドラッグ&ドロップでViewerコンポーネントを配置してから微調整します。

リスト2 MainWindow.xaml.vb
Imports GrapeCity.ActiveReports
 
Namespace Views
    Public Class MainWindow
        Private Runt As GrapeCity.ActiveReports.Document.PageDocument
 
        Public Sub New()
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
 
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
            Me.DataContext = Application.MainVM
            SetReports()                                                     '……(1)
            AddHandler Application.MainVM.PropertyChanged, 
               AddressOf MainVM_PropertyChanged                              '……(2)
        End Sub
 
        Private Sub SetReports()
            Dim fi As New System.IO.FileInfo("CZ1503rdl.rdlx")
            Dim repDef As New GrapeCity.ActiveReports.PageReport(fi)
 
            Me.Runt = New GrapeCity.ActiveReports.Document.PageDocument(repDef)
            AddHandler Me.Runt.LocateDataSource, AddressOf runt_LocateDataSource
        End Sub
 
        Private Sub MainVM_PropertyChanged(sender As Object,
                                           e As ComponentModel.PropertyChangedEventArgs)
            If e.PropertyName = "DataSetData" Then
                Me.CZ1503Viewer.LoadDocument(Me.Runt)                       '……(3)
            End If
        End Sub
 
        Private Sub Runt_LocateDataSource(ByVal sender As Object,
                                          ByVal args As LocateDataSourceEventArgs)
            args.Data = Application.MainVM.DataSetData.Tables("Campaign")   '……(4)
        End Sub
 
    End Class
End Namespace
  1. ActiveReports用の設定を実施
  2. ReportModelが提供するデータが変化した時に発生するイベントを登録
  3. データが取得できたら帳票定義体をローディング
  4. ActiveReportsがデータを必要としたときに呼び出されるプロシージャの中でReportModelが作成したデータを設定

 「args.Data = Application.MainVM.DataSetData.Tables("Campaign")」は、CDataで取得した全項目が入ったDataSetを6つの項目しか定義してなかったRDLレポートのDataSetに代入しています。これによりRDLレポートのDataSetは全項目を持つことになります。

 その状態でも帳票定義体に指定したフィールド名と同一のものを印字します。

図15 実行結果
図15 実行結果

 今回は意図的にCData側で全項目を取得しましたが、メモリ使用効率やデータ転送効率を考えるとCData側でも必要な項目だけを取得するようにしましょう。

まとめ

 もしかしたら、海外では帳票というものの存在を知らないのでレポートで満足していたりしないでしょうか。例えば、お客様の手元に届く請求書や納品書は、日本品質の帳票出力の方がより満足いただける可能性があると考えます。もし、そういった可能性を今まで除外していたとしたら、レポートではなく帳票の可否を検討してみるとよいでしょう。

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

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

もっと読む

この記事の著者

初音玲(ハツネアキラ)

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

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8597 2016/03/14 11:37

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング