Как я могу получить инструкцию SQL SELECT, используемую в Crystal Report? - PullRequest
7 голосов
/ 15 ноября 2011

В настоящее время я работаю над программой на C #, которая позволяет нашим пользователям запускать, просматривать и экспортировать пакет Crystal Reports.Отчеты были сделаны с использованием графического интерфейса Crystal Reports 2008.Одна из основных причин для этого - позволить нам сохранять гиперссылки при экспорте Crystal Report в PDF.Моя программа делает это, экспортируя в RTF, а затем преобразовывает RTF в PDF.Если кто-то знает менее запутанный метод сохранения гиперссылок при преобразовании в PDf, я бы хотел услышать его, но это не мой текущий вопрос.

Я провел много тестов по оптимизации моей программы длясделайте так, чтобы экспорт занял как можно меньше времени.Из того, что я видел, запрос приложения к данным, а затем привязка набора результатов к Crystal Report - самый быстрый метод.Моя проблема в том, что я не могу жестко запрограммировать запросы в программу, их нужно получить из самого Crystal Report.

В Crystal Reports 2008 есть опция «Показать запрос SQL» в разделеБаза данных меню.Это вызывает окно с запросом SQL, используемым для данного отчета.Это именно то, что мне нужно, чтобы получить изнутри моего приложения.Я загрузил отчет Crystal и во время отладки перебрал объект ReportDocument, пытаясь найти запрос, но безуспешно.

Итак, мой вопрос;Есть ли какой-либо метод, который позволил бы мне получить запрос, используемый данным Crystal Report?

Ответы [ 2 ]

3 голосов
/ 08 января 2014

Я понимаю, что это очень старый вопрос, но я подумал, что предложу альтернативу для тех, кто наткнулся на это, но нуждается в целевой структуре 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();
    }
2 голосов
/ 16 ноября 2011

Хорошо, так что dotjoe дал мне все подсказки, которые мне нужны, чтобы решить это.Следующий код можно использовать для извлечения текста команды из отчета Crystal.

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».Я отправлю комментарий, как только я проверю это дальше.

  • Скотт

PS Для этого необходимо сослаться на стандартные библиотеки отражений / динамиков, а также следующие библиотеки Crystal Report:

crystaldecisions.reportappserver.datadefmodel

crystaldecisions.crystalreports.engine

crystaldecisions.shared

...