Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_БД.doc
Скачиваний:
28
Добавлен:
04.05.2019
Размер:
4.03 Mб
Скачать

Тема. Поиск записей.

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

Скорость поиска повышается за счет индексирования.

Методика SetKey. Поиск выполняется по индексированному полю.

Методы:

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

Функция GotoKey:Boolean; - перемещает курсор на запись, указанную для текущего ключа, и при успешном поиске возвращает значение True.

Например,

// поиск первой записи, соответствующей заданному в LETovar

// названию товара

TbTovar.IndexFieldNames:='T_Nazv';

TbTovar.SetKey;

TbTovar.FieldByName('T_Nazv').AsString:=LETovar.Text;

TbTovar.GotoKey;

GotoNearest – переводит курсор на наиболее похожую (совпадающую по первым символам) запись набора данных.

Например,

TbTovar.IndexFieldNames:='Tovar';

TbTovar.SetKey;

TbTovar.FieldByName('T_Nazv').AsString:=LETovar.Text;

TbTovar.GotoNearest;

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

функция FindKey(const KeyValues: array of const): Boolean; - обеспечивается переход к записи, удовлетворяющей заданным значениям. Параметр KeyValuesмассив значений ключевых полей в той последовательности, в которой они входят в индекс. Возвращает True, если поиск успешный.

Например,

TbTovar.IndexFieldNames:='T_Nazv;T_Cena';

if not TbTovar.FindKey([LETovar.Text,'50'])

then MessageDlg(‘Запись не найдена!',mtError,[mbOk],0);

FindNearest(const KeyValues: array of const); - перемещает курсор на запись, наиболее близкую к указанному значению ключевого поля (индекса). Массив-параметр должен содержать столько значений, сколько полей определено в составном индексе. В противном случае для недостающих полей будет передано значение NULL.

Например,

TbTovar.IndexFieldNames:='Т_Nazv;T_Cena';

TbTovar.FindNearest(['т','50']);

Например,

// поиск нужной записи по первым задаваемым символам

procedure TForm1.LE_tovarChange(Sender: TObject);

begin

TbTovar.FindNearest([LE_tovar.text]);

end;

Метод Locate. Допускает выполнение поиска по неиндексированным полям. Индексирование ускоряет поиск.

функция Locate(const KeyFields: String; const KeyValues: Variant: Options: TLocateOptions): Boolean; - выполняет для указанных полей KeyFields поиск первой записи, содержащей значения KeyValues, и при успешном завершении делает эту запись текущей. Параметр Options задает параметры поиска.

loCaseInsensitive – регистр букв не учитывается;

loPartialKey – допускается частичное совпадение значений.

Например,

  1. TbTovar.Locate(‘T_Cena’,20,[]);

// ищется первая запись с ценой 20;

  1. TbTovar.Locate('T_Prim',LETovar.Text,[loCaseInsensitive, loPartialKey]);

функция VarArrayOf(const Values: array of Variant): Variant; - формирует тип Variant из задаваемого массива параметров любого типа. Используется при поиске по нескольким полям.

Например,

TbTovar.Locate('T_Nazv;T_Cena',VarArrayOf([LETovar.Text, LECena.Text]),[loCaseInsensitive,loPartialKey]);

Метод Lookup.

функция Lookup (const KeyFields: string;

const KeyValues : Variant;

const ResultFields: string) : Variant;

Параметры KeyFields и KeyValues аналогичны методу Locate. Третий параметр – строка, перечисляющая поля, значения которых возвращаются в виде массива Variant. Метод Lookup не изменяет положение курсора, но считывает информацию из полей записи. Поиск выполняется при точном соответствии значений поиска и значений в полях записи с учетом регистра букв.

Например,

TbTovar.IndexFieldNames:='T_Nazv;T_Cena';

LECena.Text:=TbTovar.Lookup('T_Nazv',LETovar.Text,'T_Cena');

Если поиск неудачный, то возвращается значение NULL. Для распознавания такого результата используется функция

VarIsNull (const V:Variant): Boolean; - возвращает True, если V=NULL, и False в противном случае.

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

Пример. Поиск методом Lookup в таблице Tovar.

procedure TForm1.TbTovarCalcFields(DataSet: TDataSet);

begin

TbTovarSumma.AsCurrency:=

TbTovarT_Cena.AsCurrency*TbTovarT_Kol_vo.AsInteger;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

TbTovar.Active:=True;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

TbTovar.Active:=False;

end;

procedure TForm1.BtnPoiskClick(Sender: TObject);

var Res:Variant;

begin

Res:=TbTovar.Lookup('T_Nazv;T_Cena',

VarArrayOf([LETovar.Text,LECena.Text]),

'T_Kol_vo;T_Prim');

// анализ результата поиска

if VarIsNull(Res) then ShowMessage('Такой записи нет!')

else begin

// проверка первой составляющей

if VarIsNull(Res[0]) then ShowMessage('Нет количества!')

else

Label1.Caption:=Label1.Caption+String(Res[0]);

// проверка второй составляющей

if VarIsNull(Res[1]) then ShowMessage('Нет примечания!')

else Label2.Caption:=Label2.Caption+String(Res[1]);

end;

end;

Навигация с псевдофильтрацией.

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

Методы

Function FindFirst: Boolean; Function FindLast: Boolean; Function FindNext: Boolean; Function FindPrior: Boolean;

- перемещают указатель текущей записи соответственно на первую, последнюю, следующую и предыдущую записи, удовлетворяющие условию фильтрации, которое задано через Filter.

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

Пример. Поиск с псевдофильтрацией в таблице Tovar.

procedure TForm1.FormCreate(Sender: TObject);

begin

TbTovar.Active:=True;

TbTovar.FilterOptions:=[foCaseInsensitive];

TbTovar.Filtered:=False;

end;

procedure TForm1.BtnFindClick(Sender: TObject);

begin

TbTovar.IndexFieldNames:='T_Nazv;T_Cena';

TbTovar.Filter:='T_Nazv='+#39+LETovar.Text+#39;

TbTovar.Filtered:=False;

TbTovar.FindFirst;

end;

procedure TForm1.BtnFirstClick(Sender: TObject);

begin

TbTovar.FindFirst;

end;

procedure TForm1.BtnPriorClick(Sender: TObject);

begin

TbTovar.FindPrior;

end;

procedure TForm1.BtnNextClick(Sender: TObject);

begin

TbTovar.FindNext;

end;

procedure TForm1.BtnLastClick(Sender: TObject);

begin

TbTovar.FindLast;

end;