Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

BD_poisk_zapisey

.pdf
Скачиваний:
18
Добавлен:
09.03.2016
Размер:
213.34 Кб
Скачать

1

Поиск записей в БД Методы, используемые при работе с любым набором

1. Метод Locate (поля поиска, критерии поиска, опции поиска)

Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена, делает её текущей. В этом случае в качестве результата возвращается значение True. Если поиск неуспешен, возвращается значение False.

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

Критерии поиска задаются в вариантном массиве KeyValues так, что i-е значение критерия ставится в соответствие i-му полю. В случае поиска по одному полю, указывается одно значение.

Опции поиска задает необязательные значения режимов поиска: loCaseInsensitive – поиск ведется с учетом регистра букв

loPartialKey – запись считается удовлетворяющей условию поиска, если она содержит часть поискового контекста.

table1.Locate('Nom;b1',VararrayOf(['ПМ-11','5']),[loPartialKey]);

procedure TForm_Poisk.Button1Click(Sender: TObject); begin

table1.Locate('Nom;b1',VararrayOf(['ПМ-11','5']),[loPartialKey]); end;

procedure TForm_Poisk.Button2Click(Sender: TObject); var Pole:ShortString;

2

begin

Case RadioGroup1.ItemIndex of

0:Pole:='Fio';

1:Pole:='Nom';

2:Pole:='B1';

3:Pole:='B2';

4:Pole:='B3'

end;

if not Table1.Locate(Pole,Edit1.Text,[loCaseInsensitive,loPartialKey]) then ShowMessage ('Запись не найдена');

end;

2. Использование методов FindFirst, FindLast, FindNext, FindPrior

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

Для НД, в котором определены условия фильтрации. Но сама фильтрация в текущий момент не выключена, Delphi предоставляет следующую возможность: в неотфильтрованном в данный момент НД можно обеспечить навигацию только между теми записями, которые удовлетворяют условию фильтрации (свойство Filtered=False).

Для этого используются методы FindFirst, FindLast, FindNext, FindPrior.

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

Accept:=(DataSet[‘Nom’]=’ПМ-11’) and (DataSet[‘B1’]>=5);

Accept – это переменный параметр обработчика событий OnFilterRecord.

Если искомая запись найдена, методы возвращаю значение True, в противном случае –

False.

Методы:

FindFirst:Boolean – переходит на первую запись, удовлетворяющую фильтру FindLast:Boolean – переходит на последнюю запись, удовлетворяющую фильтру FindNext:Boolean – переходит на следующую запись, удовлетворяющую фильтру FindPrior:Boolean – переходит на предыдущую запись, удовлетворяющую фильтру Found:Boolean – возвращает True, если последнее обращение к одному из методов привело

к нахождению нужной записи

procedure TForm_Poisk.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);

begin Accept:=Pos(Edit2.Text,DataSet['FIO'])>0; end;

procedure TForm_Poisk.Button4Click(Sender: TObject); begin

Label4.Caption:='Запись найдена';

If not Table1.FindFirst then Label4.Caption:='Нет такой записи'; end;

procedure TForm_Poisk.Button5Click(Sender: TObject); begin

Label4.Caption:=' Запись найдена ';

3

If not Table1.FindLast then Label4.Caption:=' Нет такой записи '; end;

procedure TForm_Poisk.Button6Click(Sender: TObject); begin

Label4.Caption:=' Запись найдена ';

If not Table1.FindNext then Label4.Caption:=' Нет такой записи '; end;

procedure TForm_Poisk.Button7Click(Sender: TObject); begin

Label4.Caption:=' Запись найдена ';

If not Table1.FindPrior then Label4.Caption:=' Нет такой записи '; end;

3. Метод Lookup

Lookup (Список полей, поисковые значения полей, ResultFields)

Метод Lookup находит запись, удовлетворяющую условию, но не делает её текущей, а возвращает значения некоторых полей этой записи. Тип результат – вариантный массив. Независимо от успеха поиска записи, указатель текущей БД не изменяется.

Lookup осуществляет поиск только на точное соответствие критерия поиска и значения полей записи.

Параметры:

Список полей – содержит список полей, по которым ведется поиск.

Если запись в результате поиска не найдена, метод lookup возвращает Null, что выявляется при помощи предложения:

