Лабораторная работа «Навигационный способ доступа к базе данных»

advertisement
1
Лабораторная работа
«Навигационный способ доступа к базе данных»
Цель работы: освоить навыки навигационного способа доступа к
базе данных.
Основные сведения, необходимые для выполнения работы
Достоинство навигационного способа к базе данных – простота
кодирований операций с набором данных. Его основной недостаток
состоит в том, что если требуется обработать только одну запись, все равно
приложение получает все записи набора данных [1]. Поэтому применение
навигационного способа доступа обычно ограничивается локальными БД.
При навигационном способе доступа операции выполняются с отдельными
записями. Каждый набор данных имеет невидимый указатель текущей
записи. Этот указатель определяет запись, поля которой можно
редактировать и удалять. Компонент Table позволяет управлять
положением указателя текущей записи [2].
При использовании навигационного способа доступа к набору
данных возможны следующие операции:
o Сортировка записей
o Перемещение по набору данных
o Редактирование записей
o Вставка и удаление записей
o Фильтрация записей
Сортировка набора данных [3]
Порядок расположения записей в наборе данных может быть
неопределенным. По умолчанию записи не отсортированы или
сортируются, например, для таблиц Paradox по ключевым полям. Для
удобной работы с набором данных его записи можно отсортировать.
Сортировка – это упорядочивание записей по определенному полю в
порядке возрастания или убывания значений, содержащихся в данном поле.
Сортировка наборов данных Table выполняется автоматически по
текущему индексу. При смене индекса происходит автоматическое
переупорядочивание записей. Т.о., сортировка возможна по полям, для
которых создан индекс.
Направление сортировки определяет признак ixDescending текущего
индекса. По умолчанию он выключен. Если для индекса установлен
признак ixDescending, то сортировка выполняется в порядке убывания [2]
(но на практике не выполняется).
Задать индекс, по которому будут сортироваться записи, можно с
помощью значений свойства IndexName или IndexFieldNames. В качестве
2
значений свойства IndexName указывается имя индекса, которое
определяется при создании таблицы. При использовании свойства
IndexFieldNames указываются имена полей, образующих соответствующий
индекс.
В связи с тем, что главный индекс (ключ) для таблиц Paradox не имеет
имени, выполнить сортировку по этому индексу можно только с помощью
свойства IndexFieldNames.
Перемещение по набору данных
Перемещение по набору данных заключается в управлении указателем
текущей записи (курсором). Этот указатель определяет запись, с которой
будут выполняться такие операции, как редактирование или удаление.
Перемещение по записям
Перед перемещением указателя текущей записи набор данных
автоматически переводится в режим просмотра. Если текущая запись
находилась в режиме редактировании или вставки, то перед перемещением
указателя сделанные в записи изменения вступают в силу. Для этого
автоматически вызывается метод CheckBrowseMode набора данных [4].
Для перемещения указателя текущей записи в наборе данных
используются:
o Процедура First – первая запись
o Процедура Next – следующая запись (при вызове метода Next для
последней записи указатель не перемещается)
o Процедура Last – последняя запись
o Процедура Prior – предыдущая запись (при вызове метода Prior
для первой записи указатель не перемещается)
o Функция MoveBy (Distance : Integer): Integer – перемещает
указатель на число записей, определяемое параметром Distance.
Если его значение больше нуля, то происходит перемещение
вперед, если меньше – назад. При нулевом значении параметра
указатель не перемещается. Если параметр предписывает
перемещение на запись с номером, большим чем номер последней
записи набора данных, то при указатель перемещается на
последнюю запись. Аналогичным образом, при попытке
перемещения на запись с номером, меньшим единицы, указатель
перемещается на первую запись. В качестве результата
возвращается число записей, на которое переместился указатель.
При перемещении указателя текущей записи учитываются ограничения и
фильтр, определенные для набора данных. Таким образом, перемещение
3
выполняется по записям набора данных, которые он содержит в текущий
момент времени. Число записей определяется свойством RecordCount.
Фильтрация записей [3,4]
Фильтрация – это ввод ограничений для записей, которые должны
войти в набор данных. Delphi предоставляет возможность выполнения двух
следующих вариантов фильтрации записей набора данных:
 По выражению
 По диапазону
