1

同じことに関して、すでに多くの質問が寄せられていることがわかります。

プログラムでレポートサーバーのrdlにデータソースをバインドする-SSRS

Xmlデータソース[WCF]を使用するSSRS、その可能性はありますが、それはお勧めですか?

と他の多くの...

しかし、私が本当に望んでいるのは、私が何かを始める前にあなたの貴重な意見を持ち、最終的に行き止まりに陥ることです!

BIDS SSRS 2008環境、Webアプリケーション用のVS2010でレポートを開発しています。ReportViewer10が_ProcessingMode="Remote"

これまでは、すべて問題ありませんでした。レポートへのパラメータの受け渡し、asp.netとの統合などです。つまり、SQLクエリを介してデータを取得します(場合によってはパラメータを介してフィルタリングします)。ストアドプロシージャを使用でき、すべて正常に機能しています。

しかし、現在、 asp.net Webページでフロントエンド(GridView)からのデータのユーザー選択に基づいて動的に生成し、そのデータをレポートに表示する必要があるレポートがあります。

つまり、ユーザーがGridViewで10行を選択して印刷ボタンをクリックした場合、それらの10行のみが(他のレポート固有のデータとともに)レポートに表示されます。これが、現在アップグレードしているレガシーシステムにあるものです。
もちろん、GridViewでのデータの選択はすべてユーザーに依存し、すべて動的であるため、これはパラメーターを渡すだけでは実現できません。..そこに私は今修正中です!

では、このような状況に最適なアプローチは何でしょうか。

PS(編集):そこには解決策がありますが、それらは.rdlcに関連しており、私は.rdlについて話しています

4

2 に答える 2

6

最後に、次のように実装しました。私はそれが他の人にいくらか役立つかもしれないと思いました。だから私の解決策を投稿しています:これはXML
の実装で行うことができます最初に次のようにデータをXMLに 変換します:

private void ConvertToXml(ref XmlDocument xm)
{
 const string header = @"<ENVELOPE>";
 var strenvelopes = "";
 GridItemCollection selectedRows;
 selectedRows = dgAddressList.SelectedItems;

if (selectedRows.Count > 0)
{
 foreach (GridItem item in dgAddressList.SelectedItems)
 {                 
  strenvelopes += @"<ADDRESS>" + 
  "<NAME>" + "<![CDATA[" + ((object[])(item.DataItem))[2].ToString() + "]]>" + "</NAME>" +
  "<CONTACT>" + "<![CDATA[" + ((object[])(item.DataItem))[1].ToString() + "]]>" + "</CONTACT>" +
  "<STREET>" + "<![CDATA[" + ((object[])(item.DataItem))[3].ToString() + "]]>" + "</STREET>" +
  "<SUBURBSTATE>" + "<![CDATA[" + ((object[])(item.DataItem))[4].ToString() + "]]>" + "</SUBURBSTATE>" +
  "</ADDRESS>";                  
  }
}

   const string footer = @"</ENVELOPE>";  

   var envelopes = header + strenvelopes + footer;
   xm.LoadXml(envelopes);
}

独自の値に置き換える 必要があり((object[])(item.DataItem))[].ToString()ます次に、次のようにレポートを生成します。

private void GenerateReport()
{
       var xm = new XmlDocument();
       ConvertToXml(ref xm);
       var xml = xm.InnerXml.ToString();
       rptViewer = ucrvEnvelope.FindControl("rptViewer") as ReportViewer;
       if (rptViewer != null)
       {
           rptViewer.ProcessingMode = ProcessingMode.Remote;              
           rptViewer.ServerReport.ReportServerUrl = new Uri("http://localhost/MyReports");
           rptViewer.ServerReport.ReportPath = "/Reporting/rptEnvelope";
           rptViewer.PromptAreaCollapsed = true;
       }
        ReportParameter myParam = new ReportParameter("list", xml);
        rptViewer.ServerReport.SetParameters(new ReportParameter[] { myParam });
        rptViewer.ShowParameterPrompts = false;
        rptViewer.ShowBackButton = true;
        rptViewer.ServerReport.Refresh();
  }

レポートにパラメータを追加する 必要があり"list"ます。"list"次のデータセットを介してXML全体をこれに渡すためです。

このXMLを処理するデータセット:
通常、データセット内にストアドプロシージャを作成するか、クエリ作成します。 これはXMLであるため、 XMLの方法で処理する必要があります。次のクエリを作成して処理します。 XMLデータ
Query Type: Text

DECLARE @docHandle int DECLARE @xmlDocument varchar(max); DECLARE @listXML nvarchar(max)
SET @listXML = @list
SET @xmlDocument = @listXML EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
    SELECT * FROM OPENXML (@docHandle, N'/ENVELOPE/ADDRESS') WITH
    (
      NAME nvarchar(max) 'NAME',
      CONTACT nvarchar(max) 'CONTACT',
      STREET nvarchar(max) 'STREET',
      SUBURBSTATE nvarchar(max) 'SUBURBSTATE'
    )

フィールドなどはNAMECONTACT最初にXMLドキュメントを作成したものと同じである必要があります。ConvertToXML


つまり、DBからストローされた手順を介してレポートにデータを渡すのではなく、aspxページから実際にデータを取得します-コードビハインドとそれをXMLに変換し、このデータセットを介してレポートサーバーレポートに渡しますコードビハインドレポートに渡されます..出来上がり

于 2012-11-16T11:54:52.670 に答える
0

ほとんどの場合、Webアプリケーションのコンテキストでそれらを実行し、データソースからレポートにデータを手動でプルする必要が生じる可能性があります。

私は数年前にこのプロジェクトを実行しましたが、プロジェクトを元に戻して実行してもかまいませんが、MVC/Webフォーム/Winフォーム/WPFなどをサポートするために最終的に完了しました。だけでなく、それをより堅牢にします。

これはあなたを正しい軌道に乗せるかもしれません。

于 2012-10-25T20:42:53.023 に答える