Microsoft Reports-SSRSを社内Webサイトの1つに追加することを検討しています。
データベースにはすべてのレポート機能がインストールされています。
WebサイトはすべてのデータにEntity Framework 4を使用しています。
DataSet(* .XSD)を作成する昔ながらの方法を使用してレポートを作成できましたが、これはうまく機能します。
私の質問ですが、レポートで必要なデータのためにサイト内の既存のエンティティフレームワークを利用することは可能ですか?ホイールを再発明して、データセット全体を作成し、関係などを作成する必要はありません。
これはWebサイトであり、アプリケーションではないので、これ( http://weblogs.asp.net/rajbk/archive/2010/05/09/creating-an-asp-net-report-using-visual-studio- 2010-part-1.aspx )は適用されないようです。 DataSourceが表示されない(チュートリアルのパート2)
更新
補足として、高価なサードパーティのコントロールなどを回避したいと思います。
また、問題を確認するもう1つの方法は、エンティティフレームワークエンティティモデルから* .XSDを生成することです。これは可能ですか?それは私たちを稼働させるでしょうが、それは理想的ではありません。
以下は、.NET winFormsアプリケーションの1つでレポートデータソースを設定する方法の簡単なサンプルです。
public void getMyReportData()
{
using (myEntityDataModel v = new myEntityDataModel())
{
var reportQuery = (from r in v.myTable
select new
{
l.ID,
l.LeaveApplicationDate,
l.EmployeeNumber,
l.EmployeeName,
l.StartDate,
l.EndDate,
l.Supervisor,
l.Department,
l.Col1,
l.Col2,
.......,
.......,
l.Address
}).ToList();
reportViewer1.LocalReport.DataSources.Clear();
ReportDataSource datasource = new ReportDataSource("nameOfReportDataset", reportQuery);
reportViewer1.LocalReport.DataSources.Add(datasource);
Stream rpt = loadEmbededReportDefinition("Report1.rdlc");
reportViewer1.LocalReport.LoadReportDefinition(rpt);
reportViewer1.RefreshReport();
//Another way of setting the reportViewer report source
string exeFolder = Path.GetDirectoryName(Application.ExecutablePath);
string reportPath = Path.Combine(exeFolder, @"rdlcReports\Report1.rdlc");
reportViewer1.LocalReport.ReportPath = reportPath;
reportParameter p = new ReportParameter("DeptID", deptID.ToString());
reportViewer1.LocalReport.SetParameters(new[] { p });
}
}
public static Stream loadEmbededReportDefinition(string reportName)
{
Assembly _Assembly = Assembly.GetExecutingAssembly();
Stream _reportStream = _Assembly.GetManifestResourceStream("ProjectNamespace.rdlcReportsFolder." + reportName);
return _reportStream;
}
私のアプローチは、常にオブジェクトデータソースでRDLCファイルを使用し、それらを「ローカル」モードで実行することでした。これらのデータソースは...私のエンティティです!このようにして、私は自分のWebアプリで使用しているものと同じビジネスロジック、文字列の書式設定、文化の認識などをすべて使用しています。いくつかの癖がありますが、私はそれらと一緒に暮らすことができました:
しかし、メリットは本当に素晴らしいです:
SSRSも「ローカル」レポートとして使用します。 SQLサーバーでビューを作成し、他のEFドメインモデルと共にアプリケーションでそのオブジェクトを作成し、DbContextを使用してそのオブジェクトをクエリします。 ASPXページを使用し、背後にあるコード(Page_Load)を使用して、データをレポートに渡します。
以下は、Page_Loadイベントでクエリを実行する方法の例です。
var person = MyDbContext
.Query<ReportModel>()
.Where(x => x.PersonId == personId)
.Where(x => x.Year == year)
.Select(x =>
{
PersonId = x.PersonId,
Year = x.Year,
Name = x.Name
});
var datasource = new ReportDataSource("DataSet1", person.ToList());
if (!Page.IsPostBack)
{
myReport.Visible = true;
myReport.ProcessingMode = ProcessingMode.Local;
myReport.LocalReport.ReportPath = @"Areas\Person\Reports\PersonReport.rdlc";
}
myReport.LocalReport.DataSources.Clear();
myReport.LocalReport.DataSources.Add(datasource);
myReport.LocalReport.Refresh();
トリックは、空白のデータソース接続文字列、空白のクエリブロック、および空白のDataSetInfoを使用してレポート(.rdlc)を作成することです(手動でxmlを変更する必要がありました)。次のようにファイルに存在し、空白である必要があります。
SomeReport.rdlc (viewing as xml)
...
<DataSources>
<DataSource Name="conx">
<ConnectionProperties>
<DataProvider />
<ConnectString />
</ConnectionProperties>
<rd:DataSourceID>19f59849-cdff-4f18-8611-3c2d78c44269</rd:DataSourceID>
</DataSource>
</DataSources>
...
<Query>
<DataSourceName>conx</DataSourceName>
<CommandText />
<rd:UseGenericDesigner>true</rd:UseGenericDesigner>
</Query>
<rd:DataSetInfo>
<rd:DataSetName>SomeDataSetName</rd:DataSetName>
</rd:DataSetInfo>
次にページイベントで、DropDownListのSelectedIndexChangedを使用して、レポートデータソースを次のようにバインドします。
protected void theDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
if (theDropDownList.SelectedIndex == 0)
return;
var ds = DataTranslator.GetRosterReport(Int64.Parse(theDropDownList.SelectedValue));
_rvReport.LocalReport.ReportPath = "SomePathToThe\\Report.rdlc";
_rvReport.LocalReport.DataSources.Add(new ReportDataSource("SomeDataSetName", ds));
_rvReport.Visible = true;
_rvReport.LocalReport.Refresh();
}
WCFサービスをデータソースとして使用できるため、レポートのアプリケーションデータとロジックを再利用できます。これには、少なくともSQLサーバーの標準版が必要です。したがって、無料のSQL-expressエディションでは何もできません。
[〜#〜] linq [〜#〜]をRDLC Reportと一緒に使用できます。
LinqNewDataContext db = new LinqNewDataContext();
var query = from c in db.tbl_Temperatures
where c.Device_Id == "Tlog1"
select c;
var datasource = new ReportDataSource("DataSet1", query.ToList());
ReportViewer1.Visible = true;
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = @"Report6.rdlc";
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(datasource);
ReportViewer1.LocalReport.Refresh();