Хелпикс

Главная

Контакты

Случайная статья





LООКUР (<поле1>,<выр>,<поле2>)



• LООКUР (<поле1>,<выр>,<поле2>)

Функция ищет первое вхождение искомого <выражения> в указанном <поле 2> активной базы данных и возвращает значение <поля 1> из той же базы. Если файл индексирован и индекс открыт, поиск ведется ускоренным методом, если нет - последовательным (подобно команде LOCATE). Если поиск оказался безуспешным, функция возвращает пустую строку, а указатель записей становится ниже последней записи базы (ЕОF()=.Т.).

Пример. В базе KADR.DBF с помощью функции LOOKUP() ищется в поле FAM первая фамилия, начинающаяся на букву 'П', и выводится ее табельный номер. Кроме того, для проверки в команде ? выводится и сама фамилия, и номер записи (FAM и RECNO()). Результаты работы команды приведены справа после знаков &&. Видим, что сначала выводится табельный номер 98 (ПОТАПОВ Д.П. - запись номер 2). После открытия индексного файла KADRFAM.IDX (индексирование сделано по полю FAM) выводятся уже данные для ПОПОВА А.А. (запись номер 4), поскольку по алфавиту он стоит выше ПОТАПОВА Д.П.

USE kadr

? LOOKUP(tab,'П',fam) ,fam,RECNO() && 98 ПОТАПОВ Д.П. 2

SET INDEX TOkadrfam

? LOOKUP(tab,'П',fam) ,fam,RECNO() && 234 ПОПОВ А.А. 4

А сейчас рассмотрим понятие индексирования и соответствующие команды.

 

Ускоренный поиск

Индексный файл не только упорядочивает базу данных для просмотра, но и ускоряет поиск в ней по ключу, заданному в индексе, если пользоваться командой

• SEEK <выражение>

Команда применяет специальный алгоритм ускоренного поиска, в котором база просматривается не сплошь, а в соответствии с информацией, содержащейся в индексе.

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

Команда SEEK разыскивает только одну первую запись, в которой в индексном поле наблюдается <выражение>, т.е. когда <поле>=<выражение>, и устанавливает на нее указатель записей.

Пример. Проведем в базе KADR.DBF поиск записи с табельным номером 234.

USEkadr INDEX kadrtab SEEK 234

DISPLAY tab,fam Record # TAB FAM

4 234 ПОПОВ А.А.

Функции RECNO(), FOUND(), EOF() реагируют на результаты поиска командой SEEK точно гак же, как и командами LOCATE и CONTINUE. Если поиск удачный, RECNO() равно номеру найденной записи, FOUND()=.T, EOF()=.F.; если нет, RECNO() равно числу записей в базе данных плюс единица, FOUND()=.F., EOFO=.T.. Все это относится и к индексам с FOR-условием.

Для индексированных баз существует модификация функции указания номера записи с аргументом нуль - RECNO(0), которая в случае неудачного поиска возвращает номер записи, имеющей самое близкое следующее значение к ключу поиска, заданному в команде SEEK. Использовав этот номер, можно затем перейти в указанную запись. Однако если действует команда



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.