Crystal Reports - 搜索依赖项

时间:2012-05-25 14:01:47

标签: crystal-reports dependencies crystal-reports-2008

是否有工具可以让您搜索多个不同的水晶报告,以查看特定的表格/视图/ SP的使用位置?

场景是这样的:我们有200多个报告,因此在更改视图或存储过程时,如果不打开每个报告并检查“数据库专家”或“数据源位置”,要查找哪些报告会受到影响并不容易”

我已尝试使用Agent Ransack,但它不会选择任何表或视图名称。

2 个答案:

答案 0 :(得分:1)

请在此处查看问题: Any way to search inside a Crystal Report

另一种选择是使用自己的软件来完成它,但这可能比你想要的更耗时。或者,找到已经完成此操作的人:)如果你发现有效的东西,让我们其他人知道,因为我们都在同一条船上。祝你好运!

答案 1 :(得分:1)

我从未找到过这样做的工具,所以在C#.Net 4.0中推出了自己的工具。

如果水晶报告使用“SQL命令”而不是在表格中拖动,则会变得有点棘手。我建议只搜索TableName而不是完全限定的Database.dbo.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
            }
        }
    }
}

希望有所帮助!