вторник, 5 февраля 2013 г.

Гибкий генератор отчетов

Постоянно требуется реализовать какой либо новый отчет для одной моей программы (после модернизации я о ней расскажу). Столкнулся с тем что очень неудобно каждый раз переделывать сам отчет, внешний вид, все это стыковать и кое как выбрасывать через стандартные средства среды Delphi пользователю.

Решил сделать универсальное средство, которое позволило бы не переделывать каждый раз программу.

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

Куда выводить?
Вывод информации полученной SQL запросом должен быть грамотным  и позволять вносить изменения не переделывая саму программу. Долго колебался между Rave, FastReport Free но решение пришло само собой. Видя что пользователи постоянно работают в Microsoft Excel решил не обучать их премудростям новых сред а использовать саму среду Excel тем более что она доступна как OLE с плюсом VBA.

А как же настраивать?
Готовые отчеты хотелось бы конфигурировать, но использовать дополнительные модули? Зачем? Ничего шифровать и bin-арить не будем используем обычный ini файл, так что кроме блокнота ничего и не понадобится.

Как же все связать и заставить работать?
Как всегда( а было уже много раз) на помощь приходит среда быстрой разработки Delphi.
Исходя из всего выше сказанного принимаем решение использовать в отчете 3 файла:
<имя>.xls   - шаблон формы
<имя>.ini   - параметры для тонкой настройки
<имя>.sql  - запрос который вернет данные
Сел с нуля писать связку Приложение+OLE VBA MS Excel, однако goooogle-в интернете наткнулся на очень интересный компонент a7rexcel который оказался бесплатным, о нем можно почитать тут http://a7in.com/delphi/   (Спасибо Вам ребята за идею) используя его как скелет для связывания с Excel очень быстро реализовал переброс данных.

Программа из которой берется информация хранит данные в Paradox таблицах, по этой причине использую BDE для доступа к данным, ODBC ни в какую не захотел отображать кириллицу  а время поджимало.

Однако хочется что бы генератор отчетов мог задавать диапазоны дат, выбирать данные из списка, по этому принимаю решение дополнить SQL язык своими тегами:


В запросе можно использовать функции которые вызывают диалоговые окна перед выполнением запроса
все переменные запроса строятся по формату
#[FUNCTION][MESSAGE]#
пример
select * from test where date='#[GETDATE][Введите текущую дату]#'

Список функций и параметров
#[GETDATE][message]#  - запрос на ввод даты
#[GETTABLE][Table:Field View:Field Result:Сообщение]# - Показывает содержимое справочника с указанием какое поле показать и какое поле вернуть как результат, возвращает одно значение

что значительно расширило возможности программы.

Так же дополнил Excel шаблоны функциями в самом Excel-е
достаточно в ячейке указать константу и она будет заменена

#FCURRENTDATE#  - вставляет текущую дату
#FCOUNTER# - вставляет номер записи, счетчик, номер по порядку
#FCOUNT# - выводит количество записей

Отчет в строится из 3х блоков Шапка, Набор данных и Пол.

Title - Заголовок
Line - выводимый набор данных, в нем в качестве параметров происходит поиск полей таблицы
Foot - Подвал отчета


статья получается большая, продолжение следует.