Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Создание динамических отчетов
Из вышесказанного следует, что колонки в отчетах могут меняться в зависимости от запроса. Использованный нами прием ручного добавления компонентов заголовков и значений записей по полям имеет тот недостаток, что при всяком новом запросе придется добавлять или удалять старые компоненты и менять привязку к новым полям вручную. Это существенно осложняет процесс создания отчетов. Проблема могла бы быть решена если эти компоненты в зависимости от полученных запросом полей создавались бы не вручную, а автоматически. Сейчас мы решим эту проблему. Добавьте к проекту новую форму (рис. 5). Дайте ей имя fQueryRep. Ее модуль сохраните под именем QueryRep. pas. Рис. 5. Форма динамического отчета Перейдите на главную форму, добавьте на нее новую кнопку (рис. 6). Рис. 6. Новая кнопка на главной форме Командой File / Use unit добавьте в список видимых модулей главной формы модуль QueryRep. Создайте для кнопки с надписью " Создать динамический отчет с использование компонента Query " событие для щелчка на ней с программным кодом модального вызова формы данного отчета: procedure TForm1.bQueryRepClick(Sender: TObject); Перейдите на новую форму (рис. 5.) Слева вверху положите на новую форму компонент Memo (закладка Standard ) и дайте ему имя MemoSQL. В качестве примера запроса внесите внесите в поле MemoSQL следующий текст его текст: select Id, Category, LenSm from biolifes В данном примере производится отбор полей Id, Category, LenSm из таблицы biolifes. Из всех записей таблицы отбираются только те, для которых длина рыб находится в интервале (180, 500) см. Сортировка записей производится по полю category в алфавитном порядке. Положите на форму компонент источника данных DataSource (закладка Data Access ) и компонент запроса Query (закладка BDE ). На рис. 7.5 они лежат на MemoSQL. Дайте компоненту Query имя QuRep. Привяжите его к БД DbFishReport (свойство Database ). DataSource по его свойству DataSet привяжите к QuRep. Справа положите пять кнопок и два компонента Label (закладка Standard ) с пояснющими надписями к этим кнопкам. Ниже разместите сетку DBGrid (закладка Data Controls ) и растяните ее по всей ширину формы. Сетку DbGrid привяжите к DataSource. Скопируйте с формы ранее разработанного отчета компонент QR и положите его копию на форму ниже сетки DbGrid. Удалите с нее компоненты заголовков колонок и данных по колонкам. Оставьте лишь заголовок отчета и компоненты номеров страниц и времени создания отчета. В окончательном виде форма должна выглядеть так, как показано на рис. 7.5. Новшеством в нашем отчете является компонент запроса QuRep. Он имеет привязку к определенной БД (свойство Database ). Главным же для него свойством является SQL, которое представляет собой компонент многострочного текста запроса, записанного на языке SQL. Это свойство точно совпадает с компонентом типа Memo, то есть является простейшим текстовым редактором, напоминающем редактор Notepad (Блокнот). Компонент QuRep имеет 2 важных метода - Prepare (подготовка к выполнению запроса) и ExecSQL (выполнение запроса). Текст запроса мы будем вводить в MemoSQL, передавать его в SQL компонента Query и уже там выполнять сам запрос. Этот процесс оформим в виде отдельной процедуры: procedure DoRepSQL; Дважды щелкните на кнопке с надписью Выполнить запрос и создайте для щелчка на ней событие procedure TfQueryRep.bDoQueryClick(Sender: TObject); Как видно из теста обработчика, щелчок на этой кнопке приведет к выполнению запроса по вышеприведенной процедуре. Если текст запроса не содержит ошибок, то после выполнения запроса и открытия QuRep в сетке можно видеть результат отбора данных: Рис. 7. Форма динамического отчета Как видно из рис. 7, результаты отбора точно соответствуют тексту вышеприведенного примера запроса: в таблице присутствуют требуемые поля, записи отсортированы по полюCategory, а среди записей присутствуют лишь те, для которых длина рыб находится в заданных пределах. Теперь нам известны поля и порядок их следования в таблице, а значит и в отчете и можно приступить к автоматизации создания заголовков колонок отчета и значений отобранных записей по этим колонкам. На составную часть заголовков таблицы, которой дадим имя HeaderBand, надо автоматически (без участия человека) положить 3 компонента TQRLabel и изменить их свойство Caption на имена отобранных запросом полей. Аналогично на составную часть данных отчета, которой дадим имя DetailBand, надо положить 3 компонента TQRDBText, привязать их свойство DataSet к QuRep, а свойство DataField к именам тех полей, которые поименованы в запросе и присутствуют в таблице, показанной на рис. 7. Поскольку наперед не известно количество полей, которые будут присутствовать в таблице результатов запроса, то объявим два динамических массива, каждый элемент которых будет соответствовать заголовку поля таблицы и данным по такому полю: L: array of TQRLabel; // массив надписей на колонках полей Эти операторы разместите в тексте модуля так, как показано на рис. 8. Рис. 7.8. Динамические массивы отчета и их место в модуле программного кода Теперь составим процедуру создания этих массивов. Ее текст с комментариями приведен ниже. procedure CreateReportComponents; T[i]: = TQRDBText.Create(DetailBand); // создаем элемент данных конкретного поля с номером i Двойным щелчком на кнопке с надписью " Создать компоненты " создайте событие для щелчка на ней и введите в него обращение к процедуре создания названных компонентов: procedure TfQueryRep.bCreateDynamicComponentsClick(Sender: TObject); Если после созданного запроса щелкнуть на этой кнопке, то на составные части заголовков полей данных по этим полям лягут нужные нам компоненты рис. 9): Рис. 9. Динамически созданные компоненты заголовком колонок и данных по этим колонкам Теперь можно создавать отчет. Создайте событие для щелчка на кнопке с надписью " Создать отчет ": procedure TfQueryRep.bDoReportClick(Sender: TObject); После того, как компоненты созданы щелчок на этой кнопке даст отчет следующего вида (рис 10): Рис. 10. Отчет с динамически созданным компонентами После созданного отчета динамические массивы можно удалить из оперативной памяти. Это можно сделать при выполнении следующей процедуры: procedure DestroyReportComponents; Двойным щелчком на кнопке с надписью " Уничтожить компоненты " создайте событие для щелчка на ней и введите в него обращение к процедуре уничтожения упомянутых компонентов: procedure TfQueryRep.bDestroyDynamicComponentsClick(Sender: TObject); Если в запущенной программе после создания компонентов (рис. 7.9 они присутствуют) щелкнуть на такой кнопке, то компоненты исчезнут со своих составных частей (рис. 11): Рис. 11. Панель отчета после уничтожения динамически созданных компонентов Таким образом, создание отчета сопровождается следующими операциями: 1) подготовка запроса в редакторе MemoSQKи его выполнение; 2)создание динамических компонентов для колонок отчета: 3) создание отчета; 4) уничтожение компонентов в памяти компьютера. Этот процесс можно сократить до двух операций: 1) подготовка запроса; 2) выполнение запроса, уничтожение динамических компонентов, если они не уничтожены, создание динамических компонентов, создание отчета, уничтожение динамических компонентов. Создайте событие для щелчка на кнопке с надписью " Динамический отчет " со следующим кодом: procedure TfQueryRep.bDoDiynamicReportClick(Sender: TObject); Щелчок на такой кнопке сразу выполнит запрос, создаст компоненты отчета, создаст отчет и уничтожит созданные компоненты. Если теперь создать текст нового запроса, где колонок больше: select Id, Category, CommonName, SpeciesName, LenSm то после щелчка на кнопке " Динамический отчет " получим такой результат, представленный на рис. 12. Рис. 12. Динамически созданный отчет с пятью колонками Как видим, на не пришлось заботиться о том, чтобы создавать компоненты вручную. За нас это сделала программа. Отчет также удовлетворяет всем требованиями запроса, в частности, записи там отсортированы в порядке возрастания длины рыб. Вместе с тем, легко заметить очевидный недостаток отчета - первая колонка там имеет излишнюю ширину, а последняя колонка выведена вплотную к соседней, для которой выделенной ширины колонки не хватило чтоб поместить в нее нужный текст. Это объясняется тем, что у всех колонок одинаковая ширина (140 пикселов) и для одних полей она вполне подходит, а для других может оказаться избыточной или недостаточной. Ситуацию можно исправить, если перед выводом отчета, вычислить необходимую ширину каждой колонки и сделать небольшие зазоры между ними. Другой недостаток состоит в том, что предложенный код способен выводит лишь числовые и текстовые поля. Вывод графики и многострочного текста такой код не может обеспечить. Желающие могут заняться решением этих проблем. Мы же на этом закончим изучение технологии создания отчетов с применением компонентов пакета Quick Report. Популярное:
|
Последнее изменение этой страницы: 2016-06-04; Просмотров: 843; Нарушение авторского права страницы