Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛПЗ поОАиП.doc
Скачиваний:
56
Добавлен:
18.05.2015
Размер:
3.08 Mб
Скачать

Типы бд в Delphi

Хотя Delphi и не является СУБД в классическом понимании этого термина, в частности, у нее нет собственного формата баз данных, она поддерживает как собственные сразу несколько форматов, в частности, dBase и Paradox.

Таблицы dBase являются одним из первых форматов БД, появившихся на ПК, благодаря чему с ними могут взаимодействовать многие СУБД - если и не на прямую, то по крайней мере, имея возможность импортировать и экспортировать данные в этом формате. Более того, с некоторыми оговорками, их можно просматривать и редактировать даже в электронных таблицах, например, в Excel.

Формат dBase является достаточно простым и может использовать для хранения каждой таблицы до 3 файлов:

  • dbf - основная таблица с данными;

  • dbt - BLOB-данные (этот файл появляется, если в таблице предусмотрены соответствующие поля);

  • mdx - файл с индексами.

Таким образом, dBase - это достаточно простой и универсальный формат таблиц. Это о преимуществах, из недостатков же следует отметить такие, как ограничения на имена полей в таблицах: максимальная длина - всего 10 символов, допустимы только латинские буквы и цифры. Сходные ограничения налагаются на имена самих таблиц, при этом, в лучших традициях 16-битных систем, длина имени таблицы не должна превышать 8 символов (хотя это ограничение, в общем-то, можно игнорировать при работе в Delphi под 32-разрядными системами). Но куда более существенными недостатками являются отсутствие автоматического контроля целостности данных или связей, прав доступа, а так же ограничения на поддерживаемые типы данных, ключи, индексы и т.д. Все это делает данный формат недостаточно конкурентоспособным.

Другой формат, Paradox, появился позже и, пожалуй, является одним из наиболее развитых форматов, применяемых в локальных БД. Основными отличиями этого формата от dBase являются:

  • возможность использования практически любых символов для названий полей, а так же лимит в 25 символов, а не в 10;

  • большее количество поддерживаемых типов данных, включая автоинкрементный тип;

  • поддержка контроля целостности данных и возможность организации проверки вводимых данных;

  • возможность защиты таблиц паролем и определения прав доступа к данным.

Благодаря таким достоинствам, формат Paradox используется гораздо чаще, по крайней мере, применительно к Delphi. Кроме того, большой набор типов данных позволяет эффективно подбирать нужный тип для хранения данных. Полный перечень поддерживаемых Paradox типов данных и их символьные обозначения в программе Database Desktop приведены в таблице 18.1.

Типы данных в Paradox 7

Тип

Обозначение

Описание

Alpha

A

Строка длиной не более 255 символов (аналог ShortString)

Number

N

Число с плавающей точкой (аналог Double)

Money

$

То же, что и Number, но при выводе сопровождается обозначением денежного знака

Short

S

Малое целое (аналог SmallInt)

LongInteger

I

Целое (аналог LongInt)

BCD

#

Число в двоично-десятичном формате

Date

D

Дата в диапазоне от 1 января 9999г. до н.э. до 31 декабря 9999г.

Time

T

Время

Timestamp

@

Дата и время

Memo

M

Строка произвольной длины. Первые 240 символов хранятся в файле основной таблице, остальные – в файле с BLOB-данными

Formatted Memo

F

То же, что и Memo но для RTF-текста

Graphic

G

Графическое изображение в формате BMP, PCX, TIFF, GIF или EPS. При выводе преобразуется в BMP, хранится в файле с BLOB-данными

OLE

O

Произвольные данные, которые поддерживаются через OLE. Хранятся в файле в BLOB-данными

Logical

L

Логическое значение (TRUE или FALSE)

Autoincrement

+

Автоинкрементное поле. При добавлении новой записи значение этого поля автоматически увеличивается на 1

Binary

B

Двоичная информация (произвольная последовательность байтов). Подобно Memo, первые 240 байт хранятся в файле основной таблицы, остальные – в BLOB

Bytes

Y

Двоичная информация (произвольная последовательность байтов) длиной не более 255 символов

Что касается файлов, используемых для хранения информации, то в Paradox их может быть использовано достаточно большое количество:

  • db - файл с основными данными таблицы;

  • mb - файл с BLOB-данными;

  • px - файл с первичным индексом (ключом);

  • xg? и yg? - файлы со вторичными индексами (вместо ? будет порядковый номер индекса);

  • val - файл с информацией для проверки данных и целостности ссылок.

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

