Новые подходы к Crystal Reports (Report Designer Component)

Thomas Althammer , Ice Tea Group, LLC.

Возможно, вы раньше читали об использовании Crystal Reports, в Centura Pro публиковались статьи об этом. Кое-кто из вас, может быть, даже имеет некоторый опыт использования этого инструментария. Возможно, вы имели дело с Crystal Reports Print Engine (CRPE), собственным интерфейсом через внешние функции и загружали сложные структуры. Иногда как для квалифицированных специалистов, так и для обычных людей, это не самое продуктивное занятие.

Существует современный интерфейс RDC (Report Designer Component - компонент проектирования отчетов), основанный на технологии COM. Он содержит полное иерархическое представление всех функциональных возможностей Crystal Reports.

На первый взгляд Crystal Reports обычное MDI приложение. Вместо работы с документами или таблицами вы работаете с шаблонами отчетов. Эти шаблоны отчетов содержат описания и раскладки для создания во время исполнения осмысленных (хочется надеяться) отчетов на основе структурированных данных из базы данных и описаний, содержащихся в файле RPT.

Иерархическое представление начинается с объекта Application, который содержит методы для установления связи с базой данных и создания новых или открытия существующих отчетов. В свою очередь объект отчета содержит методы для изменения свойств отчета и включает Sections (секции), Areas (области), Parameters (параметры) и другие свойства, которые в свою очередь являются объектами со своими собственными функциональными возможностями. Последние возвращают объект отчета, который имеет несколько свойств и методов для доступа к частям загруженного файла и изменения этих частей. В действительности, как только станет ясной общая концепция, это чрезвычайно просто и легко понять и не нужно долго возиться, чтобы что-то начать делать. Однако, как всегда, здесь есть несколько препятствий, которые нужно преодолеть.

Для получения предварительной информации о предлагаемых функциональных возможностях, вы можете обратиться к следующим источникам:

  • Файл справки Developer.hlp , расположенный в подкаталоге Developer Files\Help каталога Crystal Reports. Он содержит большое количество информации о различных доступных интерфейсах и функциях.
  • Посетите www.support.seagatesoftware.com, выберите ссылку Documentation и поищите файл RDC8_Browser.exe. После его инсталляции на вашей машине, вы получите иерархическое окно просмотра, содержащее всю документацию, необходимую для использования элементов Crystal Reports Designer Component.

Лично я предпочитаю RDC Browser по сравнению с файлом справки. Это достаточно разумный путь изучения COM-компонентов.

Теперь у нас есть вся информация, необходимая для понимания того, что делают COM-объекты. Ниже приводится короткая пошаговая инструкция, как инкорпорировать Crystal Reports в ваше приложение. Здесь предполагается, что Crystal Reports 8  и Centura Team Developer 1.5.x корректно установлены на вашей машине . В основном те же шаги применимы и для Centura Team Developer 2000, однако существует небольшое различие из-за нового проводника ActiveX и других второстепенных объектов.

  1. Запустите Centura Team Developer
  2. Переход к <Component>, <ActiveX wizard> - CTD загрузит список всех зарегистрированных COM-компонент.
  3. Выберите "Crystal Reports ActiveX Designer Run Time Library", местоположение должно указывать на каталог Seagate Software с программными файлами. Этот список содержит все зарегистрированные COM-компоненты. На вашей машине могут присутствовать и другие компоненты, но они не зарегистрированы. Это может быть сделано с помощью кнопки "Browse" или из командной строки: "regsvr32 [library.dll]".
  4. Нажмите "Next".
  5. Появится список доступных классов, начиная с CRAXDRT_Application, которые содержатся в craxdrt.dll. Это место, где мы выбираем функциональные возможности, имея в виду библиотечные объекты, которые мы хотим использовать. Выберите каждый элемент отдельно или для экономии времени нажмите "Select All".
  6. Выберите "All" для генерации установок. Если вы спросите себя, что все это значит, вы можете найти достаточно хорошее объяснение в разделе "ActiveX Automation Wizard" файла справки.
  7. Выберите "Advanced" для установки режимов генерации функций свойств. По умолчанию это "PropGet" и "PropSet", которые лично мне не нравятся. Вы можете захотеть выбрать "get" и "set". Например, для изменения свойства bold (жирный) для текстового объекта такая установка приведет к тому, что эти функции в охватывающем классе будут названы "getBold" и "setBold". Я объясню значение термина "охватывающий класс" чуть позже. Сейчас выйдите из диалога, нажав кнопку "OK".
  8. Вернитесь в программу-мастер ActiveX, нажмите "Finish" - появится окно прогресса, пока программа-мастер генерирует в фоновом режиме некоторые классы.

Как только программа-мастер закончит работу, вы снова окажетесь в своем окружении, в котором изменилось не так уж и много. По крайней мере, вы можете заметить, что ветвь "classes" изменила свое состояние так, что теперь ее можно раскрывать. Посмотрите на все эти классы - узнаете их? Мы их только что видели в качестве объектов, содержащихся в библиотеке craxdrt.dll.