If varitype(LookupResults)= varNull then…

4

В противном случае Lookup возвращает из этой записи значения полей, список которых указан в ResultFields. При этом размерность результата зависит от того, сколько результирующих полей указано ResultFields:

указано одно поле – результатом будет значение соответствующего типа или Null, если поле в найденной записи содержит пустое значение,

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

II. Поиск записей в компоненте TTable.

Function FindKey([список значений]):Boolean – ищет запись, точно удовлетворяющую условиям поиска в списке значений, существует также дублирующий его метод GoToKey

Procedure FindNearest([список значений]) – ищет запись, приблизительно удовлетворяющую условиям в списке значений, существует также дублирующмй его метод

GoToNearest;

Поиск может осуществляться только по индексным полям!

1. Точный поиск. Для точного поиска применяется метод FindKey. Если такая запись найдена, метод возвращает значение True и указатель текущей записи в НД устанавливается на эту запись, т.е. она делается текущей. Если найдена группа записей, текущей становится первая из них. Если запись не найдена, курсор НД не перемещается и метод возвращает значение False.

Table1.IndexFieldNames:='FIO';

if not Table1.FindKey([Edit3.Text]) then ShowMessage('Запись не найдена');

Table1.IndexFieldNames:='FIO';

Table1.SetKey; Table1.Fieldbyname('FIO').AsString:=Edit3.Text; if not Table1.GotoKey then

ShowMessage('Запись не найдена');

2. Неточный поиск. (приблизительное соответствие) Осуществляется методом

Procedure FindNearest([список параметров])

При поиске на неточное соответствие предпринимается попытка отыскать в НД запись, у которой индексные поля соответствуют значениям, указанным в списке значений. Если такой запись найдена, указатель текущей записи в НД перемещается на нее или на следующую за ней запись, в зависимости от значения свойства KeyExckusive:Boolean. Если KeyExclusive=False (по умолчанию), указатель текущей записи перемещается на нее. Если KeyExclusive=True, указатель текущей записи перемещается на следующую запись.

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

Для неточного поиска в Delphi имеется группа методов SetKey, EditKey, GoToKey, которые должны выполняться вместе и которые по функциональности аналогичны методу FindKey. Использование их является менее удобным. Сначала нужно перевести набор данных в состояние dsSetKey (методом SetKey или, если он уже применялся для данного индекса, EditKey), затем присвоить поисковые значения полям и выполнить метод GoToEdit. После этого набор данных переходит в состояние dsBrowse. Результат выполнения аналогичен результату, возвращаемому методом findKey.

Table1.IndexFieldNames:='FIO';

5

Table1.FindNearest([Edit3.Text]);

Существует более громоздкая альтернатива методу FindNearest – выполнение группы методов SetKey, EditKey, GoTONearest и заполнение полей поисковыми значениями.

Table1.IndexFieldNames:='FIO';

Table1.SetKey;

Table1.Fieldbyname('FIO').AsString:=Edit3.Text;

Table1.GotoKey;

3. Инкрементальный локатор. Под локатором будем понимать механизм поиска (точного или приблизительного) записей НД с последующим позиционированием на них курсора компонента TTable. Описанный выше обработчик события кнопки ПОИСК реализует локаторы.

Остался еще один режим поиска: по вводу каждого символа в TEdit переходить на запись, ближе всего лежащую к искомой. Чем больше символов введено, тем ближе курсор БД к искомой записи. Такой локатор называется инкрементальным.

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

procedure TForm_Poisk.Edit4Change(Sender: TObject); begin

Table1.IndexFieldNames:='FIO';

Table1.FindNearest([Edit4.Text]);

end;

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

Property KeyFieldCount:Integer;

Указать, сколько начальных полей индекса будут использоваться при поиске. Установка значений свойства KeyFieldCount актуальна только в случае использования методов GoTOKey, GoToNearest.

//поиск по одному полю индекса

Table1.SetKey;

Table1. KeyFieldCount:=1; Table1.Fieldbyname('FIO').AsString:=Edit3.Text; Table1.GoToNearest;

//поиск по 2 полям индекса

Table1.SetKey;

Table1. KeyFieldCount:=2;

Table1.Fieldbyname('FIO').AsString:=Edit3.Text;