Лабораторная работа №31.

Тема: Создание вычисляемых полей и полей выбора

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

В нашей программе FIRMA в таблице наименования товара содержится поле NSklad (номер склада). Давайте дополним наше приложение таким образом, чтобы при выборе записи из таблицы "Наличие товара" как дополнительная информация выводился бы номер склада, на котором этот товар находится.

Создайте новое поле в НД Table2 с именем NSklad типа Integer. Установите переключатель в положение Lookup. После выбора переключателя становятся доступными элементы группы Lookup definition, с помощью которых устанавливаются параметры связи наборов данных (рисунок 1 и таблица 1).

Рис.1. Диалоговое окно New Field

Таблица 1. Параметры связи наборов данных

Название

Назначение

DataSet

Определяет имя родительского НД

Key Fields

Определяет список ключевых полей родительского НД. По этим полям построен индекс для связи родительского НД с дочерним. Если в индексе несколько полей, они разделяются точками с запятыми

Lookup Fields

Определяет список ключевых полей дочернего НД. По этим полям построен индекс для связи дочернего НД с родительским

Result Fields

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

Установите у этих элементов следующие значения:

Таблица 2. Значения свойств

Элемент

Значение

DataSet

Table1

Key Fields

Naim

Lookup Fields

Naim

Result Fields

NSklad

Таким образом, родительский НД Table1 связан с дочерним НД Table2 по полю Naim, и создаваемому нами полю присваивается значение из поля NSklad НД Table1.

Выберите в редакторе полей НД Table2 созданный вновь объект TField NSklad и присвойте его свойству Visible значение False (таким образом, поле NSklad не будет отображаться в DBGrid2). Поместите на форму компонент TLabel с вкладки Standard, TDBText с вкладки Data Controls, присвоив их свойствам следующие значения:

DBText1

DataSource

DataSource2

DataField

NSklad

Label1

Caption

Номер склада

Запустив программу, вы убедитесь, что при перемещении по таблице "Наличие товара", в DBLabel1 показывается номер склада, на котором находится этот товар. Как видно, значение берется из Table1 (рисунок 2).

Рис.2. Приложение с Lookup-полем

Созданное приложение можно взять здесь.

С помощью Lookup-полей можно не только показывать дополнительную информацию из другого НД, но и использовать их для автоматической установки нового значения в другое поле НД.

Изменим нашу БД таким образом: пусть каждый товар будет находиться на отдельном складе с номерами 1, 2, 3 и т.д. Свойство Visible компонента TField NSklad установите в True. Теперь в DBGrid2 отображается номер склада, на котором находится товар, а при редактировании этого поля появляется комбинированный список и после выбора значения автоматически обновляется поле Naim. Заметим, что список выбора раскрывается, несмотря на то, что свойство ReadOnly (только чтение) компонента DBGrid2 установлено в True.

Рис.3. Результат работы приложения

Лабораторная работа №32

Тема: Навигационный способ доступа к данным

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

данных.

В любом наборе данных существует текущий указатель, который задаёт запись, над которой будут выполняться операции изменения данных. Компоненты Table и Query содержат методы, позволяющие перемещаться по записям

(изменять положение текущего указателя).

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

− навигацию по набору данных;

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

− добавление и удаление записей;

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

− фильтрацию записей;

− поиск записей;

− создание, удаление, переименование таблиц.

Большинство действий можно выполнять как с помощью компонентов, так и программно.

В соответствии со схемой работы с базой данных с использованием BDE для создания приложения необходимо выполнить приведённые ниже действия.

1. Разместить на форме компоненты Table, DataSource, DBGrid.

2. Связать компонент Table с таблицей БД, которая находится на диске.

Для этого в Инспекторе объектов:

− в свойстве DatabaseName выбрать в выпадающем списке псевдоним или указать путь к базе данных;

− в свойстве TableName указать название таблицы;

− свойство Active установить в значение true.

3. Связать компоненты DataSource и Table: в свойстве DataSet компонента DataSource установить значение Table1.

4. Подсоединить DBGrid к источнику данных: в свойстве DataSource компонента DBGrid задать значение DataSource1.

В данном примере все свойства задавались в Инспекторе объектов, но это можно сделать программно.

Для удобства работы можно добавить на форму навигатор DBNavigator и связать его с источником данных: в свойстве DataSource задать значение DataSource1.

Лабораторная работа №33

Тема: Применение фильтрацией данных и методов установки диапазона допустимых значений

Фильтрация записей

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

  • По выражению

  • По диапазону

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

