Распечатать страницу

Функции для поиска и перемещения в таблице VFP

« Назад

Функция

BOF([nWorkArea | cTableAlias])

возвращает .T., если выполнена попытка установить файловый указатель перед первой записью таблицы, или .F. – в противном случае.

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

Пример. Выводятся фамилии авторов, занесенные в записи 10, 9, …, 1 таблицы .

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors

select Authors

if Reccount( ) < 10

go bottom

else

goto 10

endif

do while not Bof( )

? Author

skip -1                                 && Переход на предыдущую запись

enddo

Функция

EOF([nWorkArea | cTableAlias])

возвращает .T., если выполнена попытка установить файловый указатель вслед за последней записью таблицы, или .F. – в противном случае. В частности, EOF( ) вернет .T., если поиск командами FIND, LOCATE или SEEK оказался нерезультативным.

Функция вернет .F., если в области таблица не открыта, и сгенерирует ошибку, если указан неиспользуемый псевдоним cTableAlias.

Пример. Перебираются все записи таблицы Authors.

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors

select Authors

do while not Eof( )

? Author

skip 1                                  && Переход на следующую запись

enddo

Функция

LOOKUP(ReturnField, eSearchExpression, SearchedField [, cTagName])

ищет первую запись таблицы, значение поля SearchedField которой отвечает заданному выражению eSearchExpression. Возвращает, если запись найдена, значение, имеющееся в поле ReturnField, или пустую строку, длина которой равна длине поля ReturnField. Тип результата совпадает с типом поля ReturnField.

Если поиск удачен, то LOOKUP( ) перемещает таблицу на найденную запись. Если неудачен, то таблица позиционируется в конце файла, где EOF( ) возвращает .T.

Если LOOKUP( ) применяется для поиска в родительской таблице, то файловые указатели дочерних таблиц в результате поиска перемещаются на соответствующие записи.

Функция не использует рашмор-оптимизацию.

Параметры:

ReturnField – поле, значение которого в случае успешного поиска возвращает функция LOOKUP( ).

eSearchExpression – искомое значение. Обычно – это значение, которое может хранить поле SearchedField. Также выражение может соответствовать индексному выражению активного индекса или активного тега составного индекса.

SearchedField – поле, в котором ищется eSearchExpression. Если таблица не имеет активного индекса и если опущен параметр cTagName, то функция LOOKUP( ) выполняет последовательный поиск.

Если имеется активный индекс или тег, индексное выражение которого – это SearchedField, то LOOKUP( ) использует этот индекс или тег (выполняет бинарный поиск) ускоряя тем самым получение результата.

cTagName – имя тега составного индекса, используя который LOOKUP( ) осуществляет бинарный поиск.

Замечание. Если поиск выполняется не в текущей таблице, поля ReturnField и SearchedField должны предваряться псевдонимом таблицы-объекте поиска..

Пример 1. Возвращается значение поля InputDate таблицы Authors для записи, имеющей AuthorId = 14.

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors

inDate = Lookup(Authors.InputDate, 14, Authors.AuthorId, "AuthorId")

? inDate                              && Напечатает: 11.21.2004

&& Напечатает фамилию автора, хранимую в найденной записи

? Authors.Author

Пример 2. Выводятся названия книг, написанных автором с AuthorId = 14.

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors in 0

use Books in 0

use BooksAuthors order tag AuthorId in 0

select BooksAuthors

auIdSearched = 14

if Seek(auIdSearched) then

do while BooksAuthors.AuthorId = auIdSearched and not Eof( )

? Lookup(Books.Book, BooksAuthors.BookId, Books.BookId, "BookId")

skip                                     && Переход к следующей записи

enddo

else

auName = Lookup(Authors.Author, auIdSearched, Authors.AuthorId, "AuthorId")

if not Empty(auName) then

MessageBox("В библиотеке нет книг автора " + Rtrim(auName))

else

MessageBox("Нет автора с кодом " + Transform(auIdSearched))

endif

endif

Функция

FOUND([nWorkArea | cTableAlias])

возвращает .T., если команда CONTINUE, LOCATE или SEEK выполнена результативно, или .F. – в противном случае. Функция оперирует либо текущей, либо указанной параметром nWorkArea | cTableAlias таблицей.

Пример см. в описании команды LOCATE.

Функция

