Первый отчет 7 Компоненты 11 Создание отчетов 19 Обзор печатных (printable) компонент 35

Вид материалаОтчет
Мастер/детайл отчеты
Master установилось в QuickRep1
Обзор печатных (printable) компонент
Текстовые компоненты
Форматирование полей
Использование выражений
Formatnumeric(f, n)
Master с компонентом TQuickRep
Построитель выражений
Создание собственного просмотра
OnClose. Если вы не вызовете метод ClosePreview
Дополнительные ресурсы
Demo applications.
Templates and wizards.
Подобный материал:
1   2   3   4   5   6

Группы


Группы позволяют вам генерировать дополнительные секции между группами записей. Например, если вы печатаете список из адресной книги, вы может быть желаете группировать все записи у которых первая буква имени одинаковая, и печатать большую букву между группами – в действительности это то, что мы сейчас сделаем в примере.

Для создания группы:

  1. Создайте простой отчет, как это описано в ‘Первый отчет’.
  2. Установите свойство IndexName компоненты TTable в ‘ByCompany’.
  3. Бросьте компонент TQRGroup на TQuickRep объект, появится новая секция. Данная секция будет заголовком для группы (group header). Каждый раз, когда будет начинаться новая группа, данная секция будет напечатана.
  4. Установите свойство Expression в

COPY(Table1.Company,1,1)

    Это извлечет первую букву из поля ‘Company’.
  1. Бросьте компонент TQRExpr на данную секцию. Установите свойство Expression в тоже самое значение

    COPY(Table1.Company, 1, 1)

В дополнение вы также должны добавить секцию group footer. Хотя нам здесь это и не требуется, но мы сделаем одну для практики.
  1. Выберите компонент TQRBand на палитре и бросьте его в отчет. Переименуйте его в FooterBand1.
  2. Щелкните по секции the group еще раз. Установите свойство TQRGroup.FooterBand в FooterBand1.
  3. Бросьте компонент TQRLabel на footer band. Установите свойство Caption в ‘FOOTER’.



Если все сделано правильно, то вы должны увидеть следующее, как на Figure 11:

Figure 11 - Creating a group



Просмотрите отчет, или путем запуска программы, или просто выбрав правой кнопкой пункт Preview:

Figure 12 - Preview of a grouped report



Как планировалось, отчет показывает список всех компаний в алфавитном порядке, каждая группа имеет заголовок в виде буквы.

Мастер/детайл отчеты


Часто требуется отчет типа master/detail – это когда вы извлекаете данные из двух наборов данных, объединенных связью master/detail. QuickReport позволяет вам включать одну или несколько таких связей в отчет, с помощью компоненты TQRSubDetail.

В приведенном примере a master/detail отчета выводится список всех заказов по каждому заказчику в базе данных. Здесь краткий пример:

  1. Создайте группированный отчет, как описано в предыдущей главе.
  2. Бросьте компонент TDataSource на форму, и назначьте его свойство DataSet равным ‘Table1’.
  3. Бросьте новый компонент TTable на форму. Установите его свойство DatabaseName в ‘DBDemos’, TableName в ‘ORDERS.DB’, IndexName в ‘CustNo’, MasterSource в ‘DataSource1’, MasterFields в ‘CustNo’ и Active в True. Два компонента TTable сейчас имеют связь master/detail.
  4. Бросьте компонент TQRSubDetail на существующий TQuickRep, где это появится как новая секция. Заметим, что свойство Master установилось в QuickRep1. Связь master/detail между двумя TTable объектами отразилось между объектами отчета и секциями.
  5. Установите свойство DataSet компоненты TQRSubDetail в ‘Table2’. Компонент TQRSubDetail будет выводить все записи через его DataSet для каждого изменения Dataset мастера.
  6. Бросьте три компонента TQRDBText на секцию sub detail. Установите свойство DataSet в ‘Table2’, и установите свойство DataField в ‘OrderNo’, ‘SaleDate’ и ‘ItemsTotal’.



Если вы все выполнили корректно, то вы должны увидеть нечто подобное Figure 13.

Figure 13 - Creating a report with sub detail




Теперь посмотрим отчет. Результат должен выглядеть подобно Figure 14, список заказов ниже имени каждого заказчика. Заметим, что формат дат и денежных полей зависит от установок в Windows.

Figure 14 - Preview of a master/detail report




Обзор печатных (printable) компонент


В данный момент, вы уже имеете представление об печатных компонентах QuickReport’s – использования их как обычных органов управления. Тем не менее есть несколько специфичных для QuickReport аспектов.

Текстовые компоненты


Текстовые печатные компоненты QuickReport’s – TQRLabel, TQRDBText, TQRExpr, TQRSysData, TQRMemo, TQRExprMemo, TQRRichText и TQRDBRichText – используют несколько общих свойств, которые они наследуют:

Table 3 - Text component properties

Property

Purpose

AlignToBand

По умолчанию все компоненты печатаются в позиции установленной во время проектирования. Но иногда более практично по вертикальным углам секции, на которой они размещены. Если свойство AlignToBand установлено в True, то компонент выравнивается относительно секции, в которой он размещен..