По умолчанию фильтрация записей не ведется, и набор данных Table
содержит все записи связанной с ним таблицы БД.
Фильтрация по выражению
При использовании фильтрации по выражению набор данных
ограничивается записями, удовлетворяющими фильтру, задающему
условия отбора записей. Достоинство фильтрации по выражению состоит в
том, что она применима к любым полям, в том числе и
неиндексированным. Поскольку в процессе отбора просматриваются все
записи таблицы, фильтрация по выражению эффективна при небольшом
количестве записей.
Для определения выражения фильтра используется свойство Filter
типа String. Выражение фильтра представляют собой конструкцию, в
состав которой могут входить следующие элементы:
 Имена полей таблиц
 Литералы
 Операции сравнения
 Арифметические операции
 Логические операции
 Круглые и квадратные скобки
Если имя поля содержит пробелы, то его заключают в квадратные
скобки, в противном случае квадратные скобки необязательны.
Литерал представляет собой значение, заданное явно (например,
число, строка или символ). Имена переменных в выражении фильтра
использовать нельзя. Если в выражение фильтра требуется включить
значение переменной или свойства какого-либо компонента, тогда это
значение должно быть преобразовано в строковый тип.
Операции сравнения представляют собой обычные для языка
Pascal отношения <, >, =, <=, >= и <>.
Арифметическими являются операции +, -, * и /.
В качестве логических операций можно использовать AND, OR, и
NOT.
4
Для активации и деактивации фильтра используется свойство
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.
Поиск записей
Поиск записи, удовлетворяющей определенным условиям,
означает переход на данную запись. Поиск во многом похож на
5
фильтрацию, в процессе поиска также выполняется проверка полей
записей. Отличие заключается в том, что в результате поиска количество
записей набора данных не изменяется, а осуществляется переход на
найденную запись.
При организации поиска записей важное значение имеет наличие
индекса для полей, по которым ведется поиск. При использовании
индексов значительно повышается скорость обработки данных. Кроме
того, ряд методов может работать только с индексированными полями.
Поиск в наборах данных [2,3]
Для поиска записей по полям в Delphi служат методы Locate и
Lookup. Поля могут быть не индексированы.
Функция Locate (const KeyFields: String; Const KeyValue: Variant;
Options: TLocateOptions): Boolean ищет записи, содержащие заданные поля.
Если записи, удовлетворяющие условиям поиска, существуют, то указатель
текущей записи устанавливается на первую из них. Когда запись найдена,
функция возвращает значение True, в противном случае – False. Список
полей, по которым ведется поиск, задается параметром KeyFields, поля
разделяются точкой с запятой. Параметр KeyValue указывает значение
полей для поиска. Если поиск ведется по одному полю, то параметр имеет
тип Variant и содержит одно значение, соответствующее типу поля.
Параметр Options позволяет задать значения, которое обычно
используются при поиске строк. Этот параметр принадлежит к
множественному типу TLocateOptions и может принимать комбинации
следующих значений:
 loCaseInsensitive – регистр букв не учитывается
 loPartialKey – допускается частичное совпадение значений
Функция Lookup (const KeyFields: String; const:KeyValues: Variant;
const ResultFields: String): Variant осуществляет поиск записи и считывает
информацию из полей записи. Значения в полях записи (с учетом регистра)
должны точно соответствовать значениям, заданным для поиска.
Параметры KeyFields и KeyValues имеют такое же значение, как и в методе
KeyValues, и используются аналогичным образом при поиске по одному
или нескольким полям. Для параметра ResultFields через запятую
перечисляются названия полей, значения которых будут получены в случае
успешного поиска. Значения полей считываются из первой найденной
записи, удовлетворяющей условиям поиска. Перед использованием
результирующие значения следует самостоятельно преобразовать к
требуемому типу. Для работы с массивом Variant, число элементов
которого заранее не известно, можно использовать следующие функции:
6

VarIsArray (const V: Variant):Boolean – проверяет, является
ли параметр V массивом типа Variant

VarArrayLowBound (const A :Variant; Dim:Integer) :Integer
– возвращает нижнюю границы массива A. Параметр Dim
определяет размерность массива