Table1.Fieldbyname('Nom').AsString:=Edit4.Text;

Table1.GoToNearest;

При использовании методов FindKey и FindNearest необходимости в использовании KeyFieldCount нет. Для поиска по частичному соответствию достаточно указать в списке часть полей данного индекса.

//поиск по одному полю индекса

Table1.FindNearest([Edit3.Text]);

//поиск по 2 полям индекса

Table1.FindNearest([Edit3.Text, Edit4.Text]);

6

procedure TForm_Poisk.Button1Click(Sender: TObject); begin

table1.Locate('Nom;b1',VararrayOf(['ПМ-11','5']),[loPartialKey]); end;

procedure TForm_Poisk.Button2Click(Sender: TObject); var Pole:ShortString;

begin

Case RadioGroup1.ItemIndex of

0:Pole:='Fio';

1:Pole:='Nom';

2:Pole:='B1';

3:Pole:='B2';

4:Pole:='B3'

end;

if not Table1.Locate(Pole,Edit1.Text,[loCaseInsensitive,loPartialKey]) then ShowMessage ('Запись не найдена');

end;

procedure TForm_Poisk.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);

begin Accept:=Pos(Edit2.Text,DataSet['FIO'])>0; end;

procedure TForm_Poisk.Button4Click(Sender: TObject); begin

Label4.Caption:=' Запись найдена';

7

If not Table1.FindFirst then Label4.Caption:='Нет такой записи'; end;

procedure TForm_Poisk.Button5Click(Sender: TObject); begin

Label4.Caption:=' Запись найдена';

If not Table1.FindLast then Label4.Caption:=' Нет такой записи '; end;

procedure TForm_Poisk.Button6Click(Sender: TObject); begin

Label4.Caption:=' Запись найдена ';

If not Table1.FindNext then Label4.Caption:=' Нет такой записи '; end;

procedure TForm_Poisk.Button7Click(Sender: TObject); begin

Label4.Caption:='Запись найдена';

If not Table1.FindPrior then Label4.Caption:=' Нет такой записи '; end;

procedure TForm_Poisk.Button3Click(Sender: TObject); begin

Case RadioGroup2.ItemIndex of

0:begin Table1.IndexFieldNames:='FIO';

if not Table1.FindKey([Edit3.Text]) then ShowMessage('Не найдена запись');

{Table1.SetKey;

Table1.Fieldbyname('FIO').AsString:=Edit3.Text; if not Table1.GotoKey then

ShowMessage(' Не найдена запись ');} end;

1:begin Table1.IndexFieldNames:='FIO'; Table1.FindNearest([Edit3.Text]);

{ Table1.SetKey; Table1.Fieldbyname('FIO').AsString:=Edit3.Text; if not Table1.GotoKey then

ShowMessage(' Не найдена запись ');} end;

end;

end;

procedure TForm_Poisk.Edit4Change(Sender: TObject); begin

Table1.IndexFieldNames:='FIO';

Table1.FindNearest([Edit4.Text]);

end;

8

Фильтрация записей в наборе данных

1. Свойство Filtered.

Property Filtered:boolean

Свойство Filtered, установленное в True, инициирует фильтрацию, условие которой записано или в обработчике события OnFilterRecord, или содержится как строковое значение в свойстве Filter. Если установлены разные условия фильтрации и в событии OnFilterRecord, и в свойстве Filter, выполняются оба.

Table1.Filtered:=True;

table1.Filter:='b2='+Edit1.Text;

Procedure TForm1.Table1FilterRecord(DataSet:TdataSet; var Accept:Boolean); Begin

Accept:=DataSet[‘b1’]=’5’;

End;

2.Событие OnFilterRecord возникает, когда свойство Filtered устанавливается в True. Обработчик события имеет два параметра: имя фильтруемого набора данных и var Accept, указывающего условия фильтрации записей в НД. В отфильтрованный НД включаются только те записи, для которых параметр Accept имеет значение True.

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

Когда приложение обрабатывает событие OnFilterRecord, НД переводится из состояние dsBrowse в состояние dsFilter. После завершения текущего вызова обработчика события

OnFilterRecord, НД переводится в состояние dsBrowse.

3.Свойство Filter позволяет указать условия фильтрации. В этом случае НД будет отфильтрован, как только его свойство Filtered станет равным True. При задании условий фильтрации можно использовать операции отношения и логические операторы and, not, or.

