Fastreport як засіб корпоративної звітності - стаття блог михаила флёнова

Реалізувати базу даних і програму для роботи з нею - це тільки половина справи. Дуже рідко, коли дані повинні просто десь зберігатися. У більшості випадків необхідно засіб, за допомогою якого користувачі зможуть переглядати або навіть самостійно створювати будь-які звіти, і виводити їх на друк.

Для нашої країни ідеальним варіантом, на наш погляд, є Fast Report російської розробки. Коли бачиш, такі розробки, як FastReport, то розумієш, що наша країна реально піднімається вгору в області ІТ і може піднятися ще вище, залишивши позаду не тільки Індію. Найбільше я радий за те, що батьківщина цього пакета моє улюблене місто Ростов-на-Дону в якому я народився і виріс.

Чому ми вибрали саме FastReport? Так, вона досить потужна, зручна, проста і за своїми можливостями може конкурувати з розробками більш іменитих компаній. І все ж, у FastReport є одне дуже серйозну перевагу на нашому ринку - хороший російську мову в інтерфейсі і простота для кінцевого користувача. Російськомовна підтримка також є великим плюсом. Створити звітність - це пів біди, але з нею будете працювати не ви, а кінцевий користувач, який в англійській мові може бути не сильний. У таких випадках російський інтерфейс є великим плюсом.

Движок FastReport підтримує безліч мов. У мене не найостанніша версія, але вона вже включає в себе ресурси для 24-х мов. Так що, якщо ви розробляєте програми для інших країн, то проблем з локалізацією не буде.

Ще одним великим плюсом є хороша документація, яка доступна в двох версіях - для розробників і для програмістів. У ній є практично все, для хорошого старту і найпростіші звіти ви зможете почати створювати вже через п'ять хвилин знайомства з системою. Повний пакет документації займає 6 мегабайт і поставляється в трьох популярних форматах - chm, pdf і hlp. Залишається тільки вибрати той, який для вас зручніше і можна приступати до вивчення. Формати chm і hlp зручні для отримання швидкої допомоги, а pdf зручний для роздрукування.

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

Створення звіту в FastReport

1. Це неефективне витрачання пам'яті, тому що створюється кілька примірників компонентів звітності. Якщо ви не перенесли весь код FastReport в динамічні бібліотеки (а це зайві витрати часу), то пам'ять буде витікати досить швидко.

2. Коли форми звітності розкидані по різних модулів проекту, з ними складніше працювати, особливо, якщо ви працюєте в команді і використовуєте систему спільної розробки коду, наприклад, Visual SourceSafe.

Я б рекомендував створити окремий модуль даних (DataModule) і помістити в ньому тільки один екземпляр компонента TfrxReport. Тепер, створюючи звіти зберігайте їх у файли. FastReport дозволяє зберігати звіти тільки в своєму власному форматі, в файлах з розширенням fr3, але цього цілком достатньо. У файл поміщається вся необхідна інформація, тому, після його завантаження все буде працездатним.

Тепер для кожного звіту необхідно створити окрему процедуру, яка буде мати приблизно такий вигляд:

Після цього, з будь-якої форми досить викликати цей метод, який ви повинні були заздалегідь створити в модулі даних з компонентами звіту. Таким чином, ви заощадите не тільки пам'ять, а й свій час і нерви, якщо один і той же звіт, повинен викликатися з різних місць програми (з різних форм).

Хто повинен створювати звіти

Те, що звітність зберігатися в одному місці, дає ще одну перевагу - поділ праці. Сучасні засоби побудови звітів досить складні і мають багатими можливостями, в тому числі і вбудованими мовами програмування. Пакет FastReport не виняток, і для досконального його можливостей вивчення може знадобитися чимало часу. Я працюю з FastReport досить довго, але не можу сказати, що знаю його на відмінно.

Коли над проектом працює ціла команда розробників, то вам і не потрібно, щоб все програмісти вміли створювати звіти. Досить, щоб одна людина відповідав за ваш модуль друку і створював все звіти. Коли людина спеціально навчений і постійно працює з однією і тією ж програмою, він виконає роботу швидше і краще того, хто працює зі звітністю час від часу.

зміна принтера

Іноді буває необхідність виводити документи одночасно на кілька принтерів. Наприклад, необхідно під час друку рахунки або накладної в офісі, одночасно вивести на друк накладну на складі, щоб комірник почав підготовку товару. Щоб користувачеві не доводилося вибирати спочатку свій принтер, а потім мережевий принтер на складі, можна реалізувати зміну програмно.

У FastReport друк відбувається на принтер за замовчуванням, якщо ви не вказали іншого. Програмна зміна принтера виконана не зовсім елегантно і щоб розібратися з цим питанням, мені довелося заглядати в вихідні коди. Виявляється, ім'я принтера можна задавати двома способами:

Але цього виявляється недостатньо. Після установки імені необхідно викликати ще й метод SelectPrinter. Раз вже я змінюю ім'я, то SelectPrinter повинен викликатися автоматично. Якщо дійсно буває необхідність вказати ім'я принтера, але не встановлювати його (правда я не можу собі такого уявити), то можна додати ще один метод SelectPrinter, який в якості параметра буде отримувати ім'я принтера, і відразу буде зберігати його в PrintOptions і встановлювати.

