Компонент ADOQuery обеспечивает применение запросов SQL при работе с данными через ADO. По своей функциональности он подобен стандартному компоненту запроса.
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Компонент Query представляет собой набор данных, записи которого формируются в результате выполнения SQL-запроса и основаны на реляционном способе доступа к данным. При работе с удаленными БД рекомендуется использовать набор данных Query. При работе с удаленными базами данных следует обращаться к средствам языка SQL. Это относится и к таким операциям, как перемещение по набору данных или вставка в него записей. Если же для компонента Query используются методы типа Next и Insert, то вместо реляционного способа доступа к данным будет применён навигационный. В результате набора данных Query будет мало чем отличаться от набора данных Table. В отличие от компонента Table. Набор данных Query может включать в себя записи более чем одной таблицы БД. Текст запроса, на основании которого в набор данных отбираются записи, содержится в свойстве SQL типа Strings. Запрос включает в себя команды на языке SQL и выполняется при открытии набора данных. Запрос SQL иногда называется SQL-программой. SQL-запрос можно формировать и изменять динамически, внося изменения в его текст непосредственно при выполнении приложения.[5]

Компоненты для работы с данными расположенные на странице DataControls палитры компонентов и предназначены для построения интерфейсной части приложения. Они используются для навигации по набору данных, а также для отображения и редактирования записей.[5]

Одни визуальные компоненты для работы с данными предназначены для выполнения операций с полями отдельной записи, они отображают и позволяют редактировать значение поля текущей записи. К таким компонентам относятся, например, однострочный редактор Edit и графический обзор Image.

Другие компоненты служат для отображения и редактирования сразу нескольких записей. Примерами таких компонентов являются сетки DBGrid и DBCtrlGrid, выводящие записи набора данных в табличном виде. Визуальные компоненты для работы с данными похожи на соответствующие компоненты страниц Standard и Additional и отличаются, в основном, тем, что ориентированны на работу с БД и имеют дополнительные свойства DataSource и Datafield. Первое из них указывает на источник данных, а второе - на поле набора данных, с которым связан визуальный компонент. Например, Edit отображает строковое значение, позволяя пользователю изменять его.

Для всех визуальных компонентов, предназначенных для отображения и редактирования значений полей, при изменении пользователем их содержимого набор данных автоматически переводится в режим редактирования. Произведённые с помощью этих компонентов изменения автоматически сохраняются в связанных с ними полях при наступлении определённых событий.

При программном изменении содержимого эти визуальных компонентов набор данных автоматически в режим редактирования не переводится. Для этой цели в коде должен предварительно вызываться метод Edit набора. Чтобы сохранить изменения в поле (полях) текущей записи, мы должны также предусмотреть соответствующие действия, например, вызов метода Post или переход к другой записи набора данных.[5]

В библиотеке визуальных компонентов для всех компонентов, в том числе и предназначенных для работы с данными, базовым является классу Control. Он обеспечивает основные функциональные атрибуты такие, как положение и размеры элемента, его заголовок, цвет и другие параметры. Класс Control включает в себя общие для визуальных компонентов свойства, события и методы. В целом визуальные компоненты можно разделить на две группы: оконные и неоконные.

Оконный элемент управления представляет собой специализированное окно, предназначенное для решения конкретной задачи. К таким элементам относятся, например, поля редактирования, командные кнопки, полосы прокрутки.

Такие компоненты, как Edit, DBEdit, Memo или DBMemo при получении фокуса ввода отображают в своей области курсор редактирования. Компоненты, не связанные с редактированием информации, получение фокуса ввода обычно отображают с помощью с помощью пунктирного черного прямоугольника.

К неоконным элементам управления базовым является класс GraphiControl, производимый непосредственно от класса Control. Неоконные элементы управления на могут получать фокус ввода. Их достоинством является менее расходования ресурсов.

Свойства позволяют управлять внешним видом и поведением компонентов при проектировании и при выполнении приложения. Обычно установка значений большинства свойств компонентов выполняется на этапе проектирования с помощью инспектора объектов.

Свойство Name указывает на имя компонента, которое используется для управления компонентов во время выполнения приложения. Каждый новый компонент, помещаемый на форму, получает имя по умолчанию, автоматически образуемое путем добавления к названию компонента его номера в порядке помещения на форму. На этапе разработки приложения мы можем изменять имя компонента на более осмысленное и соответствующее назначению компонента.

Свойство Aling определяет способ выравнивания компонента на самой форме, на которой оно находится. Выравнивание используется в случае, когда требуется, чтобы какой-либо интерфейсный элемент занимал определённое положение.

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

Свойство Color определяет цвет фона. Часто удобно задавать цвета с помощью констант. Отображаемые цвет зависит от параметров видеокарты и монитора, в первую очередь от установленного цветного разрешения.

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