AutoSize

При установке этого свойства в True компонент расширяется по горизонтали, что разместить весь текст.

AutoStretch

Если свойство AutoStretch и WordWrap оба установлены в True, компонент может расширяться по вертикали, что бы разместить весь текст. Когда компонент расширяется подобным образом, то расширяется и секция, на которой он, определяется свойством CanExpand. При необходимости секция может расширяться на несколько страниц.

Заметим, что если компонент расширяется, то это не перемещает другие компоненты вниз. Если имеются другие компоненты, которые зависят от размеров расширяемого компонента, то такие компоненты должны размещаться секции child.

Заметим, что данное свойство не может быть использовано для компонент размещенных на любой секции внизу страницы, типично это page footer, но также любые секции, у которых установлено свойство AlignToBottom в True.

Frame

Все текстовые компоненты могут показывать видимую рамку вокруг себя.

Size

Все печатные компоненты имеют свойство Size. Если свойство AutoSize установлено в False вы можете использовать данное свойство для установки точного размера компонента. Данное свойство содержит также позицию компонента относительно секции.

WordWrap

Если свойство WordWrap установлен True текст может расширяться на несколько строк.

Форматирование полей


Компонент TQRDBText использует опции форматирования определенные в для поля, к которому он подключен. Иногда, вам нужно отображать текст иначе, в этом случае вы можете использовать свойство Mask компоненты TQRDBText. В этом поле вы можете вводить те же самые значения, как это определено в функции FormatFloat function (для цифровых полей) и в функции FormatDateTime (для полей типа date и time) – в действительности, QuickReport сам вызывает эти функции. Покажем на примере, условимся, что вы хотите напечатать цифровое значение с двумя знаками после запятой, и в качестве разделителя тысяч - запятую, и отрицательный в круглых скобках. То маска должна выглядеть следующим образом #,##0.00;(#,##0.00) и которое напечатает для значений 1234 и -1234.5 следующий вывод 1,234.00 и (1,234.50) соответственно.

Сверьтесь с Delphi хелпом по функциям FormatFloat и FormatDateTime.

Для форматирования поля используйте свойство Mask. Маска работает по разному для разных типов полей.


Использование выражений


QuickReport включает расширенный анализатор выражений, используемый компонентами TQRExpr, TQRExprMemo и TQRGroup. Выражения могут быть использованы для объединения и манипулирования полями баз данных, и для выполнения различного форматирования. Их синтаксис подобен синтаксису Object Pascal: выражения могут быть логического, с плавающей запятой, целого типа или строкового типа. Заметим, что поля дат и времени преобразовываются в строки, а BLOB и memo поля не поддерживаются в выражениях.

Анализатор выражений использует следующий набор операторов:

Table 4 - Operators supported by the expression evaluator

Operators

Function

+

Сложение и объединение строк

- * /

Вычитание, умножение и деление

()

Группирование

And Or Not

Логические операторы

= < >

<= >= <>

Операции сравнения



И набор стандартных функций:

Table 5 - Functions supported by the expression evaluator

Function

Description

AVERAGE(EXPR)

Агрегатные функции. Среднее значение выражения

COPY(STR,S,L)

Возвращает субстроку, начиная с позиции S размером L

COUNT

Агрегатная функция, возвращает количество итераций секции Master.

DATE

Возвращает текущую дату в виде строки

DIV(X, Y)

Целочисленное деление X на Y

FALSE

Логическое значение ЛОЖЬ False

FORMATNUMERIC(F, N)

Форматирует номер N используя маску F. Маска соответствует функции FormatFloat.

FRAC(NUM)

Возвращает дробную часть числа NUM

IF(EXPR, R1, R2)

Возвращает или R1 или R2 в зависимости от логического значения EXPR

INT(NUM)

Возвращает целую часть числа NUM

LOWER(STR)

Возвращает строку из малых букв

MAX(EXPR)

Агрегатная функция. Возвращает максимальное значение выражения EXPR

MIN(EXPR)

Агрегатная функция. Возвращает минимальное значение выражения EXPR

PRETTY(STR)

Возвращает строку, у которой первая буква заглавная, а остальные прописные

SQRT(NUM)

Возвращает квадратный корень числа NUM

STR(NUM)

Превращает число в строку

SUM(EXPR)

Агрегатная функция. Возвращает сумму выражения EXPR

TIME

Возвращает текущее время в виде строки

TRUE

Логическое значение ИСТИНА

TYPEOF(EXPR)

Возвращает тип выражения в виде строки. Например ‘BOOLEAN’

UPPER(STR)

Возвращает строку из больших букв



Если ваше выражение включает агрегатную функцию, например SUM или COUNT вы должны связать свойство Master с компонентом TQuickRep или TQRSubDetail. Для простого отчета это ваш компонент TQuickRep, но в сложных отчетах это может быть любой набор данных. Выражение пересчитывается каждый раз, как указатель master изменяется.

Свойство ResetAfterPrint также используется при работе с агрегатными функциями, и позволяет вам создавать, например групповые итоги как изменяемые во время отчета.

