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

LOCATE [FOR lExpression1]   [Scope]   [WHILE lExpression2]   [NOOPTIMIZE]

Параметры

FOR lExpression1

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

Технология Rushmore оптимизирует запрос, формируемый командой LOCATE FOR, если lExpression1 является оптимизируемым выражением. Для повышения производительности используйте в предложении FOR оптимизируемое выражение.

Подробнее об этом смотрите Команда SET OPTIMIZE and Использование оптимизации запросов Rushmore для ускорения доступа к данным.

Scope

Задает диапазон записей для поиска. Поиск будет вестись только среди записей, попадающих в данный диапазон. Он задается следующими предложениями: ALL, NEXT nRecords, RECORD nRecordNumber, и REST. Команды, использующие параметр Scope воздействуют только на таблицу в активной рабочей области.

По умолчанию команда LOCATE использует диапазон ALL - все записи.

WHILE lExpression2

Задает условие, в соответствии с которым записи ищутся, пока логическое выражение lExpression2 остается истинным (.T.).

NOOPTIMIZE

Запрещает оптимизацию команды LOCATE по технологии Rushmore.

Подробнее об этом смотрите Команда SET OPTIMIZE and Использование оптимизации запросов Rushmore для ускорения доступа к данным.

Expand imageЗамечание

Данная таблица не обязательно должна быть индексирована.

Если использовать команду LOCATE без параметра FOR, Visual FoxPro устанавливает указатель записи на первую логическую запись. Это быстрее использования команды GO TOP если используются фильтры или команда DELETED установлена в ON.

Если команда LOCATE находит запись, удовлетворяющую условиям поиска, с помощью функции RECNO( ) можно получить номер этой записи. Если нужная запись найдена, функция FOUND( ) возвращает значение "истина" (.T.), а EOF( ) ѕ "ложь" (.F.). Если действует установка SET TALK ON, на экране появляется номер найденной записи.

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

Если записи, соответствующей требуемому условию, не найдено, RECNO( ) возвращает число записей в таблице, увеличенное на 1, FOUND( ) возвращает "ложь" (.F.), а EOF( ) ѕ "истину" (.T.).

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

Expand imageПример

В следующем примере идет поиск всех записей, относящихся к клиентам из Германии. Затем на экране отображается общее количество.

  CopyCode imageCopy Code
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata')
USE customer  && Open Customer table
SET TALK OFF

STORE 0 TO gnCount
LOCATE FOR ALLTRIM(UPPER(customer.country)) = 'GERMANY' 
DO WHILE FOUND( )
   gnCount = gnCount + 1
   ? company
   CONTINUE
ENDDO

? 'Total companies Germany: '+ LTRIM(STR(gnCount))

Expand imageСмотрите также