- Выбор управляющего элемента;

- Перемещение указателя мыши;

- Нажатие клавиш клавиатуры;

- Получение и потеря управляющим элементом фокуса ввода;

- Перемещение объектов методом drag-and-drop.

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

 

Доступ к данным

 

Навигационный способ доступа заключается в обработки каждой записи набора данных. Достоинством этого способа является простота кодирования операции, а основной недостаток состоит в том, что приложение получает все записи набора независимо от того, сколько их на самом деле требуется обработать. Это приводит к большой нагрузке на сеть, особенно при интенсивном обмене данными. Поэтому применение навигационного способа доступа обычно ограничивается локальными БД.

При навигационном способе доступа операции выполняются с отдельными записями. Каждый набор данных имеет указатель текущей записи, то есть записи, с полями которой могут быть выполнены такие операции, как редактирование или удаление. Компоненты Table и Query позволяют управлять положением этого указателя.[5]

Навигационный способ доступа даёт возможность осуществлять следующие операции:

- сортировка записей;

- навигация по набору данных;

- редактирование записей;

- вставка и удаление записей;

- фильтрация записей;

- поиск записей.

Редактирование записей заключается в изменении значений их полей. Редактирована, может быть только текущая запись, поэтому перед действиями, связанными с редактированием, обычно выполняются операции по поиску и перемещению на требуемую запись. После того. Как указатель текущей записи установлен на нужную запись, и набор данных находится в режиме просмотра, для редактирования записи следует:

- перевести набор данных в редактирование;

- изменить значение полей записи;

- подтвердить изменения или отказаться от них.

Метод Insert переводит набор данных в режим вставки и добавляет к нему новую пустую запись. Для добавления записи нужно:

- перевести набор данных в режим записи;

- задать значение полей новой записи;

- подтвердить изменения или отказаться от них.

Удаление текущей записи выполняет метод Delete, который работает только с модифицируемым набором данных. В случае успешного удаления записи текущей становится следующая запись, если же удалялась последняя запись, то курсор перемещается на предыдущую запись, которая после удаления становится последней. В отличие от некоторых СУБД, в Delphi удаляемая запись действительно удаляется из набора данных.

Порядок расположения записей может быть неопределённым. По умолчанию записи не отсортированы или сортируются. С отсортированными наборами записей работать более удобно. Сортировка заключается в упорядочивании записей по определённому полю в порядке возрастания или убывания содержащихся в нём значений. Сортировку можно выполнять и по нескольким полям.[5]

При сортировки по двум полям записи сначала упорядочиваются по значениям первого поля, а затем группы записей с одинаковым значением первого поля сортируются по второму полю. Сортировка наборов данных Table и Query выполняется различными способами. Сортировка наборов данных Table выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей. Таким образом, сортировка возможна по полям, для которых создан индекс.

Для сортировки по нескольким полям нужно создавать индекс, включающий эти поля. Направление сортировки определяется параметром ixDescending текущего индекса, по умолчанию он выключен, и упорядочивание выполняется в порядке возрастания значений. Если для индекса признак ixDescending включен, то сортировка выполняется в порядке убывания значений. Поля, по которым сортируются записи, устанавливаются через свойств IndexName.

Перемещение по набору данных заключается в управлении указателем текущей записи. Этот указатель определяет запись, с которой будут выполняться такие операции, как редактирование или удаление.

Перед перемещение указателя текущей записи набор данных автоматически переводится в режим просмотра. Если текущая запись находилась в режимах редактирования или вставки, то перед перемещением указателя сделанные в записи изменения вступают в силу, для чего набор данных автоматически вызывает метод CheckBrowseMode. Для перемещения указателя текущей записи в наборе данных используются методы:

- Процедура First – установка на первую строку;

- Процедура Next – установка на следующую строку;

- Процедура Last – установка на последнюю строку;

- Процедура Prior – установка на предыдущую строку.

При перемещении по записям набора данных связанные с ним визуальные компоненты отображают изменения данных, причем смена отображения может происходить достаточно быстро.

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

Фильтрация записей – это задание ограничений для записей, отбираемых в набор данных. Набор данных представляет собой записи, набранные из одной или нескольких таблиц. Состав записей в наборе данных в данный момент времени зависит от установленных ограничений, в том числе и от фильтров. Система Delphi дает возможность осуществлять фильтрацию записей:

- по выражению;

- по диапазону.

По умолчанию фильтрация записей не ведётся, и набор данных Table содержит все записи связанной с ним таблицы БД, а в набор данных Query включаются все записи, удовлетворяющие SQL-запросу, содержащемуся в свойстве SQL. Фильтрация похожа на SQL–запросы, но является менее мощным средством. По сравнению с SQL–запросами фильтрация менее эффективна, так как ограничивается количество записей, видимых в наборе.

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

