是否有一种工具可以让您搜索许多不同的水晶报表以查看特定表/视图/SP 的使用位置?
场景是这样的:我们有 200 多个报告,因此当对视图或存储过程进行更改时,如果不打开每个报告并检查“数据库专家”或“数据源位置”,就很难找到哪些报告会受到影响。
我已经在他们身上尝试过 Agent Ransack,它没有选择任何表或视图名称。
是否有一种工具可以让您搜索许多不同的水晶报表以查看特定表/视图/SP 的使用位置?
场景是这样的:我们有 200 多个报告,因此当对视图或存储过程进行更改时,如果不打开每个报告并检查“数据库专家”或“数据源位置”,就很难找到哪些报告会受到影响。
我已经在他们身上尝试过 Agent Ransack,它没有选择任何表或视图名称。
在此处查看问题: 在 Crystal Report 中进行搜索的任何方式
另一种选择是滚动你自己的软件来完成它,但这可能比你想要的更耗时。或者,找一个已经这样做过的人 :) 如果你找到了可行的方法,请让我们其他人知道,因为我们都在同一条船上。祝你好运!
我从未找到执行此操作的工具,因此在 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
}
}
}
}
希望有帮助!