Фильтрация по выражению

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

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

  • Имена полей таблиц

  • Литералы

  • Операции сравнения

  • Арифметические операции

  • Логические операции

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

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

Литерал представляет собой значение, заданное явно (например, число, строка или символ). Имена переменных в выражении фильтра использовать нельзя. Если в выражение фильтра требуется включить значение переменной или свойства какого-либо компонента, тогда это значение должно быть преобразовано в строковый тип.

Операции сравнения представляют собой обычные для языка Pascal отношения <, >, =, <=, >= и <>.

Арифметическими являются операции +, -, * и /.

В качестве логических операций можно использовать AND, OR, и NOT.

Для активации и деактивации фильтра используется свойство Filtered типа Boolean. При установке свойству Filtered значения True фильтрация включается, и в набор данных отбираются данные, которые удовлетворяют фильтру, записанному в свойстве Filter.

Параметры фильтрации можно задать с помощью свойства FilterOptions типа TFilterOPtions.

Это свойство принадлежит к множественному типу и может принимать комбинации двух значений:

  • foCaseInsensitive – регистр букв не учитывается.

  • foNoPartialCompare – выполняется проверка на полное соответствие содержимого поля и значения, заданного для поиска.

По умолчанию все параметры фильтра выключены, и свойство FilterOption имеет значение [].

Фильтрация по диапазону

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

Для включения и выключения по диапазону применяются методы ApplyRange и CancelRange, которые активизируют и деактивизируют фильтр. Предварительно для индексного поля, по которому выполняется фильтрация, следует задать диапазон допустимых значений. Методы SetRangeStart и SetRangeEnd устанавливают границы диапазона. Для изменения границ диапазона предназначены методы EditRangeStart и EditRangeEnd. Совместно с этими методами используется свойство KeyExclusive типа Boolean, которое определяет, как учитывать заданное граничное значение при анализе записей. Если свойство KeyExclusive имеет значение False (по умолчанию), то записи со значением поля, по которому выполняется фильтрация, равным границе диапазона, включаются в набор данных. Значение этого свойства задается отдельно для нижней и верхней границы и должно устанавливаться сразу после вызова методов EditRangeStart, EditRangeEnd, SetRangeStart и SetRangeEnd.

Свойство Filter имеет строковый тип и может быть задано в Инспекторе объектов или сформировано программно. Запись условия в Инспекторе объектов обычно не вызывает затруднений. Например, для фильтрации по числовому полю Length_In простое условие Length_In>60, записанное в свойстве Filter компонента Table, позволяет вывести записи, у которых значение поля Length_In превышает 60. Условие (Length_In>60)and(Length_In<100) отбирает записи, у которых длина Length_In больше 60 и меньше 100. Для вывода записей, имеющих значение ’Cod’ в поле Category строкового типа, достаточно записать условие: Category=’Cod’. Если при этом в свойстве foCaseInsensitive задать true, то на результат не будет влиять регистр, то есть значения ’Cod’ и ’сod’ не различаются (рис. 13).

Рис. 13. Задание условия фильтрации в Инспекторе объектов

При фильтрации по полю строкового типа значение поля задаётся строковой константой, следовательно, должно быть записано в апострофах. По правилам языка Delphi для задания апострофа внутри строки его надо ввести дважды. Следовательно, если требуется вывести записи, у которых значение поля Common_Name равно Lingcod, то в свойстве Filter надо записать:

Table1.Filter:='Common_Name=''Lingcod'''; Для фильтрации записей по первой букве поля Common_Name можно использовать маску. При этом строка, задающая условие фильтрации, формируется с помощью операции сцепления (+): Table1.Filter:='Common_Name='+'''C*''';

Если значение поля вводится в компонент Edit, то надо сформировать строковую константу по данным свойства Text. Table1.Filter:='Common_Name='+''''+Edit6.Text+'''';//В Edit6 C*

Table1.Filter:='Common_Name='+Edit6.Text;//В Edit6 'C*' Варианты могут быть разные, в зависимости от того, в каком виде записывается интересующее пользователя значение поля. Лучше не требовать от пользователя знания каких-либо особых правил записи: Table1.Filter:='Common_Name='+''''+Edit6.Text+'*''';//В Edit6 C Для задания апострофа иногда удобно воспользоваться его кодом – #39. Надо только помнить, что апостроф, заданный в виде #39, всегда является отдельным элементом при сцеплении строк: Table1.Filter:='Common_Name='+#39+Edit6.Text+'*'+#39;//В Edit6 C Кроме того, можно воспользоваться функцией QuotedStr, которая возвращает строку в апострофах. Например:

