Последовательно просматривает таблицу в поисках первой записи, совпадающей с заданным логическим выражением.
Синтаксис:
LOCATE FOR lExpression1 [Scope] [WHILE ] [NOOPTIMIZE]
Параметры:
FOR lExpression1
Команда LOCATE последовательно просматривает текущую таблицу в поисках первой записи, соответствующей логическому выражению lExpression1.
Технология Rushmore оптимизирует запрос, формируемый командой LOCATE FOR, если lExpression1 является оптимизируемым выражением. Для повышения производительности используйте в предложении FOR оптимизируемое выражение. Подробнее об этом см. темы SET OPTIMIZE и Основы технологии Rushmore и главу 17 "Оптимизация приложений" Руководства разработчика.
Scope
Задает диапазон записей. Поиск будет вестись только среди записей, попадающих в данный диапазон. Он задается следующими предложениями: ALL, NEXT nRecords, RECORD nRecordNumber и REST. Подробнее о предложениях диапазона см. тему Предложения диапазона и главу 2 "Обзор языка программирования" Руководства разработчика. Команды, использующие параметр Scope, воздействуют только на таблицу в активной рабочей области.
По умолчанию команда LOCATE использует диапазон ALL все записи.
WHILE lExpression2
Задает условие, в соответствии с которым записи ищутся, пока логическое выражение lExpression2 остается истинным (.T.).
NOOPTIMIZE
Запрещает оптимизацию команды LOCATE по технологии Rushmore. Подробнее об этом см. темы SET OPTIMIZE и Основы технологии Rushmore или главу 17 "Оптимизация приложений" Руководстао разработчика.
Комментарии:
Данная таблица не обязательно должна быть индексирована.
Если команда LOCATE находит запись, удовлетворяющую условиям поиска, с помощью функции RECNO( ) можно получить номер этой записи. Если нужная запись найдена, функция FOUND( ) возвращает значение "истина" (.T.), а EOF( ) "ложь" (.F.). Если действует установка SET TALK ON, на экране появляется номер найденной записи.
После того как LOCATE найдет подходящую запись, можно выдать команду CONTINUE, чтобы продолжить поиск в оставшейся части таблицы. По команде CONTINUE процесс поиска возобновляется с записи, непосредственно следующей за только что найденной. Команды CONTINUE можно выдавать повторно, пока не будет достигнута граница диапазона или конец таблицы.
Если записи, соответствующей требуемому условию, не найдено, RECNO( ) возвращает число записей в таблице, увеличенное на 1, FOUND( ) возвращает "ложь" (.F.), а EOF( ) "истину" (.T.).
Команды LOCATE и CONTINUE привязаны к текущей рабочей области. Если выбрать другую рабочую область, первоначальный процесс поиска можно будет продолжить после того, как исходная рабочая область будет выбрана вновь.
Пример:
* В следующем примере идет поиск всех записей, относящихся к клиентам * из Германии. Затем на экране отображается общее количество. CLOSE DATABASES OPEN DATABASE (HOME( ) + 'samples\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))