Fastreport як засіб корпоративної звітності - стаття блог михаила флёнова

Це не докір, а побажання розробникам. Сподіваюся, що вони прочитають цю статтю і поліпшать зміну принтерів.

Якщо заглянути в вихідний код процедури SelectPrinter, то можна помітити, що вона перебирає всі встановлені принтери, і якщо знаходить в списку потрібний, то робить його поточним. Тут є два недоліки:

1. Якщо принтер не встановлено на комп'ютері, то він не буде обраний;

2. SelectPrinter - це процедура і не повертає результату, а значить, ми не дізнаємося, чи був обраний запитуваний принтер в якості поточного чи ні.

Щоб обійти цей недолік, я б рекомендував би виконати наступні дії: перед установкою імені принтера викликати метод Clear (frxRepInv.PrintOptions.Clear). Цей метод скидає настройки друку і робить все за замовчуванням. Після установки принтера слід перевірити ім'я обраного для звітів принтера, а індекс поточного можна дізнатися так: frxPrinters.PrinterIndex.

Друк змісту

Нещодавно, на моїй основній роботі, мені довелося робити можливість друку прайс листа. Це не така вже й складне завдання, але проблема була в створенні змісту. Ця тема чомусь погано описана в документації, тому я вирішив показати, як я вирішив цю проблему, тим більше, що ви теж можете з нею зіткнутися.

Fastreport як засіб корпоративної звітності - стаття блог михаила флёнова

Отже, перша сторінка буде найпростішої і складається вона всього з трьох колонок - артикул, назву групи і сторінка. На другій сторінці звіту можна додати якусь шапку, в якій повинні бути логотип компанії і контакти, а також, тут необхідно створити таблицю, в яку і буде виводитися сам товар.

Fastreport як засіб корпоративної звітності - стаття блог михаила флёнова

Тепер переходимо на закладку з формою змісту. У моєму випадку, тут три колонки - артикул, назву групи, а сторінка. Ім'я групи буде братися автоматично для даного набору даних, а ось сторінку визначити досить просто. Виділяємо Memo компонент, в який повинен потрапляти номер сторінки (у мене це Memo26), і створюємо для нього обробник події OnBeforePrint. Тут пишемо наступний код:

Щоб визначити номер сторінки, викликається метод GetAnchorPage, якому потрібно передати ім'я якоря. У нас імена якорів збігаються з іменами груп товару, тому в якості параметра передаємо frxGroup. "NAME", де у мене перебувати ім'я групи.

Але це ще не все. Коли движок FastRoport формує звіт, то він один раз пробігає по всіх даних і встановлює якоря. При цьому, під час формування змісту, якорів ще не буде, тому номерів сторінок в звіті ви не побачите. Щоб все відобразилося коректно, необхідно включити подвійний прохід. Під час другого проходу все якоря вже будуть розставлені і в змісті з'являться номери сторінок. Отже, вибираємо меню Report \ Options і встановлюємо галочку в Double Pass.

Fastreport як засіб корпоративної звітності - стаття блог михаила флёнова

оптимізація

Оптимізувати щось в самому FastReport досить складно. Швидкість його роботи залежить в основному від швидкості отримання даних. Якщо ваш набір даних повертає необхідні дані швидко, то і звіт з'явитися миттєво. Ну а якщо SQL запит, який повертає дані - не оптимiзований, то звіт може формуватися дуже і дуже довго. Тому, перш за все варто почати з оптимізації SQL запитів. А ось оптимізація запитів залежить від ж від бази даних, яку ви використовуєте.

Іноді звіту необхідно передати один або два параметри, які виходять за межі основного вихідного набору даних. Припустимо, що ви створюєте звіт по заробітній платі, і в нього повинні входити співробітники певного підрозділ. Основний набір даних - це список співробітників, але буде зручно, якщо в шапці звіту буде відображатися назва підрозділу. Через одного назви створювати набір даних (DataSet) неефективно. У FastReport є дуже зручний механізм - змінні. Використовуйте краще за нього. Ця тема дуже добре описана в довідковій системі.

На швидкість відображення звіту впливають і скрипти, які ви пишете в звіті. Не варто перевантажувати звітність зайвим кодом, адже його розбір йде під час виконання програми. Краще всі необхідні розрахунки виконувати в Delphi і передавати готові дані через змінні або набори даних.

Сподіваюся, що поради, описані в даній статті, допоможуть вам у вашій роботі, і завдяки цим рекомендаціям, ваша робота стане продуктивніше і зручніше. Пишіть нам, якщо у вас виникли питання або побажання з приводу цієї статті. Якщо Ви хочете звернутись особисто зі мною, то краще це робити через особисті повідомлення на сайті, я їх перевіряю регулярно.

Увага. Якщо ти копіюєш цю статтю собі на сайт, то залишай посилання безпосередньо на цю сторінку. Дякую за розуміння