Я хотел бы извлечь SQL-запросы из файлов Crystal Report .rpt, есть ли способ сделать это? - PullRequest
15 голосов
/ 01 апреля 2009

Я хотел бы извлечь SQL-запросы из файлов Crystal Report .rpt, есть ли способ сделать это?

У меня нет ни одного продукта Crystal Reports, только файлы .rpt.

Ответы [ 6 ]

14 голосов
/ 01 ноября 2011

Вот пример .Net кода, который захватывает командный SQL из всех отчетов Crystal Reports в данном каталоге. Для этого требуется установить Crystal 2008 .Net SDK (пробную версию можно загрузить из SAP):

foreach (string file in Directory.GetFiles("c:\\projects\\Reports", "*.rpt"))
{
    Console.WriteLine(String.Format("Processing {0}...", file));
    var doc = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
    doc.Load(file);

    foreach (dynamic table in doc.ReportClientDocument.DatabaseController.Database.Tables)
    {
        if (table.ClassName == "CrystalReports.CommandTable")
        {
            string commandSql = table.CommandText;

            //TODO: do something with commandSql
        }
    }
}

Чтобы получить SQL, который Crystal собирает при запуске отчета, см. Следующую ссылку: SAP-ноту 1280515 - Как извлечь запрос SQL из отчетов Crystal с использованием RAS SDK.

Я полагаю, что для этого вам нужно предоставить значения параметров отчета, чтобы Crystal мог подключиться к базе данных для построения SQL. В этом примере, поскольку используется элемент управления Report Viewer, Crystal может запросить у пользователя параметры.

6 голосов
/ 24 ноября 2009

В «Crystal Design ActiveX Designer Design and Runtime Library» (craxddrt.dll) свойство Report.SQLQueryString будет выполнять то, что вы хотите.

Я не могу найти эквивалентное свойство в .Net SDK, и, поверьте мне, я искал.

** редактировать **

Похоже, что можно использовать In-Process RAS Server для получения этой информации:

CrystalDecisions.ReportAppServer.DataDefModel.CommandTableClass.CommandText

4 голосов
/ 04 апреля 2009

И наоборот, если вы можете запускать отчеты, вы можете подключить SQL Profiler к вашей БД и перехватить входящий SQL на стороне базы данных.

1 голос
/ 31 мая 2018

Ответ Джошла сработал для нескольких моих отчетов, но не для всех. Следующий метод, использующий ReportClientDocument.RowsetController.GetSQLStatement, смог извлечь некоторые запросы, пропущенные другим методом.

foreach (string file in Directory.GetFiles("c:\\projects\\Reports", "*.rpt"))
{
    Console.WriteLine(String.Format("Processing {0}...", file));
    var doc = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
    doc.Load(file);

    var controller = doc.ReportClientDocument.RowsetController;

    var groupPath = new CrystalDecisions.ReportAppServer.DataDefModel.GroupPath();
    string temp = String.Empty;
    string commandSql = controller.GetSQLStatement(groupPath, out temp);
    //TODO: do something with commandSql
}
0 голосов
/ 16 октября 2014

В Visual Studio выберите файл .rpt и перейдите в проводник, щелкните правой кнопкой мыши DatabaseFields. Нажмите на опцию SQL запрос, чтобы просмотреть запрос.

0 голосов
/ 02 апреля 2009

Мой опыт работы с более старыми версиями Crystal (8,9) - я понятия не имею, как выглядят форматы файлов для более поздних версий. Однако на всякий случай стоит открыть файлы в текстовом редакторе, но для форматов файлов, которые я видел, текст запроса недоступен таким образом.

Если я правильно помню, некоторые версии Visual Studio 2003 поставлялись с инструментами для манипулирования файлами Crystal .rpt (но я думаю, что это не очень полезно для вас, так как, если бы у вас уже было это, вы бы не спрашивали !).

Это не очень оригинальное предложение, но, возможно, самым быстрым способом было бы загрузить 30-дневную пробную версию текущего Crystal Reports и посмотреть, откроет ли это файлы для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...