0

データベースにデータを格納するために構築された SQL データベースと ASP.NET Web サイトがあります。

プロジェクトの要件の 1 つは、ユーザーが Crystal Report をサーバーにアップロードし、必要に応じて実行できるようにするシステムを構築することです。このようにして、ユーザーはカスタマイズされたレポートを作成でき(その後、管理、顧客に変わるため)、開発者を経由する必要はありません.

この目標を達成する方法についての提案を探しています。

現在、Crystal Report のデータベース接続を、Crystal Report が開発されたデータベースから最終的に実行されるデータベースにリダイレクトする方法を探しています。ただし、これを行う簡単な方法はないようです。

ReportViewer オブジェクトについても調査中です。しかし、私が見たすべてのコードには、コードでレポートのクエリを指定することが含まれており、これは受け入れられません。

1 つのオプション (私はまったく好きではありません) は、結果を Excel にコピーできるように、独自のクエリを作成できるようにすることです。これは、空白のテキスト ボックスとデータベースの構造に関する情報を意味します。複数の理由から、良い考えではありません。

もう 1 つのオプションは、テーブルごとに 1 つのレポートを作成し (場合によっては追加のレポートもいくつか)、ユーザーが必要なデータを Excel にコピーできるようにすることです。

tl;dr 柔軟な報告システムを構築するにはどうすればよいですか?

=======================================
続き: 08/20/2012
私は持っていますb.pell の拡張メソッドを使用することにしました。これまでのところ、何よりも私を近づけてきました。CrystalReportViewer にバインドする私のコードは以下のとおりです。

CrystalReportSource rs = new CrystalReportSource();
rs.Report.FileName = Server.MapPath("ReportFiles/") + Request["reportname"];
string connstring = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
rs.ReportDocument.ApplyCredentialsFromConnectionString(connstring);
rs.ReportDocument.ApplyNewDatabaseName("myDBName", "mySchemaName");
rs.ReportDocument.Refresh();

CrystalReportViewer1.ReportSource = rs;

これは、作業に非常に近いものです。私の開発マシンでは問題なく動作しますが、サーバーでコードを実行すると、次のエラーが発生します。

ログオンに失敗しました。ファイル CrystalReport2 のエラー {5D2E82E5-783E-4DFD-A770-C8AE72A51E4E}.rpt: 接続できません: ログオン パラメータが正しくありません。説明:現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。例外の詳細: System.Runtime.InteropServices.COMException: Logon failed.Error in File CrystalReport2 {5D2E82E5-783E-4DFD-A770-C8AE72A51E4E}.rpt: 接続できません: ログオン パラメータが正しくありません。ソース エラー:現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

エラーはコードの次の行にあります。

crTable.Location = String.Format("{0}{1}", prefix, crTable.Location.Substring(crTable.Location.LastIndexOf(".") + 1))

ApplyNewDatabaseName の呼び出しを削除すると、サーバー名、データベース名、ユーザー名、およびパスワードを入力するか、統合セキュリティを選択するよう求められます。データベース名またはサーバー名を入力できません (これらのフィールドは無効になっています)。

何かご意見は?

4

3 に答える 3

1

私は、Crystal Reports 接続の変更に関する質問によく答えます (Crystal の方が簡単にできると思いますが、Crystal のサーバー製品がそうしているので、そうでないのではないかと思います)。:D とにかく、実行時にデータベース資格情報を設定できます。Crystal は実行される順序が非常に特殊ですが、このトリックを実行する拡張メソッドに変換したコードがいくつかあります。このコードは、メイン レポートとすべてのサブ レポートを通過し、接続情報を変更します。これは、すべてのサブ レポートがメイン レポートと同じデータベースに接続していることを前提としています (そうでない場合は、複数の接続を処理するように変更する必要がありますが、少なくとも私が行っていることではめったに起こりません)。

接続情報を変更する拡張メソッド: http://www.blakepell.com/2012-05-22-crystal-reports-extension-methods

これは次のように使用されます (ただし、おそらくビューアーにバインドしていて、エクスポートしていないため、無視してもかまいません。これは単なる例です)。

Using rd As New ReportDocument 
    rd.Load("C:\Temp\CrystalReports\InternalAccountReport.rpt") 
    rd.ApplyNewServer("serverName or DSN", "databaseUsername", "databasePassword") 
    rd.ApplyParameters("AccountNumber=038PQRX922;", True) 
    rd.ExportToDisk(ExportFormatType.PortableDocFormat, "c:\temp\test.pdf") 
    rd.Close() 
End Using 

System.Diagnostics.Process.Start("c:\temp\test.pdf") 

この時点で Crystal Viewer を使用して、レポートを配信し、データベースまたはファイル システム (db メタ データ テーブルを使用) にレポートを保存し、ユーザーが選択できる事前定義された接続を使用して、それが適用されるときに適用することができます。走る。

独自のフロント エンドを作成するオプションもあります。このシナリオでは、ユーザーはメタ データからレポートを選択します (任意のセキュリティを設定できます。私は AD を使用します)。次に、レポート パラメータを読み取り、Web フォームにレイアウトできます。ユーザーがそれらに記入したら、それらをサナタイズして、これらの拡張機能を介してレポートに渡します。Excel、PDF、Word Doc、RTF などを出力できます。オーバーヘッドが少し増え、プレビュー ビューは見栄えがよくありませんが、うまく機能します。 (私は過去にこのようなことをしました)。お役に立てれば。

于 2012-08-18T17:20:43.900 に答える
1

あなたが探しているのは、ビジネス インテリジェンスの一部である Reporting Services だと思います。 または、ユーザーがレポートに必要なテーブルと列を選択できるようにする UI をセットアップすることもできます (このようにして、ユーザーがアクセスできる情報を制限できます)。動的クエリビルダー関数などを記述します。

于 2012-08-16T20:58:50.563 に答える
0

あなたの質問の「...彼らに独自のクエリを書かせる」部分について。

解決策は、使いやすいユーザー インターフェイスを備えたクエリ ビルダー コンポーネントを使用して、データベースの複雑さをユーザーから隠し、SQL インジェクションの可能性を回避することです。

市場にはそのような製品はほとんどありません。それらの 1 つは EasyQuery と呼ばれ、別の 1 つは Aspose によってビルドされています。Google で「asp.net のクエリ ビルダー」または「.net クエリ ビルダー コンポーネント」を検索してみてください。

于 2012-08-28T07:42:47.150 に答える