2011-11-15 17 views
7

私は現在、ユーザーがCrystal Reportsのバッチを実行、表示、およびエクスポートできるようにするC#のプログラムを作成中です。レポートはCrystal Reports 2008 GUIを使用して作成されました。これを行う主な理由の1つは、Crystal ReportをPDFにエクスポートするときにハイパーリンクを維持できるようにすることです。私のプログラムは、rtfにエクスポートし、rtfをpdfに変換することでこれを行います。誰かがPDfに変換するときに、あまり複雑ではないハイパーリンクを保持する方法を知っているなら、それを聞きたいのですが、それは私の現在の質問ではありません。Crystal Reportで使用されるSQL SELECT文を取得するにはどうすればよいですか?

私は、エクスポートをできるだけ短時間で行うためにプログラムを最適化する方法について、多くのテストを行いました。私が見たことから、データのアプリケーションクエリを持つと、結果セットをCrystal Reportにバインドするのがはるかに速い方法です。私の問題は、プログラムにクエリをハードコードすることができないことです。Crystal Report自体からクエリを取得する必要があります。

Crystal Reports 2008には、[データベース]メニューの[SQLクエリの表示]というオプションがあります。これにより、指定されたレポートに使用されるSQLクエリがウィンドウに表示されます。これはまさに私のアプリケーションの中から私の手を得るために必要なものです。私はクリスタルレポートを読み込み、デバッグ中にクエリーを見つけようとするReportDocumentオブジェクトを横断しましたが、運はありません。

私の質問は次のとおりです。特定のCrystal Reportで使用されているクエリを引き出す方法はありますか?

+0

レポートのテーブルが「SQLコマンド」の場合でも、データソースは設定できますか?テーブルをデータセット(xsd)から作成しなければならないと思いましたか? – dotjoe

+0

私のテストでは、Crystal Reportは「SQLコマンド」を「テーブル」として使用していました。レポートで「SQLコマンド」を構成したのと同じSQL selectを使用して、データベースから照会したデータセットにレポートをバインドすることは問題ありませんでした。それは完全に機能し、それ自身のデータを更新するためにレポート自体を取得するよりも速かった。 – Chronicide

+0

興味深いことに、私はPUSHモデルにレポートを変換しようとしていますが、データソースを渡すだけの場合は必要ありません。私はすべてw /およびw/outパラメータを使用してストアドプロシージャです。 – dotjoe

答えて

2

大丈夫だから、ドットジョーは私にこれを解決するために必要なヒントをくれた。次のコードを使用して、クリスタルレポートからコマンドテキストを取り出すことができます。

public string getCommandText(ReportDocument rd) 
{ 
    if (!rd.IsLoaded) 
     throw new ArgumentException("Please ensure that the reportDocument has been loaded before being passed to getCommandText"); 
    PropertyInfo pi = rd.Database.Tables.GetType().GetProperty("RasTables", BindingFlags.NonPublic | BindingFlags.Instance); 
    return ((dynamic)pi.GetValue(rd.Database.Tables, pi.GetIndexParameters()))[0].CommandText; 
} 

これはちょっと混乱していますが、あなたがそれを見越していくと何らかの意味があります。基本的には、リフレクションを使用してCommandTextプロパティの値を取得し、小さなダイナミクスをスローしてReportDocumentの動的プロパティを超えるようにします。

これは私のためのコマンドテキストを引き出していますが、コードのテストを行う時間がありませんでした。私は一度これで作業する時間があれば、私はいくつかの微調整を行うだろうと確信しています。 「SQLコマンド」を使用しないレポートで何が起こるかわからない。私はこれをさらにテストした後、コメントを投稿します。

  • スコット

P.S.

crystaldecisions.reportappserver.datadefmodel

+0

非常に良い仕事! – dotjoe

+0

パラメータを置き換えたsqlコマンドが必要です。指定されたコードでSQLコマンドを取得できますが、パラメータは指定された値に置き換えられません。どのようにして最終的なSQL文を入手できますか? &ReportDocumentを使用してIEnumerableコレクションまたはdataTableでクエリのDataSetを取得できますか? – zeppelin

3

をcrystaldecisions.shared

crystaldecisions.crystalreports.engine:これは、標準の反射/動的ライブラリと同様に、以下のCrystalレポートライブラリを参照することが必要です私はこれが非常に古い質問であることを認識していますが、この問題を抱えている人には、3.5のフレームワークターゲットが必要です(3.5ではダイナミックは利用できません)。

この解決策が機能するには、次の参考資料が必要です。

using CrystalDecisions.ReportAppServer.DataDefModel; 
using CrystalDecisions.CrystalReports.Engine; 

次に、ClientDocインターフェイスに次のコマンドでアクセスし、コマンドテキスト文字列のリストを返します。

private static List<string> GetCommandText(CrystalDecisions.CrystalReports.Engine.ReportDocument report) 
    { 
     var rptClientDoc = report.ReportClientDocument; 
     return rptClientDoc.DatabaseController.Database.Tables.OfType<CommandTable>() 
       .Select(cmdTbl => cmdTbl.CommandText).ToList(); 
    } 
+1

私はこのように最高です。読んで理解するのが簡単です。 – tuespetre

+0

@tuespetreありがとう!うれしかったよ! –

関連する問題