([fio]='ПМ11') and ([B1]=5)

4.Свойство FilterOption позволяет установить режимы фильтрации.

По умолчанию FilterOption=[];

foCaseInsensitive – фильтрация без учета регистра букв foNoPartialCompare – поиск на точное соответствие.

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

Для фильтрации записей ТБД, компонент Ttable имеет следующие методы:

1.Procedure SetRangeStart –устанавливает нижнюю границу фильтра

2.Procedure SetRangeEnd –устанавливает верхнюю границу фильтра

3.Procedure ApplyRange – осуществляет фильтрацию записей в Ttable, условия фильтрации определяются методами SetRangeStart и SetRangeEnd.

4.Procedure SetRange(const StartValues, EndValues:array of const) – показывает в НД только те записи, индексные поля которых лежат в диапазоне [StartValues, EndValues].

5.Метод Procedure CancelRAnge служит для отмены предыдущих условий фильтрации.

6.Методы

Procedure EditRangeStart

Procedure EditRangeEnd

Предназначены для смены условий фильтрации, установленных ранее с использованием методов SetRangeStart, SetRangeEnd. Сама фильтрация при этом выполняется методом ApplyRange.

7. Свойство KeyExclusive.

9

Property KeyExclusive:Boolean влияет на включение в отфильтрованный НД записей, у которых индексные поля содержат граничные значения диапазона фильтрации. Это свойство включается и выключается отдельно для начального и конечного значения фильтрации.

procedure TForm_Filtr.Button1Click(Sender: TObject); begin

Table1.Filtered:=True;

table1.Filter:='b2='+Edit1.Text;

end;

procedure TForm_Filtr.Button2Click(Sender: TObject); begin

Table1.Filtered:=False;

end;

procedure TForm_Filtr.Button3Click(Sender: TObject); begin

table1.Filter:=Edit2.Text;

table1.Filtered:=True;

end;

procedure TForm_Filtr.Button4Click(Sender: TObject); begin

Table1.Filtered:=False;

end;

procedure TForm_Filtr.Button5Click(Sender: TObject); begin

Table1.IndexFieldNames:='b1';

table1.Filtered:=True;

10

Table1.CancelRange;

Table1.SetRange([Edit3.Text],[Edit4.Text]);

end;

procedure TForm_Filtr.Button6Click(Sender: TObject); begin

Table1.CancelRange;

end;

Установка текущего индекса TTable

Какой индекс является текущим для данного НД, в ряде случаев это имеет важное значение.

Во-первых, текущий индекс определяет поля, по которым будет отсортирован данных НД. Во-вторых, многие методы и свойства TTable работают напрямую с текущим индексом. Это

методы поиска записей.

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

1.Путем занесения имени индекса в свойство IndexName: Table1.IndexName:=’FIO’

2.Путем занесения списка индексных полей в свойство IndexFieldNames. В случае нескольких полей их имена разделяются точкой с запятой.

Table1.IndexFieldNames:=’Fio;Nom’.

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

Добавление нового индекса

Добавление нового индекса происходит в режиме исключительного доступа к ТБД (свойство Exclusive=True) и осуществляется методом

Procedure AddIndex (Name, Fields, Options); Name – задает имя индекса,

Fields – список индексных полей. В случае нескольких полей их имена разделяются точкой с запятой.

Options – опции, определяющие свойства индекса: ixPrimary – определяет первичный индекс ixUnique – определяет уникальный индекс

ixDescending – определяет индекс, построенный по убыванию значений ключевых полей (по умолчанию – по возрастанию)

ixCaseInsensitive – определяет индекс, не чувствительный к высоте букв.

Пример: Table1.Close; Table1.Exclusive:=True; Table1.Open;

Table1.AddIndex(‘www’,’Fio;Nom’,[ixCaseInsensitive]);

Table1.Close;

Table1.Exclusive:=False;

Table1.Open;

Удаление существующего индекса

Удаление существующего индекса происходит в режиме исключительного доступа к ТБД (свойство Exclusive=True) и осуществляется методом

Procedure DeleteIndex (Name);

Параметр Name определяет имя удаляемого индекса. Table1.DeleteIndex(‘www’);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]