Fast Report
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Fast Report. Спадкування на практиці
У статті Спадкування у Fast Report я показала роботу механізму успадкування під час створення звітів у дизайнері Fast Report. Але створення звіту передбачає також написання супутнього коду серед Delphi. У цій статті я покажу, як успадкування у Delphi може полегшити життя розробникам звітів.
Почну зі списку дій, які мають бути виконані у програмі, щоб користувач побачив на екрані наш FastReport звіт.
- Завантажити звіт *.fr3 з каталогу на диску компонент TfrxReport;
- Запросити користувача параметри для формування звіту;
- Підготувати та відкрити всі запити, дані з яких відображатимуться у звіті;
- Визначити значення змінних звітів;
- Підключити функції користувача;
- Підключіть експортні фільтри.
Не всі з перерахованих дій є обов'язковими, тому під час створення вашого звіту просто пропустіть непотрібні. Тепер зупинимося докладніше на описі всіх перерахованих вище дій.


Кожен клас-нащадок цього класу-предка виконуватиме підготовку одного звіту. На вільному місці форми класу-нащадка будуть розташовані компоненти замовлення параметрів. Зупинимося на основних елементах предка:
По-перше, на предку потрібен компонент traMainAsk: TIBTransaction, оскільки кожен звіт формується у своїй транзакції. Очевидно, для звіту достатньо рівня ізоляції транзакції "тільки для читання". З'єднання з базою встановлено у головній формі проекту та вказівник на нього будепередаватися у форму замовлення через public властивість MainDatabase типу TIBDatabase.
По-друге, потрібний компонент frxMainReport: TfrxReport. Оскільки всі форми звіту передбачається зберігати у каталозі диску, то встановлюємо властивість StoreInDFM:= False. Створимо обробник OnLoadTemplate і в ньому вкажемо шлях на каталог, де зберігається базовий звіт.
По-третє, потрібні компоненти для отримання даних (idsFRReport: типу TIBDataSet) і передачі до звіту (frxMainDBDataset типу TfrxDBDataset). Зв'яжемо ці компоненти один з одним, а компонент idsFRReport з транзакцією traMainAsk і з властивістю MainDatabase.
Створюємо рядкові поля класу Ftitle> - для найменування звіту, FRestriction - опис вибраних обмежень і FRepTemplateName - найменування шаблона.
Створення форм замовлення на основі цього класу-предка розглянемо на прикладі раніше створених звітів "Платежі за видами оплат за період" та "Сума оплат за днями за період" (див. статтю Спадкування у Fast Report). Створимо два класи нащадка, успадкованих на предку класі і розмістимо на них компоненти для завдання обмежень.
Вид форми замовлення звіту "Платежі за видами сплат за період":

Форма замовлення звіту "Сума оплат по днях за період":

У кожному нащадку створимо два оброблювача: метод OnCreate – для визначення полів класу Ftitle> і FRepTemplateName і перевизначимо метод UniFRepPrepare, оголошений у класі-предку - для формування запиту з урахуванням вибраних обмежень. Приклад цих обробників дивіться у архіві example.zip.
Зроблено цілком достатньо, щоб отримати на екрані звіт. Решту дій з формування виконає наш клас-предок.
Оскільки звіти створюються для програмного комплексу бухобліку, точасто виникає потреба друкувати на звіті суму прописом. Реалізувати таку можливість зручно за допомогою функцій Fast Report, що підключаються. Наприклад, можна зробити так: у базовому звіті розмістимо у підвалі групи мітку "Сума прописом":

Мітці "Сума прописом" в обробнику OnBeforePrint напишемо код, який буде викликати функцію користувача з Delphi:
Memo2.Text := 'Сума прописом: ' + MoneyToStringFR(Trim(Memo2.Text));
function TfmAnUniAsk.MoneyToStringFR(ASumma: String): String; var VSumma: Double; begin якщо TryStrToFloat(ASumma,VSumma) then Result:= MoneyToString(VSumma) else Result:= '-'; end;
frxMainReport.AddFunction('function MoneyToStringFR(ASumma: String): String');
function TfmAnUniAsk.frxMainReportUserFunction(const AMethodName: string; var Params: Variant): Variant; begin if AMethodName = 'MONEYTOSTRINGFR' then Result:= MoneyToStringFR(Params[0]); end;
якщо UniFRepPrepare then begin frxMainReport.PrepareReport(true); frxMainReport.Export(dmFastRepExport.frxXLSExport); end;
Очевидно, що у такий спосіб можна підключити будь-який з наявних у FastReport експортних фільтрів. Або відразу всі фільтри - це залежить від технічного завдання та фантазії розробника. Для друку безпосередньо на принтер обробник події буде виглядати також тільки замість функції Export використовуйте функцію Print.
У документації ProgrammerManual, гл.1.7 рекомендується встановлювати експортні фільтри на форму підготовки звіту. У нашому випадку ці фільтри слід поставити на клас-предок форм замовлення звіту. Але в цьому випадку при створенні кожної форми замовлення створювався і свій набір експортних фільтрів. Якщо після закриття звітуклас знищити, то проблеми немає, але якщо необхідно зберегти цей клас у пам'яті, то при створенні наступної форми замовлення кількість експортних фільтрів у пам'яті збільшиться вдвічі. Тоді меню для експорту звіту має такий вигляд:

procedure TdmFastRepExport.WriteFRPath(ANameFile: String); var i: Integer; VfrxExportClass: TfrxCustomExportFilter; begin if ComponentCount > 0 then begin для i:= 0 до ComponentCount - 1 do begin if Components[i] is TfrxCustomExportFilter then begin VfrxExport > VfrxExport > end; end; end; end;
У класі-предку залишається лише викликати функцію WriteFRPath, яка виконає налаштування кожного фільтра: