Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания лабы БД программисты.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
797.7 Кб
Скачать

Лабораторная работа №9 Тема: Поиск записей

Цель: Изучить методы поиска записей НД.

Задание:

  1. Изучить методы поиска записей НД.

  2. Выполнить поиск записей НД различными способами для приложений с базами данных 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;