Достоинством фильтрации по выражению является то, что она применима к любым полям, в том числе и неиндексированным. В связи с тем, что в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей.

Для задания выражения фильтра представляет собой конструкцию, в состав которой могут входить следующие элементы:

- имена полей таблицы;

- литералы;

- операции сравнения;

- арифметические операции;

- логические операции;

- круглые и квадратные скобки.

Если имя поля содержит пробелы, то его заключают в квадратные скобки. Имена переменных в выражении фильтра использовать нельзя. Если в выражении фильтра требуется включить значение переменной или свойства какого-либо компонента, то это значение должно быть преобразовано в строковый тип. Операции сравнения представляют собой обычные отношения <,>,=,<=,>=,<>. Арифметическими являются операции +, -,* и /. В качестве логических операций можно использовать AND, OR и NOT. Круглые скобки применяются для изменения порядка выполнения арифметических и логических операций.

Набор данных Table допускается два способа задания условии фильтрации: су помощью выражения фильтра Filter и в обработчике события OnFilterRecord.

В случае набора данных Query для записей можно использовать: SQL-запрос, обработчик событияOnFilterRecord, выражения фильтра.

При фильтрации по диапазону в набор данных включаются записи, значения полей которых попадают в заданный диапазон, т.е. условием фильтрации является выражение вида «значение>нижняя граница AND значение < верхней границы». Такая фильтрация применяется к наборам данных Table.

Достоинство фильтрации по диапазону является высокая скорость обработки записей. В отличие от фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация по диапазону ведётся индексно-последовательным методом, поэтому этот способ фильтрации применим только для индексированных полей. Индекс поля, диапазон которого задан как текущий с помощью свойства IndexName или IndexFieldName. Если текущий индекс не установлен, то по умолчанию используется главный индекс.

Для включения и выключения фильтрации по диапазону применяются методы ApplyRange и CancelRange. Первый из них активизирует фильтрацию, а другой - деактивизирует. Предварительно для индексного поля или полей, по которому выполняется фильтрация, следует задать диапазон допустимых значений. Когда одна из границ диапазона не задана, то диапазон открыт, то есть нижняя граница становится равной минимально возможному, а верхняя граница – максимально возможному значению этого поля.

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

При организации поиска записей важное значение имеет наличие индекса для полей, по которым ведётся поиск. Индексирование значительно повышает скорость обработки данных, кроме того, ряд методов может работать только с индексированными полями.

Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть не индексированными. Функция Locate ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существует, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение True, в противном случае значение False. Обычно при разработки приложения пользователю предоставляется возможность влиять на процесс поиска су помощью управляющих элементов, расположенных на форме. При этом действия пользователя по управлению поиском в наборе данных мало, чем отличаются от аналогичных действий при выполнении фильтрации. Функция Lookup так же осуществляет поиску записи, удовлетворяющей определённым условиям, но, в отличие от метода Locate, не перемещает указатель текущей записи, а считывает информацию из полей записи. Еще одно отличие между двумя методами заключается в том, что метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв.

Для набора данных Table имеются методы, позволяющие вести поиск записей только по индексным полям. Перед вызовом любого из этих методов следует установить в качестве текущего индекс, построенный по используемым для поиска полям. Методы поиска можно разделить на две группы, в первой группе методы, предназначенные для поиска на точное соответствие, а другую образуют методы, допускающие только частичное совпадение заданных для поиска значений и значений полей записей. Если заданным условиям поиска соответствует несколько записей, то указатель текущей записи устанавливается на первую из них. Порядок сортировки и, соответственно, порядок расположения записей в наборе даны, определяется текущим индексом, по которому и ведется поиск.[5]

 

Создание отчетов в Delphi

 

Для вывод информации не печать использовались отчеты созданные в Delphi. Отчет – это печатный документ, содержащий данные, аналогичные получаемые в результате выполнения запроса к БД. В Delphi для создания отчетов служит генератор отчетов QuickReport,содержащий обширный набор компонентов.

Компоненты, предназначенные для создания отчетов, находятся на странице QReport палитры компонентов. Большинство компонентов отчета являются визуальными. Многие из них мало отличаются от аналогичных компонентов страниц Standard, Additional и Data Controls. Например, компоненту 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. В этом случае он будет выводиться на каждой странице отчета. Обычно используются следующие компоненты отчета:

- QRTable – надпись, содержащая текст;

- QRDBText – значение поля записи, обычно размещается в полосе данных;

- QRExpr – значение, формируемое на основе выражения, в котором могут использоваться значение полей записей;

