
- •Лабораторная работа №1 Тема: Анализ предметной области задачи. Проектирование структуры базы данных
- •Постановка задачи
- •Лабораторная работа №2 Тема: Создание таблиц бд инструментальным способом
- •Задания:
- •Лабораторная работа №5 Тема: Определение отношений между таблицами
- •Задание:
- •Лабораторная работа №6 Тема: Создание таблиц бд реляционным способом
- •Задание:
- •Лабораторная работа №7 Тема: Навигация нд. Модификация нд
- •Задание:
- •Лабораторная работа №9 Тема: Поиск записей
- •Лабораторная работа №10 Тема: Запросы
- •Задание:
- •Лабораторная работа №11 Тема: Запросы с параметром. Динамический запрос
- •Задание:
- •Лабораторная работа №12 Тема: Простой отчет (Rave Report, qReport)
- •Задание:
- •Создание простейшего отчёта с помощью qReport
- •Лабораторная работа №13 Тема: Отчет с группировкой. Отчет со связанными таблицами
- •Задание:
- •Создание отчёта с группировкой (qReport)
- •Создание отчёта с группировкой (Rave Report)
- •Создание отчёта для связных нд (qReport)
- •Лабораторная работа №14 Тема: Экспорт и импорт данных в Word, Excel
- •Задание:
- •Экспорт в ms excel
- •Экспорт в ms Word
- •Лабораторная работа №15 Тема: Экспорт и импорт данных в Calc, Writer
Лабораторная работа №9 Тема: Поиск записей
Цель: Изучить методы поиска записей НД.
Задание:
Изучить методы поиска записей НД.
Выполнить поиск записей НД различными способами для приложений с базами данных Paradox и MS Access.
Одной из важнейших функций любой Информационной Системы является поиск данных в большом массиве информации, которой и является База Данных. Поиск представляет собой переход к записи на основании заданного условия. Поиск в чем-то похож на фильтрацию, но его главной особенностью является переход только к одной, самой первой записи, удовлетворяющей заданному условию. Эта особенность также является и его недостатком.
Для поиска в Базе Данных служат несколько методов. Для поиска данных по неиндексированным полям Базы Данных служат два метода Locate и LookUp. Для использования этих методов нужно указать поле, по которому будет произведен поиск данных, значение условия поиска и список возможных параметров. Здесь также существует возможность поиска сразу по нескольким полям. Для этого нужно перечислить поля через точку с запятой.
В качестве параметров служат следующие параметры:
loCaseInsensitive - Регистр букв не учитывается.
loPartialKey - Допускается частичное совпадение значения поиска.
Существует возможность указать сразу все эти параметры для поиска, либо вообще не указывать их. Если в качестве параметра указать параметр loPartialKey, то автоматически будет добавлен и параметр loCaseInsensitive.
Иногда требуется найти определенную запись на основании нескольких условия для поиска, то есть сразу по нескольким полям. Для этого нужно воспользоваться функцией VarArrayOf. Если указать не равное число полей и соответствующих им значений, это приведет к исключительной ситуации.
Для поиска также служит метод LookUp. Данный метод похож на метод Locate, но указатель не перемещается на найденную запись, а данные просто считываются из этой записи. Еще одним отличием является поиск на полное соответствие условия поиска. При использовании данного метода вместо параметров нужно указать перечень полей, которые будут получены в результате успешного поиска. Если поиск завершился неудачей, то метод вернет значение Null. Здесь так можно использовать поиск сразу по нескольким полям одновременно.
Для набора данных Table существуют методы для поиска только по индексированым полям. Для их использования нужно задать текущий индекс с полем или полями, по которым будет производиться поиск. Если индекс будет построен по нескольким полям, то поиск также можно производить сразу по нескольким полям. Одним из таких методов является метод FindKey. Данный метод производит поиск записи в наборе данных, у котрой значения полей совпадают со значениями поиска, указанными в параметре функции. То есть, сколько полей входят в текущий индекс, столько условий поиска можно указать в команде.
Интересным способом поиска является совокупность методов SetKey и GotoKey. При помощи метода SetKey набор данных переводиться в режим поиска. Затем для перехода к записи используется метод GotoKey. Задание условий поиска производиться обычным присваиванием.
Не менее удобным способом для поиска данных существует метод FindNearest. Данный метод производит поиск записи на частичном совпадении условия поиска. Сравнение производиться с самого первого символа, стоящего в поле Базы Данных и поэтому вероятность положительного поиска достаточно велика. Здесь также можно производить поиск сразу по нескольким полям БД.
На основании рассмотренных методов поиска можно сделать вывод, что на практике удобней всего использовать методы Locate и FindNearest.
Выполнение поиска записи:
Создаём форму следующего вида:
Код программы:
procedure TForm16.BitBtn3Click(Sender: TObject);
begin
form16.Hide;
end;
procedure TForm16.BitBtn1Click(Sender: TObject);
begin
if (Edit1.Text<>'')and(Edit2.Text<>'')then Table1.Locate('fio; nazvanie_gr',vararrayof([Edit1.Text, Edit2.Text]),[])
else
if (Edit1.Text<>'')and(Edit2.Text='')then Table1.Locate('fio',Edit1.Text,[loPartialKey])
else
if (Edit1.Text='')and(Edit2.Text<>'')then Table1.Locate('nazvanie_gr',Edit2.Text,[loPartialKey]);
end;
procedure TForm16.BitBtn2Click(Sender: TObject);
var rez:variant;
begin
rez:=Table1.Lookup('fio; nazvanie_gr',vararrayof([Edit1.Text,Edit2.Text]),'forma_ob; propiska');
if not VarIsNull(rez) then
begin
if not VarIsNull(rez[0])then
label3.Caption:=string(rez[0]);
if not VarIsNull(rez[1])then
label4.Caption:=string(rez[1]);
end
else
begin
Label3.Caption:='Запись не найдена!';
label4.Caption:='';
end;
end;
procedure TForm16.BitBtn4Click(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
Label3.Caption:='';
Label4.Caption:='';
Label7.Caption:='';
Label8.Caption:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
end;
procedure TForm16.FormShow(Sender: TObject);
begin
PageControl1.ActivePageIndex:=0;
end;
procedure TForm16.BitBtn5Click(Sender: TObject);
var rez:variant;
begin
rez:=Query1.Lookup('fio; nazvanie_gr',vararrayof([Edit3.Text,Edit4.Text]),'forma_ob; propiska');
if not VarIsNull(rez) then
begin
if not VarIsNull(rez[0])then
label7.Caption:=string(rez[0]);
if not VarIsNull(rez[1])then
label8.Caption:=string(rez[1]);
end
else
begin
Label7.Caption:='Запись не найдена!';
label8.Caption:='';
end;
end;
procedure TForm16.BitBtn6Click(Sender: TObject);
begin
if (Edit3.Text<>'')and(Edit4.Text<>'')then Query1.Locate('fio; nazvanie_gr',vararrayof([Edit3.Text, Edit4.Text]),[])
else
if (Edit3.Text<>'')and(Edit4.Text='')then Query1.Locate('fio',Edit3.Text,[loPartialKey])
else
if (Edit3.Text='')and(Edit4.Text<>'')then Query1.Locate('nazvanie_gr',Edit4.Text,[loPartialKey]);
end;
procedure TForm16.BitBtn7Click(Sender: TObject);
begin
Table1.IndexName:='indforma';
Table1.Open;
Table1.FindKey([edit5.Text]);
end;
procedure TForm16.BitBtn8Click(Sender: TObject);
begin
Table1.IndexName:='indforma';
Table1.SetKey;
Table1.FieldByName('forma_ob').AsString:=Edit5.Text;
Table1.GotoKey;
end;
procedure TForm16.BitBtn9Click(Sender: TObject);
begin
Table1.IndexFieldNames:='forma_ob';
Table1.FindNearest([Edit5.Text]);
end;