Delphi 3 и создание приложений баз данных


8.3.4. Неточный поиск


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

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

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

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

В приводимых ниже примерах подразумевается KeyExclusive = False.

Предположим, что поисковое значение GrNum вводится в Editi, а NN - в Edit2. Тогда обработчик нажатия клавиши поиска FindButton может выглядеть так:

procedure TForm1.FindButtonClick(Sender: TObject) ;

var GrTmp, NNTmp : Longint;

begin

GrTmp := StrToInt(Edit1.Text);

NNTmp := StrToInt(Edit2.Text);

//Поиск записи

Table1.FindNearest([GrTmp,NNTmp]) ;

end;

Пусть в Edit1 введено "12" и в Edit2 введено "4". Тогда указатель переместится на запись, у которой поле GrNum содержит 12 и поле NN содержит 4 (рис. 8.6):

Пусть в Edit 1 введено " 12" и в Edit2 введено "О". Тогда указатель переместится на запись с большим значением индекса. Наращение индекса ведется по внутреннему полю (если оно есть) и только затем - по полю более высокого приоритета. В нашем случае внутреннее поле в индексе - NN. В данном случае в НД имеется запись с тем же номером группы и большим номенклатурным номером (рис. 8.7):

Однако если в Editi введено "50" и в Edit2 введено "О" (или что-либо другое, для данного состояния НД это неважно), записи с той же группой (50) и большим значением номенклатурного номера нет. Поэтому указатель записи перемещается на запись с большим номером группы (рис. 8.8).

Заметим, что теоретически возможно в условиях поиска опускать значение внешнего поля индекса (в нашем случае поля GrNum). Например, можно задать в Edit1 "0" и в Edit2 - "1". Однако, вопреки ожиданиям, курсор НД не встанет на первую запись с номенклатурным номером 1 для первой попавшейся группы, а встанет на первую запись с группой, превышающей 0, т.е. на логически первую запись в НД при сортировке по полям GrNum, NN (рис. 8.9).

Существует более громоздкая альтернатива методу FindNearest -выполнение группы методов Set Key, EditKey, GoToNearest и заполнение полей поисковыми значениями (подробнее см. в конце описания метода FindKey). Например, выполнение метода

Table1.FindNearest([GrTmp,NNTmp]) ; может быть заменено эквивалентным по последствиям кодом

Table1.SetKey;

Table1GrNum.Value := GrTmp;

Table1NN.Value := NNTmp;

Table1.GotoNearest;

ЗАМЕЧАНИЕ.

Если нужно осуществить поиск по индексу, отличному от текущего, необходимо:

1. сохранить список текущих индексных полей в строковой переменной;

2. заменить список текущих индексных полей НД на необходимый;

3. осуществить поиск;

4. восстановить список текущих индексных полей НД из строковой переменной.

Пример.

Пусть текущая сортировка в НД осуществляется по имени товара (т.е. в текущий момент Tablel. IndexFieldNames = 'Tovar') и текущей является вторая логическая запись (рис. 8.10).

Тогда после выполнения обработчика нажатия кнопки FindButton, если в Editi введено "100" и в Edit2 введено "О":

procedure TForm1.FindButtonClick(Sender: TObject) ;

var GrTmp, NNTmp : Longint;

OldIndexFieldNames : Strings;

begin

OldIndexFieldNames := Tablel.IndexFieldNames;

Tablel .IndexFieldNames := 'GrNunuNN';

{...}

Table1.FindNearest([GrTmp,NNTmp]) ;

Table1.IndexFieldNames := OldIndexFieldNames;

end;

указатель записи встанет на искомую запись (рис. 8.11).

Перед выполнением последней строки обработчика

Table1.IndexFieldNames := OldIndexFieldNames;

НД будет иметь вид, показанный на рис. 8.12.

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




Начало  Назад  Вперед



Книжный магазин