- QRSysData – системная информация, обычно используемая для итоговых полос и полос колонтитулов;

- QRImage – графический обзор(например, логотип организации);

- QRShape – геометрическая фигура, размещаемая в любой полосе, так же позволяет оформить сетку вокруг выводимых данных.

Возможность автоматического изменения размеров содержащего текст компонента по размеру текста управляет свойство AutoSize. По умолчанию размер текстового компонента автоматически подстраивается под содержащийся в нем текст, так как свойство AutoSize имеет значение True. Если компоненты отчета, в первую очередь элементы полосы данных, имеют рамку, то размеры этих компонентов должны быть постоянными.

Полосы заголовков столбцов и данных является основными полосами, в которых размещаются компоненты, обеспечивающие табличный вывод содержимого набора данных. Заголовки столбцов выводятся на каждом листе отчета.

Для заголовка столбцов данных в полосу заголовков обычно помещаются компоненты QRLabel, котором находится тексте, соответствующий полям данных.

Для вывода значений полей записей в полосу данных обычно помещаются компоненты QRDBText и QRExpr. Имя набора даны, указывается в свойстве DataSet, чьё значение устанавливается автоматически при помещении компонента в полосу данных, а имя поля задается в свойстве DataFileld.

На этапе разработки в отчете присутствует только одна полоса данных, но при форматировании отчета отдельная полоса данных будет выведена для каждой записи отчета. Если набор данных является пустым и не содержит записей, то область данных не выводится.

Компонент QRExpr позволяет вставлять в отчет значение выражения, рассчитываемого обычно с участием различных полей записей. Выражение заносится в свойство Expression типа String. Использование компонента QRExpr аналогично использованию вычисляемых полей набора данных. Однако при просмотре отчета на этапе разработки значения компонентов QRExpr выводятся, в то время как значение выделяемы полей не определяются.

Итоговая полоса отчета выводится один раз в конце отчета сразу после полосы данных. В этой полосе обычно стоят либо итоговые сведения отчета, например, среднее и максимальное значения по данным какого-либо поля. В итоговой полосе обычно размещается компонент QRLabel для вывода записей и QRExpr для вывода значения выражения.

Можно выделить следующие виды отчетов.

Простой отчет представляет собой отчет на основе данных из одного набора данных и содержит сведения, которые выводятся в табличном виде без дополнительных условии, например, группирование данных. Размещение и вид печатаемых в отчете данных аналогичны размещению и виду данных, отображаемы в сетке DBGrid. Отличием является то, что данные отчета размещаются не на форме, а на бумажном документе, и их нельзя редактировать.

Простой отчет может содержать следующие полосы, перечисляемые в порядке размещения на странице: верхний колонтитул; заголовок отчета; заголовки столбцов; данные; итог отчета; нижний колонтитул.

Выводимые в отчете данные можно группировать по определённому признаку. Для группирования записей отчета по определенному полю в наборе данных должен быть установлен текущий индекс, построенный по этому полю. Если индексу не задан или установлен по другому полю, то ошибок компиляции не возникает, то группирование записей выполняется неправильно. Можно группировать данные, находящиеся в одном наборе данных, или данные из связанных наборов данных.

В отчете с группирование данных вместо полосы Detail нужно использовать комбинацию полос:

1) QRGroup – название Group Header;

2) QRBand – полоса даны, название Detail;

3) QRBand – полоса нижнего колонтитула группы, название Group Footer.

Эти полосы должны располагаться в указанном порядке. Если группа не имеет нижнего колонтитула, то значение этого свойства можно не задавать. Остальные полосы отчета с группирование данных создаётся и используется так же, как в обычном простом отчете.

На практике наборы данных чаще всего связываются отношением «главный-подчиненный» способом. Такой отчет содержит:

- Заголовок отчета;

- Заголовки столбцов;

- Области данных – в качестве набора данных устанавливается главный набор. В ней обычно размещаются компоненты QRDBText, текст, который является заголовками столбцов даны детальной области;

- Области детализации – устанавливается подчиненный набор данных. В ней обычно располагаются компоненты QRDBText и QRExpr, с помощью которых выводятся значения полей записей подчиненного набора данных;

- Нижний колонтитул страницы.

Составной отчет объединяет в себе несколько отчетов и представлен компонентом QRCompositeReport, который можно разместить на любой форме. На начальном этапе составной отчет не содержит ни одного отчета. Для добавления к составному отчету нового отчета используется событие OnAddReport, при этом добавляемые отчеты должны быть предварительно подготовлены. Свойство Reports составного отчета содержит список отчетов. Новые отчеты добавляются к этому списку методом Add.[5]

 

Дата: 2019-12-22, просмотров: 258.