Построитель выражений


Для упрощения создания выражения, QuickReport включает специальный редактор свойств, который доступен по нажатию на клавишу ‘…’. Это показано на Figure 15.

Figure 15 - Expression builder dialog



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

Figure 16 - Setting function arguments in the expression builder




Создание собственного просмотра


Как мы отмечали ранее, в главе ‘Просмотр и композитные отчеты’, что имеется возможность создать свой собственный механизм просмотра. Теперь самое время показать, как это сделать.

Первым шагом создание собственного просмотра - это наследование от TQRPreviewInterface, подобно этому:

// use QRPrntr to get TQRPreviewInterface


TQRCustomPreviewInterface = class(TQRPreviewInterface)

public

function Show(AQRPrinter : TQRPrinter)

: TWinControl; override;

function ShowModal(AQRPrinter : TQRPrinter)

: TWinControl; override;

end;


Заметим, что это интерфейсный класс interface1 – это обрабатывает только несколько функций. Эти две функции предназначены для отображения в модальной и не модальной форме.

Предположим, что форма просмотра называется TCustPreview. Затем реализуем методы TQRCustomPreviewInterface, которые выглядят так:

function TQRCustomPreviewInterface.Show(

AQRPrinter: TQRPrinter): TWinControl;

var

frm : TCustPreview;

begin

frm := TCustPreview.Create(Application, AQRPrinter);

frm.Show;

Result := frm;

end;


function TQRCustomPreviewInterface.ShowModal(

AQRPrinter: TQRPrinter): TWinControl;

var

frm : TCustPreview;

begin

frm := TCustPreview.Create(Application, AQRPrinter);

frm.ShowModal;

Result := frm;

end;


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

RegisterPreviewClass(TQRCustomPreviewInterface);


Теперь мы сделали простой код и можем построить форму просмотра. Здесь только минимум; простой компонент TQRPreview на форме:

Figure 17 - Simple preview form



Когда вы будете создавать реальный просмотровщик для ваших приложений, то вы добавите кнопки для вызова метода TQRPreview.Zoom и других возможностей.

Для поддержки механизм просмотра, я написал немного больше кода. Здесь объявление TCustPreview. Заметим, что я добавил новый конструктор, который позволяет принимать в качестве аргумента the TQRPrinter передаваемый методами Show и ShowModal интерфейсного класса. Delphi генерирует предупредительное сообщение, что новый конструктор скрывает оригинал. В данном случае это правильно и написал в классе

{$WARNINGS ON} ... {$WARNINGS OFF}

для подавления предупреждений компилятора.

{$WARNINGS OFF}

TCustPreview = class(TForm)

QRPreview1: TQRPreview;

procedure CustPreviewClose(Sender: TObject;

var Action: TCloseAction);

private

{ Private declarations }

fQRPrinter : TQRPrinter;

public

{ Public declarations }

constructor Create(AOwner : TComponent;

AQRPrinter : TQRPrinter); virtual;

end;

{$WARNINGS ON}

Окончательно, здесь реализация класса. Заметим, что код очистки расположен в обработчике OnClose. Если вы не вызовете метод ClosePreview здесь, вы будете иметь утечку памяти. (QuickReport 2 должны знать это новое требование. Вы должны модифицировать ваши существующие формы просмотра, когда будете сортировать их в QuickReport 3.)


constructor TCustPreview.Create(AOwner: TComponent;

AQRPrinter: TQRPrinter);

begin

inherited Create(AOwner);

fQRPrinter := AQRPrinter;

QRPreview1.QRPrinter := AQRPrinter;

end;


procedure TCustPreview.CustPreviewClose(Sender: TObject;

var Action: TCloseAction);

begin

fQRPrinter.ClosePreview(Self);

Action := caFree;

end;


Дополнительные ресурсы


Имеется много других ресурсов, которые помогут вам в применении QuickReport в ваших приложениях.

Help files. QuickReport хелп фалы инсталлируются и интегрируются с Delphi хелп системой. Как положено это чувствительно к контексту, также имеет руководство пользователя и база знаний. Но они не появляются в главном оглавлении справочной системы.

Demo applications. Вы можете найти здесь

Program Files\Borland\Delphi5\Demos

Проект Quickrpt\Qr3\qr3demo.dpr содержит множество примеров. Начните здесь если вы желаете поглубже изучить различные свойства QuickReport, например фильтры экспорта. Также посмотрите проект Db\Mastapp\mastapp.dpr, который содержит прекрасный пример использования QuickReport интегрированный в большой проект.

Templates and wizards. Стандартный репозиторий Delphi содержит шаблоны построения отчетов Master/detail, ярлыков и списков, плюс помощник построения отчетов (report building wizard). Выберите File | New из Delphi и смотрите закладки Forms и Business.

Website. Наш сайт ссылка скрыта Пожалуйста приходите и поищите больше примеров, апдейтов, советов и дополнений.

1 Мы не используем ключевое слово interface при определении класса, поскольку пока это не распространенная практика и многие Delphi програмисты еще плохо знакомы с его ситаксисом. Тем не менее концепции подобны.