Важной составной частью
приложения является вывод данных на печать - получение отчета. В пакет
Delphi входит средство для генерации и печати отчетов - ReportSmith. Вы
можете объединить отчет с приложениями Delphi. Также, библиотека визуальных
компонент Delphi включает специальный компонент TReport. В данном уроке
показано, как использовать компоненту TRepor и рассмотрены основные принципы
проектирования отчетов в ReportSmith.
Отчеты могут быть созданы для SQL БД или локальных БД и не требуют знания сложных команд БД. Интерфейс ReportSmith использует стандартные инструменты Windows 3.1 типа tool bar, formatting ribbon, и “drag and drop”. Если пользователь уже знаком с интерфейсом стандартных Windows-программ, типа Word for Windows или Quattro Pro for Windows, ему будет “знаком” и интерфейс ReportSmith. ReportSmith предлагает 4 типа отчетов: Табличный, Кросс-таблица(CrossTab), Форма(Form) и Наклейка(Label).
ReportSmith использует концепцию “живых данных”, т.е. работа происходит с настоящими данными все время, а не только тогда, когда запускается просмотр (preview). Кроме этого, ReportSmith легко работает с чрезвычайно большими БД при помощи адаптивной технологии управления памятью. В ReportSmith можно управлять тем, где сохраняется результат выборки данных из БД: в локальный памяти клиентской PC, на жестком диске клиентской PC, или на сервере.
ReportSmith включает поддержку:
Библиотека визуальных
компонент Delphi включает объект TReport. TReport обеспечивает вызов из
программы Delphi программы ReportSmith runtime и печати отчета. TReport
расположен на странице Data Access Палитры Компонент.
Добавить отчет в приложение
Delphi очень легко. Положите компонент TReport на форму. Инспектор Объектов
Delphi показывает, что компонент TReport имеет несколько свойств и ни одного
события.
Рис.1: Инспектор объектов для свойств TReport
У TReport есть следующие свойства:
AutoUnload определяет, выгружается ли ReportSmith Runtime из памяти после завершения печати отчета. Если AutoUnload True, то ReportSmith Runtime выгружается, как только закончена пересылка отчета на печать. Если AutoUnload False, то ReportSmith Runtime остается в памяти. Например, можно создать приложение, которое включает пункт меню, запускающий отчет. После того, как отчет выполнился, можно пожелать, чтобы ReportSmith Runtime остался в памяти, и повторно отчет напечатается быстрее. Чтобы выгрузить ReportSmith Runtime из памяти при AutoUnload=False, нужно вызывать метод CloseApplication.
EndPage указывает последнюю страницу отчета, которая будет напечатана. По-умолчанию это 9999 (чтобы напечатать весь отчет).
InitialValues - строка переменных отчета, которые используются отчетом при запуске (если таковые имеются). Например, в отчет можно передавать из программы начальную и конечную даты для выборки данных. Указывая значения этих переменных, не требуется использовать диалоги для ввода во время выполнения отчета.
MaxRecords - количество записей БД, которые вы хотите использовать для создания отчета. Например, если вы хотите только просмотреть примерный отчет, а ваша БД содержит 50,000 записей, вы можете определить в MaxRecords величину, которая ограничивает число записей в отчете значительно меньшей величиной, например 100. Это тот же самое, что и использование ReportSmith в draft режиме.
PrintCopies определяет, сколько копий отчета будут напечатаны.
ReportDir - каталог, где хранятся файлы отчетов. Определяя каталог отчета, не нужно включать туда имя файла отчета.
ReportName содержит имя отчета, который нужно выполнить. Здесь можно указать полное имя отчета (каталог + имя файла), если вы не определили каталог в свойстве ReportDir или хотите выполнить отчет, которое сохранен в другом месте. Если св-во ReportDir определено, то имя каталога опускается и просто указывается имя отчета.
StartPage - номер страницы, с которой вы хотите начать печатать отчет. По-умолчанию равен 1.
Методы TReport включают:
CloseReport прекращает печать отчета.
CloseApplication прекращает выполнение ReportSmith Runtime, если он запущен.
Connect служит для установления соединения с SQL БД.
Print - функция, проверяет, идет ли печать в данный момент.
RecalcReport пересчитывает и перепечатывает отчет с новым значением для переменной отчета, предварительно измененной методом SetVariable.
Run запускает ReportSmith Runtime, выполняет отчет указанный в свойстве ReportName, и посылает отчет на принтер.
RunMacro - вызывает выполнение в ReportSmith макроса (программы, написанной на ReportSmith Baisc).
SetVariable изменяет значение переменной отчета. Параметр Name определяет, какая переменная изменяется, и параметр Value определяет новое значение. После вызова метода SetVariable, ваше приложение может вызывать метод RecalcReport, который пересчитывает и перепечатывает отчет с новым значением переменой.
Следующий код показывает, как передать переменную в отчет. В
примере строковой переменной отчета 'City' присваивается значение 'Bombey'.
Подразумевается, что есть готовый отчет с данной переменной.
Поместите компонент TReport на форму и установите требуемые свойства для вызова печати отчета. Напишите обработчик OnClick для кнопки Button1 на форме (кнопка - для простоты) :
procedure TForm1.Button1Click(Sender: TObject);
begin
Report1.InitialValues.Clear;
Report1.InitialValues.Add('@City=<Bombey>');
Report1.Run;
end;
Завершенное приложение Delphi + ReportSmith есть в примерах к
данному уроку. Приложение позволяет выбрать имя отчета в диалоге открытия
файлов и выполнить этот отчет. Код для кнопки PrintReport (Печатать отчета)
показан ниже.
procedure TForm1.PrintReportClick(Sender: TObject);
begin
if OpenDialog1.Execute then begin
Report1.ReportName := OpenDialog1.Filename;
Report1.Run
end
end;
Запустите ReportSmith. Он попросит вас открыть отчет (если отчет
уже существует, то можно выбрать имя отчета). Чтобы построить новый отчет,
нажмите кнопку Cancel и затем в меню ReportSmith выберите пункт File|New.
ReportSmith попросит выбрать тип отчета, который вы хотите построить (см.
рис.2). В нашем примере мы будем строить табличный отчет (Columnar report).
Рис.2: Диалог выбора типа отчета
Если данных в таблицах много, то лучше выбрать режим Draft прежде, чем нажать OK. В этом случае ReportSmith спросит, сколько записей вы хотите использовать при построении отчета. Когда отчет запускается на выполнение, то будут использоваться все записи или то число, которое вы определяете в свойстве MaxRecords.
После выбора типа отчета укажите ReportSmith таблицу(ы),
по которым вы хотите сделать отчет (см. рис.3).
Рис. 3: Диалог добавления таблиц в отчет.
Для добавления таблицы в отчет нажмите кнопку "Add table...",
выберите тип таблицы Paradox (IDAPI) (см. рис.4), и выберите таблицу CUSTOMER.DB
из каталога \DEMOS. Точно также добавьте таблицу ORDERS.DB. Следующим шагом
нужно установить условия, по которым будет выполняться соединение таблиц
при выполнении отчета. В данном случае они связаны по полю CustNo - код
заказчика. Установки связи между таблицами происходит в соответствующем
диалоге при нажатии кнопки “Add new link…” (см. рис.5). Предварительный
этап закончен и можно нажать кнопку “Done”.
Рис. 4: Диалог добавления таблицы в отчет
Рис. 5: Определение связи между таблицами
ReportSmith считает данные
из таблиц и создаст начальный табличный отчет. В нашем отчете слишком большое
количество столбцов и он не умещается по ширине на стандартной странице.
Можно убрать ненужные колонки, выбирая столбец и нажимая клавишу Del. Удалите
все столбцы кроме OrderNo, SaleDate, ShipDate, paymentMethod, AmountPaid.
ReportSmith позволяет изменить ширину колонки с помощью мыши. Теперь отчет
выглядит примерно так, как на рис.6.
Рис. 6: Отчет с выбранными полями
Однако, пока это не то, что нам нужно - в отчете нет информации о заказчике, для которого данный заказ предназначен. Прежде, чем добавить эту информацию нужно сгруппировать записи в отчете по принадлежности заказчику. Это делается в пункте меню Tools|Report Grouping… (см. рис.7). Просто выберите поле группировки (в нашем случае нужно сгруппировать записи по коду заказчика - поле CustNo) и нажмите кнопку “OK”. Следующим шагом добавим Header и Footer (т.е. поле перед группой и после нее) для каждой группы. Это выполняется в пункте меню Insert|Headers/Footers (см. рис.8).
Рис. 7: Диалог группировки записей в отчете
Рис. 8: Добавление Header/Footer для группы
В дальнейшем, в Header для группы мы поместим информацию о заказчике, а в Footer - итоговую сумму всех заказов (т.е. сумму по полю AmountPaid для данной группы). А теперь наш отчет имеет вид, представленный на рис.9. (Для того, чтобы показывались названия полей в каждой группе нужно вызвать пункт меню Insert|Field Labels…)
Рис. 9: Отчет с группами записей и полями перед и после них
Для того чтобы добавить данные в Header нужно выбрать пункт меню Insert|Field. Появится соответствующий диалог (см. рис.10). В этом диалоге требуется указать поле, которое вы хотите вставить в отчет, нажать кнопку “Insert” и щелкнуть мышью в то место на отчете, куда его нужно поместить. В нашем отчете это будет поле Company и размещаться оно будет в заголовке группы (Header). Кроме того, если нужно, чтобы названия компаний в отчете шли в алфавитном порядке, то это можно указать в пункте меню Tools|Sorting… В диалоге укажите поля для сортировки - Company и OrderNo (номера заказов внутри каждой группы должны быть также упорядочены). После этого нажмите “Done”.
Рис. 10: Диалог добавления поля в отчет
Теперь добавим суммирующее поле в Footer для группы. Для этого выберите пункт меню Tools|Summary Fields… В диалоге нужно выбрать группу CustNo_Group, поле AmountPaid, операцию Sum и нажать “Add To Group”(см. рис.11). Далее, по аналогии с полем Company, добавьте суммирующее поле в Footer группы (в диалоге вставки поля пункта меню, рис.10, в верхнем ComboBox’е нужно выбрать Summary Fields).
Отчет готов, его вид показан на рис.12.
Рис. 11: Диалог определения полей суммирования
Рис. 12: Готовый отчет.