Table1.Filter:='Common_Name<'+QuotedStr(Edit6.Text); Если внутри строки есть апостроф, то он удваивается. При необходимости выполнить фильтрацию по нескольким полям выбирают один из двух способов:

− записывают сложное условие с использованием логических связок;

− фильтруют по одному условию, затем по второму условию в уже отфильтрованном списке и т.д.

Если поле, по которому выполняется фильтрация, содержит дату, то при задании условия в Инспекторе объектов дату надо записать в апострофах. При выполнении фильтрации программно с датой надо работать как с полем строкового типа: Table1.Filter:='Card_Exp <'+ ''''+(Edit4.Text)+'''';

Можно, например, использовать функцию QuotedStr: Table1.Filter:='Card_Exp<'+ Quotedstr(Edit4.Text);

Лабораторная работа №34

Тема: Создание приложения со связанными таблицами

Соединение – это вывод связанной информации из нескольких таблиц или запросов в виде одного логического набора данных. В операции соединения проявляется одна из наиболее важных особенностей запросов SQL – способность определять связи между многочисленными таблицами и выводить информацию из них с учётом этих связей. Именно эта операция придаёт гибкость и лёгкость языку SQL.

Соединяемые таблицы перечисляются через запятую в предложении FROM оператора SELECT. Правила соединения таблиц задаются в предложении WHERE запроса SELECT с помощью специального условия соединения.

Существует несколько видов операции соединения:

CROSS JOIN – перекрестное соединение;

INNER JOIN – внутреннее соединение, используется по умолчанию;

LEFT JOIN [OUTER] – левое внешнее соединение;

RIGHT JOIN [OUTER] – правое внешнее соединение;

FULL JOIN [OUTER] – полное внешнее соединение.

Внешние соединения поддерживаются стандартом ANSI-92 и содержат зарезервированное слово JOIN. Внутренние соединения (или просто соединения) могут записываться как без использования этого слова (стандарт ANSI-89), так и с использованием слова JOIN (стандарт ANSI-92). При использовании стандарта ANSI 92 условия соединения записываются в предложении FROM по формату:

FROM имя_таблицы_1 {INNER|LEFT|RIGHT}

JOIN имя_таблицы_2

ON условие_соединения

При формировании запроса придерживаются следующих правил:

– слева и справа от зарезервированного слова JOIN указывают соединяемые таблицы;_

– после слова ON записывают условия соединения;

– условия поиска, основанные на правой таблице, помещают в предложение ON;

– условия поиска, основанные на левой таблице, помещают в предложение WHERE.

Характерные черты операции соединения:

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

– соединяемые поля могут (но не обязаны!) присутствовать в списке выбираемых полей;

– разрешено использовать множественные условия соединения;

– условие соединения может комбинироваться с другими предикатами.

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

Если названия полей таблиц совпадают, то псевдонимы позволяют корректно сформулировать запрос. Назначение псевдонима обязательно при выполнении соединения таблицы самой с собой. Применение псевдонимов позволяет упростить и сократить запись запроса. Псевдонимы представляют собой любой допустимый идентификатор, написание которого подчиняется тем же правилам, что и написание имён таблиц. Внутреннее соединение возвращает только те строки, для которых условие соединения принимает значение true. Выполнение соединений рассмотрим на таблицах customer.db, employee.db, orders.db, items.db, parts.db и vendors. db, имеющихся в демонстрационной базе данных DBDemos.

Заказчики оформляют заказ на приобретение оборудования. Сведения о заказчиках приведены в таблице customer. Сведения о заказах заносятся в таблицу orders. Данные о сотрудниках, оформляющих заказы, хранятся в таблице employee. Часто при получении информации из БД приходится извлекать данные из нескольких таблиц. Задача решается путём соединения двух, трёх и более таблиц так, чтобы результирующий набор данных содержал информацию из всех соединяемых таблиц.

Лабораторная работа №35

Тема: Создание отчетов

Генераторы ReportSmith и Rave Reports представляют собой отдельные приложения, при помощи которых можно создавать отчеты, в то время, как QuickReports - это набор VCL-компонентов, которые помещают непосредственно на стандартную форму Delphi.

