Набор данных Table допускается два способа задания условии фильтрации: су помощью выражения фильтра Filter и в обработчике события OnFilterRecord.
В случае набора данных Query для записей можно использовать: SQL-запрос, обработчик событияOnFilterRecord, выражения фильтра.
При фильтрации по диапазону в набор данных включаются записи, значения полей которых попадают в заданный диапазон, т.е. условием фильтрации является выражение вида «значение>нижняя граница AND значение < верхней границы». Такая фильтрация применяется к наборам данных Table.
Достоинство фильтрации по диапазону является высокая скорость обработки записей. В отличие от фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация по диапазону ведётся индексно-последовательным методом, поэтому этот способ фильтрации применим только для индексированных полей. Индекс поля, диапазон которого задан как текущий с помощью свойства IndexName или IndexFieldName. Если текущий индекс не установлен, то по умолчанию используется главный индекс.
Для включения и выключения фильтрации по диапазону применяются методы ApplyRange и CancelRange. Первый из них активизирует фильтрацию, а другой - деактивизирует. Предварительно для индексного поля или полей, по которому выполняется фильтрация, следует задать диапазон допустимых значений. Когда одна из границ диапазона не задана, то диапазон открыт, то есть нижняя граница становится равной минимально возможному, а верхняя граница – максимально возможному значению этого поля.
Поиск записи, удовлетворяющей определённым условиям, означает переход на эту записи. Поиск во многом похож на фильтрацию, так как в процессе поиска также выполняется проверка полей записей на некоторые условия. Отличие заключается в том, что в результате поиска количество записей в наборе данных не изменяется.
При организации поиска записей важное значение имеет наличие индекса для полей, по которым ведётся поиск. Индексирование значительно повышает скорость обработки данных, кроме того, ряд методов может работать только с индексированными полями.
Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть не индексированными. Функция Locate ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существует, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение True, в противном случае значение False. Обычно при разработки приложения пользователю предоставляется возможность влиять на процесс поиска су помощью управляющих элементов, расположенных на форме. При этом действия пользователя по управлению поиском в наборе данных мало, чем отличаются от аналогичных действий при выполнении фильтрации. Функция Lookup так же осуществляет поиску записи, удовлетворяющей определённым условиям, но, в отличие от метода Locate, не перемещает указатель текущей записи, а считывает информацию из полей записи. Еще одно отличие между двумя методами заключается в том, что метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв.
Для набора данных Table имеются методы, позволяющие вести поиск записей только по индексным полям. Перед вызовом любого из этих методов следует установить в качестве текущего индекс, построенный по используемым для поиска полям. Методы поиска можно разделить на две группы, в первой группе методы, предназначенные для поиска на точное соответствие, а другую образуют методы, допускающие только частичное совпадение заданных для поиска значений и значений полей записей. Если заданным условиям поиска соответствует несколько записей, то указатель текущей записи устанавливается на первую из них. Порядок сортировки и, соответственно, порядок расположения записей в наборе даны, определяется текущим индексом, по которому и ведется поиск.[5]
3.4 Создание отчетов в Delphi
Для вывод информации не печать использовались отчеты созданные в Delphi. Отчет – это печатный документ, содержащий данные, аналогичные получаемые в результате выполнения запроса к БД. В Delphi для создания отчетов служит генератор отчетов QuickReport,содержащий обширный набор компонентов.
Компоненты, предназначенные для создания отчетов, находятся на странице QReport палитры компонентов. Большинство компонентов отчета являются визуальными. Многие из них мало отличаются от аналогичных компонентов страниц Standard, Additional и DataControls. Например, компоненту QRImage соответствуют компоненты Image и DBImage.
Главным компонентом отчета является компонент-отчет QuickRep, представляющий собой основу, на которой размещаются другие компоненты. Компонент QuickRep обычно размещается на отдельной форме, предназначенной для создания отчета. По умолчанию он имеет имя QuickRep1. если на форме размещается другой отчет, он получает имя QuickRep2 и т.д.
Компонент QuickRep при перемещение его на форму имеет вид страницы формата А4, первоначально отображаемой в натуральную величину. На этапе разработки приложения можно изменить масштаб страницы и размещенных на ней компонентов с помощью свойства Zoom типа Integer (значение этого свойства устанавливается в процентах, по умолчанию 100%).
Отчет можно поместить на любую форму приложения, например на главную. В этом случае отчет (страница) создает своего рода фон, на котором расположены управляющие элементы формы.
Компонент QuickRep связывается с набором данных Table или Query, для которого создается отчет, с помощью свойства DataSet. При этом наборе данных Query может содержать записи, выбранные из разных таблиц. При печати отчета в процессе выполнения приложения набор даны должен быть открыт. Во время построения отчета можно использовать специально создаваемые наборы данных и размещать его на форме, при этом источник данных DataSource не требуется. На практике компонент QuickRep обычно связывается с набором данных, записи которого отображаются на форме в визуальных компонентах. В этом случае в отчет попадают записи, удовлетворяющие, например, критерию фильтрации и сортировки, задаваемому пользователем.
Отчет состоит из отдельных полос – составных частей отчета (Рисунок 5), которые определяют содержание и вид созданного документа. Полоса представляет собой элемент отчета. Каждый элемент размещаются на своем месте и предназначен для отображения соответствующих компонентов отчета и вывода данных.
Конструирование отчета в основном аналогично конструированию формы. Управлять наличием полос в отчете можно с помощью свойства Bands множественного типа TQuickRepBadns. При разработки приложения включение/отключение полосы выполняется установкой логического значения соответствующего подсвойства свойства Bands, например, для полосы заголовка отчета этим подсвойством является HasTitle. С помощью этого свойства можно включать полосы: верхний колонтитул, заголовок отчета, заголовки столбцов, область данных, итог отчета, нижний колонтитул. Так же эти полосы можно вставлять в отчет с помощью компонента полосы QRBand.
Полоса отчета (компонент QRBand) является основной составной частью отчета, на которой размещаются другие его компоненты. Типы полосы определяются свойством BandType типа TQRBandType, которое может принимать следующие значения:
- rbTitle – заголовок отчета;
- rbpageHeader – верхний колонтитул;
- rbDetail – данные записей набора данных;
- rbPageFooter – нижний колонтитул;
- rbSummary – итог отчета;
- rbGroudHeader – заголовок группы, который находится для каждой группы;
- rbGroudFooter – примечание группы, которое выводится для каждой группы;
- rbSubDetail – данные подчиненного набора данных для отчета «мастер - детальный»;
- rbColumnHeader – заголовки столбцов, печатаемые один раз на каждой странице над данными.
При установки типа полосы она автоматически размещается на своем месте в отчете выравнивается по ширине страницы отчета с учетом левого и правого полей. Разработчик не имеет возможности переместить полосу на другое место с помощью мыши. Изменить ширину полосы можно косвенно, изменяя размеры страниц и полей.
При создании в отчет нужно включить не более одной полосы каждого вида, так как при печати отчета «лишние» полосы одного и того же вида учитываться не будут. Например, если в отчет включены две полосы заголовка отчета, то ошибки транзакции не возникает, но в качестве заголовка используется первая из этих полос. Каждая полоса может иметь отдельную рамку, которой управляет свойство Frame,не отличающегося от аналогичного свойства самого компонента отчета QuickRep.
Заголовок отчета выводиться один раз на первой странице сразу под верхним колонтитулом, если он есть. В полосе заголовка обычно размещаются надписи QRLabel, содержащие требуемый текст, как правило, название всего отчета. При необходимости в заголовке можно разместить, например, сведения о названии, адресе и телефоне организации, а также логотип.
Колонтитулы печатаются в начале и конце каждой страницы, в них обычно выводятся сведения о дате, время печать, а также номер страницы. Для этого в полосах колонтитулов чаще всего размещаются компоненты QRSysData , которым устанавливаются требуемое значение свойства Data. В полосе колонтитула можно размещать и другие компоненты, например, QRLabel для вывода на каждой странице названия организации.
После создания полосы определенного типа в ней размещаются соответствующие компонент. При этом необходимо только компоненты страницы QReport. Размещение на полосе других компонентов, не взывает ошибки транзакции, но в сформированный отчет такие компоненты не попадают. Можно разместить компонент отчета и вне полосы, на компоненте-отчете QuickRep. В этом случае он будет выводиться на каждой странице отчета. Обычно используются следующие компоненты отчета: