Неточный поиск
Неточный поиск (поиск на неточное, приблизительное соответствие) осуществляется методом
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.
Восстановление исходного индекса в последней строке приведет к изменению логического следования записей в НД, но текущая запись останется прежней. Причиной этого является правило: простое изменение сортировки в НД, если оно не сопровождалось изменением условий фильтрации записей в НД, не влечет изменения местоположения курсора НД.