none
ボタンから直接ダイレクト印刷をしたい RRS feed

  • 質問

  • 昨日はお世話になりました。昨日に続き、分からない事が出てきました。

    印刷プレビューを表示させずに、コマンドボタンを押してダイレクト印刷をしたいと思っています。

    ここ(https://msdn.microsoft.com/ja-jp/library/vstudio/ms252091(v=vs.120).aspx)を参考にしたかったのですが

    あまり理解できず、ここまでややこしくなるものなのかと疑問に思い質問させて頂きます。

    LocalReportクラス(https://msdn.microsoft.com/ja-jp/library/microsoft.reporting.winforms.localreport.aspx)を使用する等してダイレクトに印刷できないものでしょうか。

    現在はVisualBasic Studio2013 のWindowsフォームアプリケーションで作っています。

    ReportViewerとデータセットを使用してデザインしておりますので、それを使ってプログラムから印刷できる方法がありましたら宜しくお願い致します。

    勉強し始めの初心者で申し訳ありませんが、ご教示宜しくお願い致しますm(_ _)m


    • 分割 星 睦美 2015年7月24日 0:11 投稿者を変更したため
    • 編集済み 星 睦美 2015年7月24日 0:13 新しいスレッドを作成
    • 編集済み Hana111111 2015年7月24日 0:18 URL修正
    2015年7月23日 7:55

回答

  • XMLファイルはデータソースで、rdlcファイルはデザイン(外観)、
    XSDファイル=データセットと言う認識で合っておりますでしょうか。

    ザックリ言えば、少なくとも rdlc は必須です。しかし、.xml や .xsd を使うかどうかは任意です。
    また、rdlc や xsd は xml の一種なので、上記の分類だと語弊があるかもしれません。

    ややこしいことに、レポートデザイナー内で使われる「データセット」という用語は、必ずしも System.Data.DataSet の事を指すとは限りません。たとえば、Webサービスや自作クラスなどを指定した場合にも、総じて『データセット』という語が使われています。

    そうするとXMLファイルでXSDファイルを呼び出してデータソースにしているということになるのでしょうか。

    実際には、xsd は使用されていません。

    あのレポートでは元々、『データソース TempDataSource』として SQL Server のサンプルデータベース「AdventureWorks2000」が使われています(Report.rdlc の内容を良く見ると、その片鱗がうかがえます)。

    また、その TempDataSource から作られた『データセット Sales』は、「SELECT * FROM vSales」というクエリを元に生成されたテーブルです。このテーブルは、イメージ的には下記のような内容です(実際には DataTable です)。

    Public Class Sales
     Public Property ProdCat As String
     Public Property SubCat As String
     Public Property OrderYear As Integer
     Public Property OrderQtr As String
     Public Property Sales As Decimal
    End Class
    

    ここまでは rdlc についての話。

    しかしあのサンプルは、オフラインでのローカルレポートのサンプルですので、SQL Server が無くても実行できるよう、TempDataSource からではなく、XML ファイルからデータを得るように修正されています。具体的には

    Function LoadSalesData() As DataTable
        Dim dataSet As New DataSet()
        dataSet.ReadXml("..\..\data.xml")
        Return dataSet.Tables(0)
    End Function

    というコードで DataTable を生成し、それを

    Private Sub Run()
        Dim report As New LocalReport()
        report.ReportPath = "..\..\Report.rdlc"
        report.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
        Export(report)
        Print()
    End Sub

    として、『データソース Sales』にバインドしています。
    ちなみに直接印刷ではなくプレビューなら、下記のようになりますね。今回は関係ないですけど。

    Me.ReportViewer1.LocalReport.ReportPath = "..\..\Report.rdlc"
    Me.ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
    Me.ReportViewer1.RefreshReport()
    


    では何のために xsd を作成したのかといえば、rdlc のメンテナンスのためです。

    rdlc のデザイン画面に、『データセット Sales』が表示されていますが、これはもともと、SQL Server のテーブルを元に生成されたものです。このレポートに、後から「データソース」を追加するためには、そのためのデータ定義(いわゆるスキーマ)がメタデータとして必要になります。

    今回はそのメタデータとして、Data.xsd を用意したということです。Data.xml を XSD.exe に渡すと、vSales というテーブルを持った、AdventureWorks2000DataSet という名のデータセットが、Data.xsd というファイル名で生成されます。

    実際のサンプルでは、既にデータソースが作成済みなので、このスキーマの出番は無いのですが、もしもこれを使うのであれば、「レポート データ」ペインで、「新規 - データセット」を選択するか、もしくは既存の「データセット Sales」を選択して「編集...」を押すことで指定できます。

    ちなみに、xsd ファイルを用意する代わりに、本投稿の冒頭に書いた『Public Class Sales』をスキーマとして用いることも出来ます。とはいえ、DataSouces.Add で渡すデータソースが、型なしDataTable (あるいは、型付きの AdventureWorks2000DataSet.vSalesDataTable) である以上、同じ定義のクラスを別途用意するよりは、DataSet を『データセット』として用いた方が分かりやすいでしょうね。

    • 回答としてマーク Hana111111 2015年7月29日 5:53
    2015年7月28日 7:47
  • 外部(ローカルドライブ)にXMLファイルやレポート定義を作っておいて、

    レポート定義(.rdlc)を外部に置きたくないのであれば、デザイン時に指定しておくことが出来ます。また、実行時に割り当てたいのであれば、ReportEmbeddedResource を使うことも出来ます。

    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=all&namber=32557&type=0&space=0&no=0

    http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=9546

    また下記のURLではData.xmlを作成する際、xsdファイルをコマンドプロンプトから作成しておりますが

    このファイルはどういった役割をしているのかが分かりません。

    Data.XML については、データベースの代わりとして使っているだけですね(dataSet.ReadXml メソッドを呼び出しています)。また、.xsd の作成に、Visual Studio を使うのか、XSD.EXE を使うのかは自由ですが、今回は既に DataSet をお持ちのようですし、それをそのまま使えば良いとおもいます。 

    また DataSet を経由させる方法の他、rdlc の「レポートデータ」ペインの「パラメーター」を通じてデータを受け渡すことも出来ます。全ページで共通のタイトル情報などはこの方法が便利かと。

    ReportViewer1.LocalReport.SetParameters(New ReportParameter("ReportParameter1", TextBox1.Text))
    
    ReportViewer1.LocalReport.SetParameters(New ReportParameter("ReportParameter2", TextBox2.Text))
    
    ReportViewer1.RefreshReport()

    • 回答としてマーク Hana111111 2015年7月28日 1:47
    2015年7月24日 3:58
  • 関数における引数(パラメーター)と同じです。関数をレポートに置き換えて考えると理解しやすいのではないかと思います。
    すなわち、レポートに値等を渡すという役割を担っています。渡された値等をどう扱うかは、そのレポートによります。引数をどう扱うは関数の実装にかかっているのと同じことです。

    (参考)
    パラメータの利用方法
    http://csharp.keicode.com/topics/ms-report-params.php

    >パラメータに値がないとエラー表示されるのはなぜでしょうか。

    パラメーターは存在するのに、パラメーターに値が与えられていないということでしょう。上記にあげた参考ページをご覧いただいて、パラメーターと、そのパラメーターに値等をセットする部分に注目してみて下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク Hana111111 2015年8月25日 23:42
    2015年8月25日 7:47
    モデレータ

すべての返信

  • Hana111111 さま よろしく。

    以下は参考にはなりませんか?。

    チュートリアル : プレビューを使用しないローカル レポートの印刷
    https://msdn.microsoft.com/ja-jp/library/vstudio/ms252091%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    2015年7月23日 9:34
  • ご回答ありがとうございます。最初にのせたURLを間違えてしまいました。

    載せて頂いたそのページを読み解こうとしていたのですが、難しいです。

    このサンプルの方法では、プロジェクトの中で作成したレポートを印刷するのではなく、

    外部(ローカルドライブ)にXMLファイルやレポート定義を作っておいて、それらのファイルを使って

    プログラムから印刷するということで合っていますでしょうか?

    また下記のURLではData.xmlを作成する際、xsdファイルをコマンドプロンプトから作成しておりますが

    このファイルはどういった役割をしているのかが分かりません。

    ***************************************************************************
    https://msdn.microsoft.com/ja-jp/library/vstudio/ms251734(v=vs.120).aspx

    レポート定義ファイルとデータ ファイルの作成

    テキスト エディターを使用して新しいファイルを作成します。

    作成した新しいファイルに「レポート定義ファイル」セクションのデータをコピーします。

    このファイルを Report.rdlc としてローカル ドライブ上のフォルダーに保存します。 テキストをメモ帳に貼り付けた場合は、保存したファイルの拡張子が .rdlc で、エンコードが UTF-8 であることを確認します。

    2 番目の新しいファイルを作成します。

    作成した新しいファイルに「VSales データ ファイル」セクションのデータをコピーします。

    このファイルを Data.xml としてローカル ドライブ上のフォルダーに保存します。 テキストをメモ帳に貼り付けた場合は、保存したファイルの拡張子が .xml で、エンコードが UTF-8 であることを確認します。

    データ ファイルの XML スキーマ ファイルの生成

    [スタート] メニューから [Microsoft Visual Studio 2010]、[Visual Studio Tools] の順に選択し、Visual Studio コマンド プロンプト ウィンドウを開きます。

    Report.rdlc と Data.xml が保存されているフォルダーに移動します。

    コマンド プロンプトで、「xsd.exe Data.xml」と入力します。 Data.xsd ファイルが作成されます。

    コマンド ウィンドウを閉じます。

    ***************************************************************************



    2015年7月23日 23:56
  • Hana111111 さま 拝見しました。

    先ず、お断りして置きますが、私は Express Edition 利用なので、ReportViewer は使えません。
    印刷は、PrintDocument クラスでごりごり書いています。

    ですので、お詳しい方の、ご反応をお待ち下さい。


    参考までに、無い知識で悪あがきしますと。  (間違いがある可能性あり ですので、読み飛ばして下さい。)
    チュートリアルの前の流れから見て、外部に作って と言うよりは 既存のものを転用する 位置付けだと思います。
    さて、このファイル とは xsdファイルですか?。
    そうなら、データベースからデータセットを取得する時と同じ様に、 XML で記述されたデータ構造を示すファイルだと思います。
    印刷物の定義とデータ流し込みの部分の手段の違いはありますが、
    PrintDocument を PrintPage で印刷して行く処は同じ流れだと思います。
    もし、お時間があるようでしたら、理解を深める為に、 
    一回、簡単な印刷を PrintDocument クラスのみを使って書いてみるのも手だとは思います。

    • 編集済み ShiroYuki_Mot 2015年7月24日 2:14 VScroll 削除?
    2015年7月24日 1:53
  • 今までAccessのレポートで設計してきたため視覚的にも分かりやすく作成したいのと、

    メンテナンスの事などを考えてもPrintDocumentでコードを書きまくるのが嫌で、他の方法がないかあがいているところですが

    PrinDocumentでごりごり書く部分を、ここではデータファイルを使ってそこから出力内容を読み取って

    印刷するような流れになっているのですね(~_~;)

    勉強の為に、一度テストでPrintDocumentでも作成してみようと思います。ご丁寧にありがとうございます。

    Accessでは簡単に設計出来ていたので、印刷するだけでこんなに大変にな事になるとはちょっと驚いております。

    2015年7月24日 2:18
  • 外部(ローカルドライブ)にXMLファイルやレポート定義を作っておいて、

    レポート定義(.rdlc)を外部に置きたくないのであれば、デザイン時に指定しておくことが出来ます。また、実行時に割り当てたいのであれば、ReportEmbeddedResource を使うことも出来ます。

    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=all&namber=32557&type=0&space=0&no=0

    http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=9546

    また下記のURLではData.xmlを作成する際、xsdファイルをコマンドプロンプトから作成しておりますが

    このファイルはどういった役割をしているのかが分かりません。

    Data.XML については、データベースの代わりとして使っているだけですね(dataSet.ReadXml メソッドを呼び出しています)。また、.xsd の作成に、Visual Studio を使うのか、XSD.EXE を使うのかは自由ですが、今回は既に DataSet をお持ちのようですし、それをそのまま使えば良いとおもいます。 

    また DataSet を経由させる方法の他、rdlc の「レポートデータ」ペインの「パラメーター」を通じてデータを受け渡すことも出来ます。全ページで共通のタイトル情報などはこの方法が便利かと。

    ReportViewer1.LocalReport.SetParameters(New ReportParameter("ReportParameter1", TextBox1.Text))
    
    ReportViewer1.LocalReport.SetParameters(New ReportParameter("ReportParameter2", TextBox2.Text))
    
    ReportViewer1.RefreshReport()

    • 回答としてマーク Hana111111 2015年7月28日 1:47
    2015年7月24日 3:58
  • 魔界の仮面弁士様

    ご回答ありがとうございます。

    外部には置きたくなかったので、少し時間がかかりそうですがURLを参考に勉強させて頂きます。

    どうしても分からなければまた質問させて頂くかと思いますのでお手数をおかけ致しますが宜しくお願い致します。

    そして教えて頂ける方がいないので、レポートの仕組みの理解自体が間違っているかもしれません。

    XMLファイルはデータソースで、rdlcファイルはデザイン(外観)、

    XSDファイル=データセットと言う認識で合っておりますでしょうか。

    そうするとXMLファイルでXSDファイルを呼び出してデータソースにしているということになるのでしょうか。



    2015年7月24日 6:49
  • XMLファイルはデータソースで、rdlcファイルはデザイン(外観)、
    XSDファイル=データセットと言う認識で合っておりますでしょうか。

    ザックリ言えば、少なくとも rdlc は必須です。しかし、.xml や .xsd を使うかどうかは任意です。
    また、rdlc や xsd は xml の一種なので、上記の分類だと語弊があるかもしれません。

    ややこしいことに、レポートデザイナー内で使われる「データセット」という用語は、必ずしも System.Data.DataSet の事を指すとは限りません。たとえば、Webサービスや自作クラスなどを指定した場合にも、総じて『データセット』という語が使われています。

    そうするとXMLファイルでXSDファイルを呼び出してデータソースにしているということになるのでしょうか。

    実際には、xsd は使用されていません。

    あのレポートでは元々、『データソース TempDataSource』として SQL Server のサンプルデータベース「AdventureWorks2000」が使われています(Report.rdlc の内容を良く見ると、その片鱗がうかがえます)。

    また、その TempDataSource から作られた『データセット Sales』は、「SELECT * FROM vSales」というクエリを元に生成されたテーブルです。このテーブルは、イメージ的には下記のような内容です(実際には DataTable です)。

    Public Class Sales
     Public Property ProdCat As String
     Public Property SubCat As String
     Public Property OrderYear As Integer
     Public Property OrderQtr As String
     Public Property Sales As Decimal
    End Class
    

    ここまでは rdlc についての話。

    しかしあのサンプルは、オフラインでのローカルレポートのサンプルですので、SQL Server が無くても実行できるよう、TempDataSource からではなく、XML ファイルからデータを得るように修正されています。具体的には

    Function LoadSalesData() As DataTable
        Dim dataSet As New DataSet()
        dataSet.ReadXml("..\..\data.xml")
        Return dataSet.Tables(0)
    End Function

    というコードで DataTable を生成し、それを

    Private Sub Run()
        Dim report As New LocalReport()
        report.ReportPath = "..\..\Report.rdlc"
        report.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
        Export(report)
        Print()
    End Sub

    として、『データソース Sales』にバインドしています。
    ちなみに直接印刷ではなくプレビューなら、下記のようになりますね。今回は関係ないですけど。

    Me.ReportViewer1.LocalReport.ReportPath = "..\..\Report.rdlc"
    Me.ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Sales", LoadSalesData()))
    Me.ReportViewer1.RefreshReport()
    


    では何のために xsd を作成したのかといえば、rdlc のメンテナンスのためです。

    rdlc のデザイン画面に、『データセット Sales』が表示されていますが、これはもともと、SQL Server のテーブルを元に生成されたものです。このレポートに、後から「データソース」を追加するためには、そのためのデータ定義(いわゆるスキーマ)がメタデータとして必要になります。

    今回はそのメタデータとして、Data.xsd を用意したということです。Data.xml を XSD.exe に渡すと、vSales というテーブルを持った、AdventureWorks2000DataSet という名のデータセットが、Data.xsd というファイル名で生成されます。

    実際のサンプルでは、既にデータソースが作成済みなので、このスキーマの出番は無いのですが、もしもこれを使うのであれば、「レポート データ」ペインで、「新規 - データセット」を選択するか、もしくは既存の「データセット Sales」を選択して「編集...」を押すことで指定できます。

    ちなみに、xsd ファイルを用意する代わりに、本投稿の冒頭に書いた『Public Class Sales』をスキーマとして用いることも出来ます。とはいえ、DataSouces.Add で渡すデータソースが、型なしDataTable (あるいは、型付きの AdventureWorks2000DataSet.vSalesDataTable) である以上、同じ定義のクラスを別途用意するよりは、DataSet を『データセット』として用いた方が分かりやすいでしょうね。

    • 回答としてマーク Hana111111 2015年7月29日 5:53
    2015年7月28日 7:47
  • とても分かりやすい説明をありがとうございます。

    自分でDataSetを作ってから、いろいろ試していたために

    サンプルを見て何をしているのか分からず混乱してしまっておりました。

    サンプルの動作が理解できました。ありがとうございます。

    肝心の印刷は、現在勉強しながら作成中なので完成にたどり着くまで時間がかかりそうですが

    また分からなければここに質問させて頂きますので宜しくお願い致します。

    ShiroYuki_Mot様、魔界の仮面弁士様、お忙しい中ご回答頂きありがとうございましたm(_ _)m


    2015年7月30日 2:33
  • いつも大変お世話になっております。

    今の知識の状態ではローカルレポートでの帳票印刷までなかなかたどり着かず、レポートを作成しながら一つずつ理解を深めている途中で

    わからない事が出てきましたので引き続き質問させて頂きます。

    ReportViewer1.LocalReport.SetParameters(New ReportParameter("ReportParameter1", TextBox1.Text))

    などパラメータを設定しているサンプルがありますが、このパラメータというものはどういう役割をしているものなのでしょうか。

    現在、rdlcファイルのデザイナ画面にテーブルコントロールを置き、データセットをあてはめています。

    そのテーブルの一つのテキストボックスに追加したパラメータを埋め込んでみると決まった文字を表示させられるという事はわかったのですが、

    パラメーターはテーブルの中に指定した文字を表示させる為のものと考えてよいのでしょうか。

    またパラメータプロパティの「使用出来る値」の部分をクエリに選択してデータセットの値を選択しても、

    パラメータに値がないとエラー表示されるのはなぜでしょうか。

    初心者で申し訳ありませんが、ご教示宜しくお願い致します。

    2015年8月25日 7:31
  • 関数における引数(パラメーター)と同じです。関数をレポートに置き換えて考えると理解しやすいのではないかと思います。
    すなわち、レポートに値等を渡すという役割を担っています。渡された値等をどう扱うかは、そのレポートによります。引数をどう扱うは関数の実装にかかっているのと同じことです。

    (参考)
    パラメータの利用方法
    http://csharp.keicode.com/topics/ms-report-params.php

    >パラメータに値がないとエラー表示されるのはなぜでしょうか。

    パラメーターは存在するのに、パラメーターに値が与えられていないということでしょう。上記にあげた参考ページをご覧いただいて、パラメーターと、そのパラメーターに値等をセットする部分に注目してみて下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク Hana111111 2015年8月25日 23:42
    2015年8月25日 7:47
    モデレータ
  • フォーラム オペレーターの星 睦美です。

    フォーラム ユーザーの目に留まりやすく回答を得ることができるのではないかと思いますので、追加の質問内容は新しい質問として投稿をお願い致します。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年8月25日 8:00
  • trapemiya様

    いつも分かりやすいご回答をありがとうございます。

    パラメータをただ追加しただけではだめで、値をプログラムからパラメータに追加しないとだめなのですね。

    またフィルタとして使える事も知らず少し使い方のイメージができました。ありがとうございますm(_ _)m

    星様

    スレッドの乱立は良くないかと思い同じ所に質問させて頂きましたが、次からは新しくスレッド作成致します。

    2015年8月25日 8:26