В простейшем случае работа с QuickReport выглядит следующим образом: создается новая форма, на которую помещают компонент QuickRep. Затем при помощи составного свойства Bands определяют, какие основные составные части отчета требуются:

  • HasColumnHeader - заголовки столбцов;

  • HasDetail - сами столбцы (собственно данные);

  • HasPageFooter - нижний колонтитул страницы;

  • HasPageHeader - верхний колонтитул страницы;

  • HasSummary - итоговое значение по столбцам данных;

  • HasTitle - общий заголовок отчета.

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

Рассмотрим простейшее приложение, использующее отчет. Для этого создадим новый проект в Delphi (если у вас Delphi 7, то сначала подключите QuickReport, как описано в примечании, если же у вас более новая версия - то можете пропустить этот текст и сразу перейти к следующему параграфу). Затем на главную форму поместите 3 кнопки - "Просмотр", "Печать" и "Выход", а в заголовке окна (Caption) напишите "QuickReport demo" (рис. 22.1).

Рис. 22.1. Приложение QuickReport demo

Теперь создадим новую форму, поместим на нее компонент Table, установим свойство DatabaseName в DATA1, а для TableName выберем Customer, после чего установим свойство Active в истину. Таким образом, мы подготовили данные для вывода. Теперь поместим на форму компонент QuickRep, который визуально предствляет собой лист отчета и установим в свойстве Bands флаги HasColumnHeader, HasDetail, HasPageFooter и HasTitle. В результате на "листе" появятся 4 области, представляющие собой соответствующие логические части отчета. Теперь в центре самой верхней области - Title - поместим компонент QRLabel. Это аналог стандартной подписи (Label), предназначенный специально для отчетов QuickReport. В свойстве Caption напишем "Клиенты", после чего можно увеличить размер шрифта, сделать его полужирным или выбрать другую гарнитуру, чтобы заголовок не "затерялся".

Следующим этапом будет собственно подготовка к выводу данных отчета. Поскольку мы выбрали таблицу клиентов, то выводить будем 2 колонки - номер клиента в базе (поле CUST_ID) и иго имя (CUST_NAME). Для этого сначала на области заголовков столбцов (Column Header) разместим еще 2 надписи, воспользовавшись QRLabel, в свойстве Caption которых напишем "№" и "Имя". В следующей области, Detail, непосредственно под этими надписями, поместим 2 компонента QRDBText. Эти компоненты, в свою очередь, можно назвать аналогами компонент DBText, предназначенных для вывода данных из БД в строковом формате. Свойство DataSet компонентов QRDBText следует установить в Table1, а DataField - в CUST_ID у одного и в CUST_NAME - у другого. Здесь надо отметить, что компоненты, помещенные в области Detail, при печати будут повторяться построчно столько раз, сколько требуется для вывода всех данных из указанного источника. Но следует учитывать, что и у компонентов, используемых для вывода полей, и у основы отчета - компонента QuickRep, должен использоваться один и тот же источник данных. В данном случае это Table1.

Последнее, что остается - это определить содержимое нижнего колонтитула. Для этого в области Page Footer поместим компонент QRSysData. Прямого аналога в VCL у этого компонента нет, можно назвать его "продвинутой" версией текстовой подписи, которая может менять свое содержимое в зависимости от состояния отчета. За тип выводимой информации отвечает свойство Data, которое может принимать одно из следующих значений: qrsDare, qrsDateTime, qrsDetailCount, qrsDetailNo, qrsPageNumber, qrsReportTitle и qrsTime. Соответственно, будет выводиться текущая дата, дата и время, количество записей на странице, номер последней записи на странице, номер страницы, название отчета, или текущее время. Поскольку записей в таблице у нас весьма немного, то остановимся на втором варианте - выводе даты и времени составления отчета. Впрочем, при необходимости всегда можно использовать несколько таких компонентов, чтобы вывести всю необходимую информацию.

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

Рис. 22.2. Форма Delphi с отчетом QuickReport

Теперь остается написать код для обращения к этому отчету. Для этого вернемся к первой (главной) форме приложения, в начале секции implementation подключим форму с запросом при помощи ключевого слова uses и создадим обработчики событий для кнопок, как показано в листинге 22.1.

Листинг 22.1. Исходный код приложения QuickReport demo

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, QRCtrls, QuickRpt, ExtCtrls, DB, DBTables; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation uses unit2; {$R *.dfm} procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); begin Form2.QuickRep1.Preview; end; procedure TForm1.Button2Click(Sender: TObject); begin Form2.QuickRep1.Print; end; end.

Как видно из кода, вся программная работа заключается в вызове метода Preview для просмотра отчета и метода Print для вывода на печать. С исходным кодом так же можно ознакомится в каталоге Demo\Part4\QReport.