Что вообще такое COM? COM - это способ разделять функциональные возможности и логику между приложениями. Использование COM-компонент должно быть так же просто, как указание используемых библиотек. Так это работает в VisualBasic, если вы когда-нибудь обращали на это внимание. Однако, для SQLWindows  необходимы так называемые "охватывающие классы", представляющие функциональные возможности инкорпорированных компонент. Функции, которые содержатся в этих классах, не имеют собственной логики, а только вызывают функции COM-объекта - все это необходимо для успешной компиляции в SQLWindows.

Например, раскройте класс CRAXDRT_IApplication в CTD, и взгляните на функцию "OpenReport", чтобы увидеть, что происходит в SQLWindows.

Пока что никаких сюрпризов... Хотите один? Просто нажмите F8! Вы только что споткнулись на двух проблемах программы-мастера ActiveX. Первая из них - ограничение на длину имени в 32 символа в SQLWindows. Единственный обходной путь - вручную изменить имена классов . Например, CRAXDRT_IRunningTotalFieldDefinitions нужно изменить на CRAXDRT_IRunningTotalFieldDefs. Вторая проблема - ошибка программы-мастера ActiveX, которая по каким-то причинам приводит к игнорированию некоторых элементов. Вам пройдется проделать кое-какую ручную работу, объем которой зависит от типа и размера используемых объектов. Вообще, из соображений производительности и затрат на сопровождение, разумно импортировать с помощью программы-мастера ActiveX только необходимые элементы.

Хорошая новость в том, что все это изменилось с появлением Centura Team Developer 2000.

Перед тем, как мы снова запустим программу-мастер и просто выберем несколько классов, нам нужно удалить старую библиотеку. Найдите подкаталог AXLibs в каталоге установки Centura Team Developer. Удалите Crystal Reports 8 ActiveX Designer Run Time Library.apl и снова запустите программу-мастер в SQLWindows. Теперь выберите только CRAXDRT_Application, CRAXDRT_IApplication, CRAXDRT_Report и CRAXDRT_IReport. Если хотите, установите префиксы функций "get" и "set" вместо "PropGet" и "PropSet". Убедитесь, что в этот раз вы выбрали "Full" вместо "All".

При выполнении следующих шагов предполагается, что у нас есть тестовый отчет, который базируется на драйвере ODBC CRGUP , устанавливаемом вместе с Crystal Reports.

Для использования функциональных возможностей Crystal Reports в вашем приложении давайте попробуем выполнить следующие шаги для распечатки отчета из SQLWindows.

  1. Введите глобальную функцию PrintReport( ) с одним текстовым параметром "p_sFileName" и возвращаемым значением типа Boolean.
  2. Добавьте следующий код для этой функции:

    Function: PrintReport
    Description:
    Returns
    Boolean:
    Parameters
    String: p_sFileName
    Static Variables
    Local variables
    Boolean: bOk
    Variant: vOptional
    CRAXDRT_Application: oApplication
    CRAXDRT_IReport: oReport
    Actions
    Set bOk = TRUE
    Call vOptional.MakeOptional( )
    !
    Set bOk = bOk AND oApplication.Init( )
    Set bOk = bOk AND oApplication.OpenReport( p_sFileName,
    vOptional, oReport )
    Set bOk = bOk AND oReport.PrintOut( vOptional, vOptional,
    vOptional, vOptional, vOptional )
    !
    Return bOk

  3. Добавьте в SAM_AppStartup вызов этой функции с передачей в качестве параметра имени вашего тестового отчета. Например, так: PrintReport("C:\\Test.rpt"). Позаботьтесь об удвоении обратной косой черты.
  4. Нажмите F7 для исполнения приложения. В результате должен появиться диалог печати Crystal Reports. Нажатие OK должно привести к печати отчета.

Добавление возможности предварительного просмотра

Для добавления возможности предварительного просмотра отчета в SQLWindows выполните шаги, перечисленные ниже:

  1. Запустите снова программу-мастер ActiveX и выберите Crystal Report Viewer Control (убедитесь, что выбрана библиотека crviewer.dll).
  2. Выберите все элементы, запросив "All" - для этого может понадобиться перейти в расширенный режим и сделать изменения там.
  3. Добавьте окно формы, нажмите кнопку ActiveX в контрольной панели, выберите Crystal Report Viewer Control и поместите его экземпляр в окне формы.
  4. Добавьте к форме следующую функцию:

    Function: showReport
    Description:
    Returns
    Boolean:
    Parameters
    String: p_sFileName
    Static Variables
    Local variables
    Boolean: bOk
    Variant: vOptional
    CRAXDRT_Application: oApplication
    CRAXDRT_IReport: oReport
    Variant: vObject
    Actions
    Set bOk = TRUE
    Call vOptional.MakeOptional( )
    !
    Set bOk = bOk AND oApplication.Init( )
    Set bOk = bOk AND oApplication.OpenReport( p_sFileName,
    vOptional, oReport )
    ! Assign the report object to the preview control
    Set bOk = bOk AND vObject.SetObject( oReport )
    Call ax1.setReportSource( vObject )
    Call ax1.ViewReport( )
    !
    Return bOk

  5. В SAM_CreateComplete добавьте вызов функции showReport ("C:\\Test.rpt") и запустите приложение.

Это был краткий курс работы с компонентами ActiveX в целом и с Crystal Reports в частности.

В следующей статье мы рассмотрим интерфейсы с SQLBase и связь через ODBC.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=4948