Первый отчет 7 Компоненты 11 Создание отчетов 19 Обзор печатных (printable) компонент 35
Вид материала | Отчет |
- Библиотеки Челябинского региона – юношеству Аналитический обзор по материалам отчетов, 678.96kb.
- Создание библиотеки элементов в маршруте проекирования печатных плат, 27.62kb.
- Отчёт о научно-исследовательской работе проведение международного мониторинга отраслевых, 844.65kb.
- Отчет: Компонент 2 " Аналитический обзор видов страхования в ес и их сравнение с российской, 541.42kb.
- Тематическое планирование по литературе на 2010-2011 учебный год, 81.48kb.
- Обработка и передача изображений, 241.81kb.
- Обзор выполнения программы за период с 1 января по 30 июня 2004 Г. Отчет Секретариата, 1186.73kb.
- Заслушав и обсудив отчет председателя секции Черкашина М. В., по результатам смотр-конкурса, 15.11kb.
- План мероприятий по совершенствованию, развитию и сопровождению иср имср, 81.6kb.
- Аудиторских заключений и отчетов, 209.38kb.
Группы
Группы позволяют вам генерировать дополнительные секции между группами записей. Например, если вы печатаете список из адресной книги, вы может быть желаете группировать все записи у которых первая буква имени одинаковая, и печатать большую букву между группами – в действительности это то, что мы сейчас сделаем в примере.
Для создания группы:
Создайте простой отчет, как это описано в ‘Первый отчет’.
- Установите свойство IndexName компоненты TTable в ‘ByCompany’.
- Бросьте компонент TQRGroup на TQuickRep объект, появится новая секция. Данная секция будет заголовком для группы (group header). Каждый раз, когда будет начинаться новая группа, данная секция будет напечатана.
- Установите свойство Expression в
COPY(Table1.Company,1,1)
- Бросьте компонент TQRExpr на данную секцию. Установите свойство Expression в тоже самое значение
COPY(Table1.Company, 1, 1)
Это извлечет первую букву из поля ‘Company’.
В дополнение вы также должны добавить секцию group footer. Хотя нам здесь это и не требуется, но мы сделаем одну для практики.
- Выберите компонент TQRBand на палитре и бросьте его в отчет. Переименуйте его в FooterBand1.
- Щелкните по секции the group еще раз. Установите свойство TQRGroup.FooterBand в FooterBand1.
- Бросьте компонент TQRLabel на footer band. Установите свойство Caption в ‘FOOTER’.
Если все сделано правильно, то вы должны увидеть следующее, как на Figure 11:
Figure 11 - Creating a group
![](images/342585-nomer-m19f87fb4.png)
Просмотрите отчет, или путем запуска программы, или просто выбрав правой кнопкой пункт Preview:
Figure 12 - Preview of a grouped report
![](images/342585-nomer-m71df53f1.png)
Как планировалось, отчет показывает список всех компаний в алфавитном порядке, каждая группа имеет заголовок в виде буквы.
Мастер/детайл отчеты
Часто требуется отчет типа master/detail – это когда вы извлекаете данные из двух наборов данных, объединенных связью master/detail. QuickReport позволяет вам включать одну или несколько таких связей в отчет, с помощью компоненты TQRSubDetail.
В приведенном примере a master/detail отчета выводится список всех заказов по каждому заказчику в базе данных. Здесь краткий пример:
Создайте группированный отчет, как описано в предыдущей главе.
- Бросьте компонент TDataSource на форму, и назначьте его свойство DataSet равным ‘Table1’.
- Бросьте новый компонент TTable на форму. Установите его свойство DatabaseName в ‘DBDemos’, TableName в ‘ORDERS.DB’, IndexName в ‘CustNo’, MasterSource в ‘DataSource1’, MasterFields в ‘CustNo’ и Active в True. Два компонента TTable сейчас имеют связь master/detail.
- Бросьте компонент TQRSubDetail на существующий TQuickRep, где это появится как новая секция. Заметим, что свойство Master установилось в QuickRep1. Связь master/detail между двумя TTable объектами отразилось между объектами отчета и секциями.
- Установите свойство DataSet компоненты TQRSubDetail в ‘Table2’. Компонент TQRSubDetail будет выводить все записи через его DataSet для каждого изменения Dataset мастера.
- Бросьте три компонента TQRDBText на секцию sub detail. Установите свойство DataSet в ‘Table2’, и установите свойство DataField в ‘OrderNo’, ‘SaleDate’ и ‘ItemsTotal’.
Если вы все выполнили корректно, то вы должны увидеть нечто подобное Figure 13.
Figure 13 - Creating a report with sub detail
![](images/342585-nomer-m4f7564b2.png)
Теперь посмотрим отчет. Результат должен выглядеть подобно Figure 14, список заказов ниже имени каждого заказчика. Заметим, что формат дат и денежных полей зависит от установок в Windows.
Figure 14 - Preview of a master/detail report
![](images/342585-nomer-m6bc089cf.png)
Обзор печатных (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
![](images/342585-nomer-m2715d4ad.png)
Построитель выражений позволяет вам разрабатывать ваше выражение путем выбора функций и имен полей из списка, что упрощает процесс и позволяет избежать типографических ошибок в идентификаторах полей. Также можно вызвать специальный диалог для выбора аргументов функций.
Figure 16 - Setting function arguments in the expression builder
![](images/342585-nomer-429f1f3c.png)
Создание собственного просмотра
Как мы отмечали ранее, в главе ‘Просмотр и композитные отчеты’, что имеется возможность создать свой собственный механизм просмотра. Теперь самое время показать, как это сделать.
Первым шагом создание собственного просмотра - это наследование от 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
![](images/342585-nomer-m32c018b1.png)
Когда вы будете создавать реальный просмотровщик для ваших приложений, то вы добавите кнопки для вызова метода 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 програмисты еще плохо знакомы с его ситаксисом. Тем не менее концепции подобны.