DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ソフト実行時に、ReportViewのACCESSデータソース変更、再バインドは可能か。

環境/言語:[Windows8、VB2012]
分類:[.NET]

たびたび失礼します。


先日、こちらの質問を、させて頂きました。


レポート作成時にはDataSetを指定せず、DataGridViewの内容を印刷させたい。 
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=31609&rev=&no=0


こちらに、関連しての、質問です。


パソコンのローカルに、ACCESSのMDBファイルがあります。
アプリケーションの開発の際には、この、MDBと、データのやりとりを、します。
MDBの中にある、テーブルAは、毎日、その中身が、変わります。


テーブルAの中身を、印刷したいと思います。


Form1に、印刷ボタンを作ります。
印刷ぼたんを押すと、Form2が開きます。


Form2には、開発時に、ReportViewコントロールを、設置しておきます。

また、レポートを作成し、ツールボックスから、テーブルを、貼り付けます。
データセットをテーブルAに指定して、テーブルAの各フィールドを、テーブルに、ドラッグアンドドロップして、関連付けを、行います。

ソリューションエクスプローラーには、MDBと、テーブルAのデータセットが、表示されます。

Form2のReportViewにおいては、レポート、および、テーブルAのデータセットとのバインドを、行います。

そして、ビルドします。

テーブルAの内容が、変わった場合には、開発画面で、再バインドが必要、と、下記のサイトに、あります。
データ ソース参照の更新および再バインド
http://msdn.microsoft.com/ja-jp/library/ms252085(v=VS.80).aspx

開発画面からではなく、アプリケーション実行中に、テーブルAの中身も変わりますので、この内容を、ReportViewに、反映させたいのですが、出来ません。

SQLServer2005以上のSQLServerではなく、ローカルのACCESSを、データソースにしている場合、開発時に、プロジェクトに組み込んだ時の、MDB、テーブルAの内容が、常に、取得されてしまうのでしょうか。

これだと、開発後、EXEを実際に導入して、テーブルAの内容が、日々、更新されても、ReportViewの内容が、更新されません。

これを、更新させるための、コードが、ございましたら、ご教示頂きたく、思います。

Form1 や、Form2において、レポートのテーブルのデータソースを更新ようとコードを書くのですが、レポートを呼び込むことが出来ません。
また、ReportViewのデータセットは、ReadOnlyだと、出てしまいます。

どうぞよろしくお願いします。

下記も、参照しました。
レポートの概要 (ReportViewer コントロール)
http://msdn.microsoft.com/ja-jp/library/ms251712(v=VS.80).aspx
> Form1 や、Form2において、レポートのテーブルのデータソースを更新ようとコードを書くのですが、レポートを呼び込むことが出来ません。
> また、ReportViewのデータセットは、ReadOnlyだと、出てしまいます。

  何でしょうネ〜・・・

  ttp://www.itlab51.com/?p=1574

  SQL Server が、ACCESS のMDB になっただけで、別段、何の不自由
  もなく、動的にレポート出力は可能なのだが。

※ 無茶な話
  SQL Server のリンクサーバーに、ACCESS のMDBを設定しても正常
  にレポートが作成・印刷できるのだが・・・

以上。参考まで
2013/06/06(Thu) 19:22:23 編集(投稿者)

文中に読点「、」が多すぎると読み難くなります。
もう少し減らした方がよろしいかと。
http://bunsyou.net/kouza1/12toten.html


■No31618に返信(ERIさんの記事)
> 開発時に、プロジェクトに組み込んだ時の、MDB、テーブルAの内容が、常に、取得されてしまうのでしょうか。

mdb をソリューション エクスプローラーに配置しているのでしょうか?

もしそうなら、恐らくはプロパティで、ビルド アクション = コンテンツに
設定されているものと思います。その場合は「出力ディレクトリにコピー」の
設定を確認してみてください。

ここが「常にコピーする」に設定されていると、ビルドするたびに
開発時の mdb が再配置されるため、前回実行したときの更新内容が
開発時のものに 上書きされてしまうことになります。
ありがとうございます。

お2人様にいただきましたアドバイスを参考に、
以下のコードを、書いてみました。
VB2012のプロパティで、出力ディレクトリにコピー、の部分を、まだ見つけられていないのですが、まずは、MDBを置かず、データセット.XSDを別に作っておいて、印刷実行時に、テーブルAの内容を、ここに、代入する、という、方法を、とってみました。

----------

プロジェクト−新しい項目の追加−データセットで、DataSet1.xsdを追加。
ローカルのACCESSテーブルAと同じ構造の、DataTable(テーブルA)を作っておく。

Report1.rdlc
Tablix1を貼り付ける。
ローカルのACCESSテーブルAから、直接、データセットを取得するのではなく、
上記で作った、DataSet1から、取得して、Tablix1に、関連付けを行っておく。
この時点で、実質的な、データの中身は、ない。

Form1
印刷ボタンを押したら、Form2.Show

Imports System.Data.SqlClient
Imports System.Drawing.Printing
Imports Microsoft.Reporting.WinForms(これが、不足していました。)

Public Class Form1
Public pdsDataSet1 As New DataSet1
Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click

Dim cn As New OleDb.OleDbConnection(接続文字列)
Dim cmd As New OleDb.OleDbCommand()
cn.Open()
cmd.Connection = cn
cmd.CommandText = "SELECT * FROM [テーブルA]"
Dim da As New OleDb.OleDbDataAdapter
Dim ds As New DataSet("DataSet1")
da.SelectCommand = cmd
da.Fill(ds, "テーブルA")
da.Fill(pdsDataSet.テーブルA)

' ReportViewer の初期設定
frmPrint.ReportViewer1.Reset()
frmPrint.ReportViewer1.ProcessingMode = ProcessingMode.Local
frmPrint.ReportViewer1.LocalReport.ReportPath = Environment.CurrentDirectory + "\Report1.rdlc"

' ReportViewer 用データセットの作成
Dim RepDS As New ReportDataSource()
RepDS.Name = "DataSet1"
RepDS.Value = ds.Tables(0)

' ReportViewer にデータを表示
frmPrint.ReportViewer1.LocalReport.DataSources.Add(RepDS)
frmPrint.ReportViewer1.RefreshReport()

Form2.Show()

Form2

ReportViewer1を張っておく。
Report1、DataSet1.xsdと、関連付け。

この状態で、Form2を開くと、

ローカルレポートの処理中にエラーが発生しました。
レポート'Report1’のレポート定義が指定されていません。
ファイル'(プロジェクトフォルダのパス名)\bin\Debug\Report1’が見つかりませんでした。

と、出てしまいました。

引き続き、検討してみます。

ありがとうございます。

上記のコードに加えて。

Report1.rdlcのプロパティで、「出力ディレクトリ」が、見つかりました。
ここで、「コピーしない」にしますと、Report1が、出力ディテクトリにない形になり、エラーが起きていました。
ここを、「常にコピーする」に、しました。

また、上記コード中で、

Dim ds As New DataSet("DataSet1")
のDataSet1、を、テーブルA、に。


RepDS.Value = ds.Tables(0)
を、
RepDS.Value = pdsDataSet.テーブルAに。

これで、解決できました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板