VarArrayHighBound (const A:Variant; Dim: Integer): Integer
– возвращает верхнюю границу массива A. Параметр Dim
определяет размерность массива
При неудачном поиске метод Lookup возвращает значение Null.
Для анализа такого результата можно использовать функцию VarIsNull
(const V:Variant): Boolean, возвращающую значение True при значении
параметраV, равном Null.
Поиск по индексным полям
Для набора данных Table существуют методы, позволяющие вести
поиск записей только по индексным полям. Перед вызовом любого из них
следует установить в качестве текущего индекс, построенные по полям,
используемым для поиска. Методы поиска можно разделить на две группы.
В первую из них входят методы FindKey, SetKey, GotoKey,
предназначенные для поиска на точное соответствие, а в другую FindNearest SetNearest GotoNearest, допускающие частичное совпадение
заданных для поиска значений и значений полей записей.
Метод FindKey (const KeyValues: array of const) :Boolean выполняет
поиск в наборе данных Table той записи, значения полей которой совпадает
со значениями, указанными параметром KeyValues. Список полей для
поиска не задается, а используются индексные поля в соответствии с
текущим индексом. Если поиск завершился успешно, то найденная запись
становится текущей, а метод возвращает значение True.
Вместо метода FindKey можно использовать методы SetKey,
EditKey, GotoKey, котрые применяются совместно.
Метод FindNerarest производит поиск значений полей записей
набора данных Table, которые частично совпадают со значениями,
заданными для поиска. Вместо метода можно использовать комбинацию
методов SetNearest, EditNearest, GotoNearest, работа с которыми
аналогична работе с соответствующими методами поиска, требующими
точного соответствия значений полей и значений, заданными для поиска.
Редактирование записей [3]
Редактирование записей состоит в изменении значений их полей.
Отредактирована может быть только текущая запись, поэтому перед
действиями, связанными с редактированием, обычно выполняются
7
операции по поиску и перемещению на требуемую запись. После того как
указатель текущей записи установлен на нужную запись, и набор данных
находится в режиме просмотра, для редактирования записи следует:
1. Перевести набор данных в режим редактирования
2. Изменить значения полей записи
3. Подтвердить сделанные изменения или отказаться от них, в
результате чего набор данных снова переходит в режим просмотра
Набор данных переводится в режим редактирования с помощью вызова
метода Edit. При этом возможны следующие варианты:
o Если
набор
данных
немодифицируемый,
возбуждается
исключительная ситуация
o Если набор данных уже находился в режиме редактирования или
вставки, то никаких действий не происходит
o Если набор данных пуст, то он переходит в режим вставки
Если набор данных является модифицируемым, и исключительная
ситуация не возбуждается, то при выполнении метода Edit выполняются
следующие действия:
o Для набора данных вызывается обработчик события BeforeEdit
типа TDataSetNotifyEvent
o Для набора данных считывается текущая запись
o Если в записи есть вычисляемые поля, то они пересчитываются
o Набор данных переходит в режим редактирования
o Для связанного с набором данных источника данных DateSource
вызывается обработчик события OnDateChange
o Для набора данных вызывается обработчик события AfterEdit типа
TDataSetNotifyEvent
Перечисленные действия выполняются после проверки, является ли набор
данных модифицируемым, поэтому перед вызовом метода следует
проанализировать значение свойства: можно ли редактировать записи.
8
Задание
Написать программу, которая создает таблицу, осуществляет
перемещение по набору данных с помощью кнопок, имитирующих работу
навигатора, осуществляет поиск и фильтрацию данных.
Порядок работы:
1.
2.
3.
4.
Расположить на форме следующие элементы: BitBtn1, BitBtn2,
BitBtn3, BitBtn4, BitBtn5, DataSource1, Table1, DBGrid1, Edit1, Edit2,
RadioGroup1,
Label1,
Label2,
btnFirst,
btnPrior,
btnNext,
btnLast,btnEdit, btnDeletet, btnInsert, btnCancel, btnPost (9 кнопок
TBitBtn).
Для меток Label1 и Label2 установить свойство Caption «Введите
фамилию» и «Выражение фильтра» соответственно.
Для кнопок BitBtn1, BitBtn2, BitBtn3 установить свойство Kind на
значение Ok, для кнопки BitBtn4 установить свойство Kind на
значение All, для кнопки BitBtn5 установить свойство Kind на
значение Close. Свойство Caption задать всем кнопкам в
соответствии с рисунком 1 («Найти», «Отсортировать», «Все
записи», «Отфильтровать», «Закрыть приложение»).
Для RadioGroup1 свойство Caption установить на значение «Вид
сортировки». Установить значения Items. Для этого выбрать в
Инспекторе Объектов данное свойство. Откроется окно,
представленное на рис.1. Записать в открывшемся окне следующие
значения:
o По фамилии
o По дате рождения
o Отсутствует
9
Рис.1 Задание списка значений для компонента RadioGroup
Связать между собой набор данных Table1, DataSource1 и DBGrid1,
установив соответствующие свойства компонентов.
6.
Для 9 кнопок, имитирующих работу навигатора, задать свойство
Glyph (выбрав соответствующий выполняемому действию рисунок
из папки (…\Common Files\Borland Shared\Images\Button), задать
каждой кнопке свойство Hint (подсказку), свойству ShowHint
выбрать значение True, для экономии места на форме, свойство
Caption предлагается оставить пустым.
Внешний вид приложения на этапе конструирования представлен на рис.2.
5.
10
Рис. 2 Внешний вид приложения на этапе конструирования
Написать обработчик события «Создание Формы» FormCreate, в
котором создается таблица People, если такой не существует, и
устанавливается для нее свойство фильтра FilterOptions на значение
[foCaseInsensitive].
Таблица People состоит из пяти полей, значения для всех полей
обязательны:

№ типа AutoInc

FIO, Post типа String

Salary типа Float

BirthDay типа Date
Первичный ключ для таблицы образован по полю «№». Поля «FIO» и
«BirthDay» являются индексированными, со свойствами [ixUnique] и
[ixCaseInsensitive] и именами, например, 'indName' и 'indDate'.
8.
Написать обработчики событий «Нажатие на кнопку».
a) Действия 9 кнопок btnFirst, btnPrior, btnNext, btnLast ,btnEdit,
btnDeletet, btnInsert, btnCancel, btnPost соответствуют их
названиям и осуществляют перемещение по набору данных.
Если текущая запись установлена на первой строке, то кнопки
7.
11
btnFirst и btnPrior становятся неактивными, аналогично для
последней записи неактивными становятся кнопки , btnNext,
btnLast. При нажатии на кнопки btnDeletet, btnInsert сначала
выдается диалоговое окно на подтверждение выполнения
соответствующего действия. При нажатии на кнопку btnPost
выполняется проверка состояния, в котором находится таблица.
Подтверждение изменений в текущей записи осуществляется,
если таблица находится в состоянии вставки или редактировании
записи (if Table1.State in [dsEdit,dsInsert] then Table1.Post).
b) Нажатие на кнопку «Найти». Поиск по полю «FIO» предлагается
осуществлять с помощью функции Locate. В качестве параметра
поиска используется текст, введенный в редактор Edit1.
c) Нажатие на кнопку «Отсортировать». Текущий индекс таблицы
(или имя индексного поля) выбирается в зависимости от
положения
переключателя
RadioGroup1.
Например,
Table1.IndexName := 'indName' (или Table1.IndexFieldNames :=
'FIO')
d) Нажатие на кнопку «Отфильтровать». Значению свойства
Filtered присваивается значение True, выражение фильтра
задается в редакторе Edit2.
e) После нажатия на кнопку «Все записи» в сетке отображаются все
записи таблицы, для чего фильтр отключается.
f) После нажатия на кнопку «Закрыть приложение» закрывается
набор данных.
Пример работы приложения
1.
2.
3.
Нахождение нужной записи. Рис.3 иллюстрирует работу
программы при нажатии на кнопку «Найти». Параметры фильтра
установлены на частичное совпадение, поэтому запись найдена
уже при введенных нескольких буквах
Сортировка. Выбирая соответствующее значение «Сортировки»
при нажатии на кнопку «Отсортировать», значения в таблице
сортируются. Пример сортировки по дате рождения показан на
рис.4.
Фильтрация. Пример фильтрации
показан на рисунке 5.
(Фильтрация не выполняется для полей, названных русскими
буквами).
12
Рис. 3 Пример нахождения записи
Рис.4 Пример сортировки
13
Рис.5 Пример фильтрации
14
Список литературы
1.
2.
3.
4.
Delphi 4. Учебный курс./Фаронов В.В. М.:Ноулидж, 1998.-464 с.,
ил.
Программирование в Delphi 4./ П. Дарахвелидзе, Е. Марков
СПб.:БХВ-Санкт-Петербург, 1999.-864 с.,ил.
Delphi 5./Гофман В.Э, Хомоненко А.Д. СПб.:БХВ-СанктПетербург, 1999.-800 с.,ил.
Delphi 6 для профессионалов. / Марко Кэнту – СПб.:Питер,2002.1088 с.:ил.
Download