SEEK(eExpression [, nWorkArea | cTableAlias
                  
[, nIndexNumber | cIDXIndexFileName | cTagName]])

возвращает .T., если в индексированной таблице найдена запись, значение индексного выражения которой отвечает eExpression, или .F. – в противном случае.

Файл позиционируется на найденной записи, если она найдена, либо в конце файла – в противном случае.

На результаты поиска влияет установка команды SET EXACT: совпадение должно быть полным, если SET EXACT установлен в ON.

Функция эквивалента применению команды SEEK с последующим вызовом функции FOUND( ).

Параметры:

eExpression – искомое значение индексного ключа.

nIndexNumber – позиция в списке открытых индексных IDX-файлов и CDX-файлов, по которой выбирается индекс или тег. Порядок нумерации индексов и тегов см. в описании команды SET ORDER.

cIDXIndexFileName – имя IDX-файла, в котором ищется eExpression.

cTagName – имя тега, в котором ищется eExpression.

Если имеются совпадающие имена IDX-файла и тега, то приоритет имеет IDX-файл.

Если параметр nIndexNumber | cIDXIndexFileName | cTagNamee опущен, то берется управляющий индекс. Если его нет, то VFP генерирует ошибку.

Если параметр nIndexNumber | cIDXIndexFileName | cTagNamee имеется, то берется индекс (тег), определяемый этим параметром.

Пример. Печатаются фамилии всех авторов, начинающиеся с буквы Л, таблицы Authors, открытой с управляющим тегом Author.

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors order tag Author

select Authors

set exact off

fistLetter = 'Л'

if Seek(fistLetter) then

&& Перемещаемся по записям, поле Author которых начинается с буквы Л

do while Authors.Author = fistLetter and not Eof( )

? Authors.Author

skip

enddo

else

MessageBox('Нет авторов с фамилией, начинающейся с буквы ' + fistLetter)

endif

Функция

INDEXSEEK(eExpression [, lMovePointer [, nWorkArea | cTableAlias
                  
[, nIndexNumber | cIDXIndexFileName | cTagName]]])

ищет в индексированной таблице первую запись, значение ключа которой отвечает заданному выражению eExpression. Возвращает .T., если запись найдена, или .F. – в противном случае.

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

Функция вернет .F., если выполняется попытка найти значение ключа последней добавленной командой INSERT INTO или APPEND BLANK записи и если файл все еще остается на этой записи.

На результаты поиска влияет установка команды SET EXACT.

Параметр (см. также описание функции SEEK( )):

eExpression – искомое значение индексного выражения.

lMovePointer – перемещает файл на найденную запись или конец файла при неудаче, если lMovePointer = .T., и не перемещает – в противном случае.

Может быть употреблен следующий вариант использования INDEXSEEK( ): первоначально поиск ведется с lMovePointer = .F., и если функция вернет .T., то для перемещения к найденной записи выполняется поиск с lMovePointer = .T.

Пример:

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors order tag Author

select Authors

? Recno( )

&& Полного совпадения не требуется

set exact off

? IndexSeek('Л', .F.)            && Напечатает: .T.

&& Позиция файла не меняется

? Recno( )

? IndexSeek('Л', .T.)            && Напечатает: .T.

&& Файл позиционируется на найденной записи

? Recno( )

Функция

KEYMATCH(eExpression [, nIndexNumber [, nWorkArea | cTableAlias]])

возвращает .T., если индексный ключ eExpression найден, или .F. – в противном случае.

Поиск осуществляется в индексном файле или теге текущей или заданной таблицы. Если необязательные параметры отсутствуют, то берется управляющий индексный файл или тег. Если такового нет, то VFP генерирует ошибку. На результаты поиска влияет установка команды SET EXACT. Позиция файла после выполнения поиска не меняется.

Параметры см. в описании функции SEEK( ).

Пример:

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

use Authors order tag Author

select Authors

? Recno( )

set exact off

? KeyMatch('Л')                  && Напечатает: .T.

&& Позиция файла не меняется

? Recno( )

&& Употребляем функцию SEEK( )

Seek('Л')

&& Файл позиционируется на найденной записи

? Recno( )

set exact on

? KeyMatch('Л')                  && Напечатает: .F.

? KeyMatch('Лимонов Эдуард Вениаминович')

&& Напечатает: . T.