1

さまざまな Crystal レポートを検索して、特定のテーブル/ビュー/SP がどこで使用されているかを確認できるツールはありますか?

シナリオは次のとおりです。200 以上のレポートがあるため、ビューまたはストアド プロシージャに変更を加える場合、各レポートを開いて「データベース エキスパート」または「データソースの場所」を確認しないと、影響を受けるレポートを見つけるのは容易ではありません。

それらに対して Agent Ransack を試しましたが、テーブルまたはビューの名前が見つかりません。

4

2 に答える 2

1

これを行うためのツールが見つからなかったので、C# .Net 4.0 で自分で作成しました。

Crystal レポートでテーブルをドラッグする代わりに「SQL コマンド」を使用すると、少し扱いに​​くくなります。完全修飾された Database.dbo.TableName ではなく、TableName のみを検索することをお勧めします。これは、貼り付けられた SQL コマンドで省略されている可能性があるためです。

利用方法:

var reports = CrystalExtensions.FindUsages("C:/Reports", "table_name");

コード:

namespace Crystal.Helpers
{
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using CrystalDecisions.CrystalReports.Engine;
    using Microsoft.CSharp.RuntimeBinder;

    public static class CrystalExtensions
    {
        public static List<string> FindUsages(string directory, string tableName)
        {
            var result = new List<string>();

            foreach (var file in Directory.EnumerateFiles(directory, "*.rpt", SearchOption.AllDirectories))
            {
                using (var report = new ReportClass { FileName = file })
                {
                    if (report.Database == null) continue;

                    var tables = report.Database.Tables.ToList();
                    var hasTable = tables.Any(x => x.Name == tableName || x.GetCommandText().Contains(tableName));

                    if (hasTable)
                        result.Add(file);
                }
            }

            return result;
        }

        public static List<Table> ToList(this Tables tables)
        {
            var list = new List<Table>();
            var enumerator = tables.GetEnumerator();

            while (enumerator.MoveNext())
                list.Add((Table)enumerator.Current);

            return list;
        }

        public static string GetCommandText(this Table table)
        {
            var propertyInfo = table.GetType().GetProperty("RasTable", BindingFlags.NonPublic | BindingFlags.Instance);

            try
            {
                return ((dynamic)propertyInfo.GetValue(table, propertyInfo.GetIndexParameters())).CommandText;
            }
            catch (RuntimeBinderException)
            {
                return ""; // for simplicity of code above, really should return null
            }
        }
    }
}

それが役立つことを願っています!

于 2012-06-28T20:45:44.880 に答える
1

こちらの質問を参照してください: Crystal Report 内を検索する方法

もう 1 つのオプションは、それを行うために独自のソフトウェアを作成することですが、探しているよりも時間がかかる可能性があります。または、すでにこれを行っている人を見つけてください:) うまくいくものを見つけたら、残りの人に知らせてください。私たちは皆同じ船に乗っているからです。幸運を!

于 2012-05-25T15:15:55.507 に答える