Лабораторная работа №36.

Тема: Работа с удалёнными БД.

Цель: Ознакомить с основными операторами и их использование в программе.

Разработать в Delphi приложение для просмотра объектов ба-

зы данных MS Access, используя механизм ADO.

Последовательность действий

1. Откроем Delphi, создадим приложение и разместим на форме три ком-

понента:

ADOTable с закладки ADO;

DataSource с закладки Data Access;

BDGrid с закладки Data Controls.

2. Свяжем компоненты между собой:

– установим значение свойства DataSource компонента DBGrid1 в

DataSource1;

– в свойстве DataSet компонента DataSource1 укажем ADOTable1.

3. Зададим параметры соединения компонента ADOTable1:

– в свойстве ConnectionString нажмём кнопку с многоточием, в ок-

не редактора параметров соединения установим переключатель в по-

ложение Use Connection String и нажмём кнопку Build;

Окно задания свойства ConnectionString

– в появившемся окне на вкладке Поставщик данных выберем свой-

ство Microsoft Jet 4.0 OLE DB Provider;

– перейдём на вкладку Подключение, укажем путь к БД, введём имя

пользователя и при необходимости зададим пароль;

– нажмём кнопку Проверить подключение;

– после завершения проверки подключения перейдём на вкладку До-

полнительно и поставим галочки напротив свойств ReadWrite, Share

Deny None;

– выберем вкладку Все и проверим сделанные установки. При необхо-

димости изменить значение выберем нужную строчку, нажмём кноп-

ку Изменить значение, в появившемся окне выберем значение и на-

жмём ОК;

– нажмём два раза ОК;

– в свойстве TableName компонента ADOTаble1 укажем нужную таб-

лицу;

– в свойстве Active установим значение true.

Если всё сделано правильно, то после задания таблицы компонент

DBGrid1 заполнится данными (рис. 51).

При создании проекта в Delphi 2006 всё выполняется аналогично. Надо

только учесть некоторые различия в интерфейсе:

1) компоненты для доступа к данным по технологии ADO находятся в

разделе dbGo;

2) свойства в Инспекторе объектов объединены в группы по смыслу

(раньше располагались по алфавиту).

Выбор OLE DB-провайдера

Задание источника данных

Приложение для просмотра таблицы базы данных Access

Контрольные вопросы

1. Как организовать доступ к данным по технологии OLE DB, если для нуж-

ной СУБД нет OLE DB-драйвера, но есть ODBC-драйвер?

2. Приведите схему доступа к данным с применением ADO.

3. Почему активно используется доступ к данным с использованием ADO?

4. Какие объекты используются в технологии ADO?

5. Какие компоненты Delphi используются для организации доступа к данным

по технологии ADO?

6. Как задаются параметры соединения при разработке в Delphi приложения,

использующего технологию ADO?

Лабораторная работа №37.

Тема: Работа с удалёнными БД.

Цель: Ознакомить с основными операторами и их использование в программе.

Цели занятия.

Образовательные: изучить современную технологию создания приложения путем применения компонентов среды Delphi; изучить технологию ADO, обеспечивающую соединение с базой данных Microsoft Access; научить проектировать приложение и обеспечить доступ к БД MS Access “Детская поликлиника”.

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

Воспитательные: способствовать формированию таких качеств личности, как ответственное отношение к порученному делу; внимательность, способность к самовыражению.

Оборудование: персональный компьютер, рекомендации по практической работе, электронный учебник по Delphi7 для начинающих.

ПО: Microsoft Access, Borland Delphi7, готовая рабочая база данных “Детская поликлиника”.

Задание

Задание: Создать проект в Borland Delphi 7 и обеспечить доступ к ранее созданной БД Microsoft Access “Детская поликлиника”, используя компоненты среды Delphi, получить информацию из базы данных и представить ее в форме таблицы.

В Microsoft Access создана база данных “Детская поликлиника” и наполнена информацией (приложение).

Информационная система “Детская поликлиника” хранит информацию о врачах, пациентах, заболеваниях, детских учреждениях и предоставляет следующие данные:

информацию о враче (фамилия, специализация, стаж, оклад, совместительство);

данные о больном (фамилия, возраст, адрес, детское учреждение, место работы родителей, хронические заболевания, прививки, последнее обращение к врачу);

данные о детском учреждении (наименование, адрес, количество детей, наличие карантина, выявленные инфекционные заболевания, дата последнего профилактического обследования).

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

Среда разработки проекта в Delphi

