1

私の会社には、ClickOnceと.NET Remoting(まもなくWCFになる)を利用して、すべてのデータアクセス操作を処理するバックエンドIISWebアプリケーションにWindowsフォームアプリケーションがあります。レポートには現在SSRSを使用しており、分散クライアントをレポートサーバーに直接接続しています。

RDLCファイルを介したローカルレポートをサポートする機能を使用して、SSRSレポートへの依存を削除または強化する可能性があります。私が克服しなければならない1つのハードルは、個々のクライアントマシンがデータベースに直接アクセスする可能性が低いため、レポートデータをRemotingまたはWCFトランスポート層を介してWebアプリケーションからフェッチする必要があることです。

"Discovering" the parameters of the report for purposes of dynamically building a UI of report parameter prompts I don't think is terribly difficult, but actually telling the back-end system what class/method to invoke in order to return the correct data for the report is less simple.

Has anyone experimented with somehow embedding information into the RDLC file (either through a comment in the report or otherwise) that can be used as a "hint" to the server application layer for determining what method to execute? It's likely that the actual RDLC will be stored in the database versus being distributed with our application.

Any insight or guidance would be appreciated.

-MrB

4

1 に答える 1

1

www.gotreportviewer.comと RDL ビューアーの例 (右側の最後のサンプル) を確認してください。RDLC をロードし、XML ファイルを解析してパラメーター、接続情報、およびクエリ情報を取得するためのコードが既に含まれています。バックエンドを使用してすべてを取得し、レポートを作成/ロードして実行できるはずです。

RDLC のどこかにヒントまたはコメントを追加して、どの呼び出しを行うかを指定する限り、代わりにレポート名をヒントとして使用することをお勧めします。レポートがデータをロードするために何を呼び出すかを知るために、過去にこれを行いました。

私たちは以前にこのようなことをしました:

VB バージョン:

Select Case GetReportName()

            Case "SiteEval"
                Using adp As New DataSetsTableAdapters.SiteEvalTableAdapter, _
                 objDT As New DataSets.SiteEvalDataTable
                    adp.Fill(objDT)
                    objLR.DataSources.Add(New ReportDataSource("DataSets_SiteEval", objDT))
                End Using
            Case ....

C# バージョン:

switch (GetReportName()) {

    case "SiteEval":
        using (DataSetsTableAdapters.SiteEvalTableAdapter adp = new DataSetsTableAdapters.SiteEvalTableAdapter()) {
            using (DataSets.SiteEvalDataTable objDT = new DataSets.SiteEvalDataTable()) {
                adp.Fill(objDT);
                objLR.DataSources.Add(new ReportDataSource("DataSets_SiteEval", objDT));
            }
        }

        break;

XSD とデータセットを活用して、レポートを読み込みます。この場合、ローカル レポートは DB にアクセスできます。あなたの場合、このアイデアを利用して、サービスへの呼び出しから返された独自のデータテーブルでデータセットを埋めることができます。大量のレポートがある場合、これは最も洗練された、または維持するのが最も簡単ではありません。

この例では、RDL ビューアーの例を使用して、必要に応じて変更しているため、上記のコードは必要ありません。RDLC ファイルへのパスを渡すだけで、コードは RDLC の xml を読み取って必要なものをロードします。ただし、この場合、ローカル レポートは DB にアクセスできます。上記のコードのアイデアを使用するか、現在行っているようにwww.gotreportviewer.comの RDL ビューアーの例を変更して、外部ソースからデータを取得するように変更することはそれほど難しくないと思います。

RDL ビューアーの例を修正すると、現在、このようなことが少し進行中です (まだ作業中です...) コードは VB です。

    Dim r As New Report(Server.MapPath("App_Reports/" & GetReportName() & ".rdlc"), GetReportName())

    Dim p As ReportParameterInfoCollection = r.GetParameters() 'read only....
    If p.Count > 0 Then
        Dim rptParams(p.Count - 1) As ReportParameter
        Dim i As Integer = 0
        For Each param In p
            rptParams(i) = New ReportParameter(param.Name)
            rptParams(i).Values.Add("99999999")
            i += 1
        Next
        r.SetParameters(rptParams)
    End If

    r.LoadReport()

さようなら、醜くて長い switch ステートメント。さようなら、レポートをロードする方法を知る必要があります....パラメーターをもう少し適切に処理する方法を理解できれば.... ..

私もリフレクションで同じことをして遊んでいます。リフレクション作業を簡単にするこの記事を見つけました。 http://www.slimee.com/2009/09/net-using-reflection-to-execute.html

これで、データ テーブルの文字列を渡すだけで、レポートを駆動するデータ テーブルが生成されます。データセットを使用すると、名前がどのように作成されるかを常に知ることができるため、これを簡単に操作できます。

どちらのアプローチも、見苦しい switch ステートメントを排除し、コードの保守を容易にするソリューションであると私は考えています。リフレクションを使用すると、コードははるかに小さくなりますが、少し遅くなる可能性があります。

両方とも、魔法の文字列の問題が少しあります。行のどこかで、実行したいものの文字列を渡す必要があります。チームは、簡単に解決できる規則を簡単に作成できます....

于 2010-08-24T13:58:07.027 に答える