Delphi – это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi – строго типизированный объектно-ориентированный язык, в основе которого лежит Object Pascal. Интегрированная среда позволяет создавать, компилировать, тестировать и редактировать проект в единой среде программирования [4].

Работа над новым проектом, так в Delphi называется разрабатываемое приложение, начинается с создания стартовой формы.

Форма (Form) – основа разработки в нее помещают необходимые компоненты, создают интерфейс программы. Свойства формы определяют ее внешний вид: размер, положение на экране, текст заголовка, др.

Для просмотра и изменения значений свойств формы и ее компонентов используется окно Object Inspector (Инспектор Объектов). В верхней части окна Object Inspector указано имя объекта, значения свойств которого отображается в данный момент. В левой колонке вкладки Properties (Свойства) перечислены свойства объекта, а в правой – указаны их значения (рис.1). Инспектор Объектов является дизайнером формы.

Исходный текст модуля разработки содержится в Окне редактора и имеет первоначальный заголовок Unit1.pas (рис.1). Проводник кода отображает объекты модуля формы (*pas), что позволяет быстро обращаться к объектам и создавать новые классы.

Рис. 1. Основные элементы среды разработки в Delphi

Файл модуля формы Unit1.pas (рис.1) содержит описание класса формы (размещение, поведение компонентов и функционирование обработчиков событий) и создается автоматически.

Любой проект имеет не менее шести файлов (табл.1).

Таблица 1

Основные файлы проекта

Файл

Назначение

Главный файл проекта (код проекта) – PROGECT.DPR Основной, представляет собой программу на языке Pascal.

Первый модуль программы (модуль формы) UNIT.PAS Автоматически появляется вначале работы его можно назвать любым другим именем. Содержит текст программы на языке Pascal.

Файл главной формы (описания формы) – UNIT.DFM Используется для сохранения информации о внешнем виде главной формы.

Файл описание ресурсов – PROGECT.RES Содержит иконку для проекта, создается автоматически.

Файл параметры проекта – PROGECT.OPT Текстовый файл для сохранения установок, связанных с данным проектом.

Модули - *.PAS Дополнительные Модули. Содержат текст программы на языке Pascal.

Разработка приложения состоит из двух этапов:

1. Создание интерфейса приложения.

2. Определение функциональности приложения.

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

Для обеспечения функциональности приложения необходимо задать в Инспекторе Объектов значения свойств и процедур объектов событий, написать программный код обработки событий.

Установить измененные параметры проекта необходимо с помощью команды меню Project/Построить Project. Если требуется объединить несколько форм под единое начало – выполнить команду Project/Options.

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

- готовый к выполнению файл (*exe),

- динамически загружаемая библиотека (*DLL).

Запускать проект можно из среды Delphi командой Run/Run (Выполнить), из среды Windows (Название приложения.exe).

Создание приложения для работ с БД Access

Работа над новым проектом, так в Delphi называется разрабатываемое приложение, начинается с создания стартовой формы.

Создание закладок в конструкторе форм.

1. В Инспекторе Объектов изменить параметры некоторых свойств: Align —> alClient, color—>clMoneyGreen, caption—>Детская поликлиника, font, name—>Form (рис.1).

2. Создать закладки в конструкторе форм при помощи компонентаPageControl на вкладке Win32 (таб.2) (Win32—>PageControl).

3. В окне Дерево Объектов создать Страницу (Контекстное меню—>Новая страница). В Инспекторе Объектов изменить параметры названия (Сaption—>Больной) (рис.2).

Рис. 2. Создание закладок в конструкторе форм

4. Аналогичным способом создать закладки, названия которых соответствуют названию таблиц в схеме данных БД MS Access (рис.7).

5. Поместить на форму компонентADOConnection (вкладка ADO> ADOConnection) и выполнить его настройку (табл.2; рис.3).

Значения свойств компонента ADOConnectionСвойство Примечание

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

Вкладка Win32 Содержит интерфейсные элементы для 32 разрядных операционных систем Windows 2000.

LoginPromt False

ConnectionString Сделать щелчок на кнопке с тремя точками (находится в поле значения свойств). Сделать щелчок на кнопке Build.

На вкладке поставщик данных выбрать Microsoft Jet 4.0 OLEDB Provider.

На вкладке Подключение указать файл базы данных “Детская поликлиника”.

Дополнительно указать Права доступа: ReadWtite.

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

Рис.3. Настройка ADOConnection в параметрах Инспектора Объектов

6. Поместить на форму компонентADOTable(ADODB) (Вкладка ADO—>ADOTable ) и выполнить его настройку (табл.3; рис.3).

Значения свойств компонента ADOTable(ADODB)Свойство Значение Примечание

Connection Имя компонента ADOConnection, обеспечи-вающего соединение с БД Раскрыть список, находящийся в поле значения свойства, и выбрать имя компонента

TableName Команда, обеспечивающая получение информации из определенной таблицы БД Раскрыть список, находящийся в поле значения свойства, и выбрать название нужной таблицы

Active True

Технология ADO Это синхронное/асинхронное выполнение операций с хранилищем данных. При помощи свойства connectoptions можно задать режим соединения с хранилищем данных

TADODataSet TADOCoommand Общие компоненты для работы с технологией ADO, позволяют выполнять команды на языке провайдера данных.

DataSource Object Хранилище данных.

7. Поместить на форму компонентDataSource (вкладка Data Access —> DataSource) и выполнить его настройку (табл. 4; рис.3)

Значения свойств компонента DataSourceСвойство Значение Примечание

Connection Имя компонента ADODataSet Раскрыть список, находящийся в поле значения свойства, и выбрать имя компонента

DataSource Object Хранилище данных.

8. Поместить на форму компонентDBGrid (вкладка Data Controls—>DBGrid) и выполнить его настройку (табл.5; рис.3)

Значения свойств компонента DBGrid, Edit, ButtonСвойство Значение Примечание

DataSource Имя компонен-та DataSource Раскрыть список, находящийся в поле значения свойства, и выбрать имя компонента

Align alClient

DBGrid Компонент предназначен для визуализации данных, их ввода и редактирования.

Edit Строка ввода. Предназначена для ввода, отображения или редактирования одной текстовой строки.

Button Командная кнопка. Обработчик события OnClick этого компонента обычно используется для реализации некоторой команды.

9. Аналогично создать другие графы таблицы (проекта “Детская поликлиника”). На рисунке 4 представлен результат правильно выполненных действий задания.

10. В графе “Зафиксированные инфек.заболевания” выполним запрос по датам обследования.

Для этого добавить компонентADOQuery(ADODB). Значения данного компонента соответствуют значениям свойств компонента ADOTable(ADODB). В параметрах Инспектора Объектов введем SQL – команду:

ADOQuery1.Clear := True;

ADOQuery1.Add('SELECT DU.DU, DU_Adres.DU, DU.Inf_Zab, DU.Data_obs');

ADOQuery1.Add('FROM DU');

ADOQuery1.Add('WHERE ((DU.Data_Obs) BETWEEN (DateValue(''' + Edit1.Text + ''')) AND (DateValue(''' + Edit2.Text + ''')) );');

ADOQuery1.Active := True;

11. Поместить на форму компонент Edit1 и Edit2. В параметрах этих компонентов укажем дату по умолчанию: Edit1—>Text—>01.01.2009; Edit2—>Text—>31.12.2009.

12. Поместить на форму компонент Button (рис.5).

13. Создать процедуру обработки события Click, обеспечивающую выполнение SQL – команды.Процедура обработки события Click на кнопке “Обновить запрос” (Button1):

procedure TF.OtClick(Sender: TObject);

var

sqlfile: TextFile;

i: Integer;

begin

ADOQuery1.SQL.Clear;

ADOQuery1.SQL.Add('SELECT DU.DU, DU.Adres_DU, DU.Inf_Zab, DU.Data_obs');

ADOQuery1.SQL.Add('FROM DU');

ADOQuery1.SQL.Add('WHERE ((DU.Data_Obs) BETWEEN (DateValue(''' + Edit1.Text +''')) AND (DateValue(''' + Edit2.Text + ''')));');

ADOQuery1.Active := True;

AssignFile(sqlfile,'sql_instructions.txt');

Rewrite(sqlfile);

for i := 0 to ADOQuery1.SQL.Count-1 do Writeln(sqlfile, ADOQuery1.SQL.Strings[i]);

CloseFile(sqlfile);

end;

Рис.5. Окно конструктора формы. Закладка “Зафиксированные инфекционные заболевания

14. Последний этап. Создание исполняемый файл – приложение Project1.exe при помощи процесса компиляции (Project/Compile<Project1>). Компилятор генерирует исполняемую программу как консольное приложение. Пример работы программы, т.е. вид окна программы после выполнения представлен на рис.6.

Рис.6. Исполняемый файл – приложение Project1.exe

Лабораторная работа №38.

Тема: Управление базой данных.

Цель: Ознакомить с основными операторами и их использование в программе.