Команда INDEX

Создает файл индекса, позволяющий отображать и обрабатывать табличные записи в логическом порядке.

Синтаксис:

INDEX ON eExpression TO IDXFileName | TAG TagName [OF CDXFileName]
	[FOR lExpression]
	[COMPACT]
	[ASCENDING | DESCENDING]
	[UNIQUE | CANDIDATE]
	[ADDITIVE]

Параметры:
eExpression
Задает выражение индекса, которое может содержать имя поля (имена полей) из текущей таблицы. На основе этого выражения индекса в файле индекса для каждой записи таблицы создается ключ индекса. Visual FoxPro использует эти ключи для отображения записей таблицы и для доступа к ним.
Замечание. В качестве eExpression можно также использовать (хотя это и не рекомендуется) переменную памяти, элемент массива, поле или выражение поля из таблицы в другой рабочей области. В выражениях индекса нельзя задавать одни memo-поля; их следует комбинировать с другими символьными выражениями. При обращении к индексу, содержащему переменную или поле, которых больше не существует или которые не удается найти, Visual FoxPro выдает сообщение об ошибке.
Если в выражении индекса задано поле и перед ним стоит псевдоним таблицы или буква, обозначающая рабочую область, Visual FoxPro выдаст сообщение об ошибке. Несмотря на то, что это не мешает оптимизировать предложения FOR по технологии Rushmore, настоятельно рекомендуется избегать использования полей с псевдонимами при создании индексов. В некоторых случаях (команда USE ... AGAIN, запросы SQL и т.п.) таблице автоматически назначается другой псевдоним, что может вызвать неправильное обновление или применение индекса. Подробнее о технологии Rushmore см. главу 17 " Оптимизация приложений" Руководства разработчика.
Если вы пытаетесь построить индекс с ключом переменной длины, ключ будет дополняться пробелами. Visual FoxPro не поддерживает ключи переменной длины. Возможно создать индекс с нулевой длиной. Такой индекс сгенерирует ошибку.
TO IDXFileName
Создает файл индекса .IDX. Файл индекса по умолчанию получает расширение имени .IDX, которое можно заменить, задав другое расширение или изменив в файле конфигурации Visual FoxPro расширение имени индекса, принимаемое по умолчанию. При создании файлов индексов необходимо соблюдать стандартные правила именования файлов MS-DOS.
TAG TagName [OF CDXFileName]
Создает файл составного индекса. Файл составного индекса представляет собой независимый файл индекса, состоящий из произвольного числа отдельных тегов (элементов индекса). Каждый тег идентифицируется уникальным именем. Имена тегов, как и имена переменных, должны начинаться с буквы или с символа подчеркивания и могут содержать любую комбинацию букв, цифр и символов подчеркивания общим числом не более 10. Количество тегов в файле составного индекса ограничивается только объемом свободной памяти и дискового пространства.
Многоключевые файлы составных индексов всегда являются компактными. При создании файла компактного индекса нет необходимости задавать ключевое слово COMPACT. Имена файлов составных индексов получают расширение .CDX.
Можно создавать составные индексы двух типов: структурные и неструктурные.

Файлы структурных составных индексов
Чтобы создать файл структурного составного индекса, достаточно задать предложение TAG TagName, опустив при этом предложение OF CDXFileName. Файл структурного составного индекса всегда имеет то же базовое имя, что и таблица, и автоматически открывается при открытии таблицы.
Если файл структурного составного индекса таблицы нельзя найти или если он был удален или переименован, то при попытке открыть таблицу появится диалоговое окно. Если нажать в нем кнопку Cancel (это предлагается сделать по умолчанию), таблица не будет открыта. Если нажать Ignore, таблица откроется и в ее заголовке будет сброшен флаг, указывающий на наличие связанного с данной таблицей файла структурного составного индекса.
Совет. Чтобы вновь сопоставить с таблицей структурный составной индекс, который потерял с ней связь, выдайте следующую команду:

USE TableName INDEX CDXFileName

Здесь CDXFileName представляет собой имя отсоединившегося структурного составного индекса. Не забудьте заново проиндексировать таблицу, если она за это время была модифицирована.

Файл неструктурного составного индекса
Чтобы создать файл неструктурного (независимого) составного индекса, задайте предложение OF CDXFileName после TAG TagName. Файл неструктурного составного индекса, в отличие от структурного, должен явно открываться с помощью команды SET INDEX или команды USE с предложением INDEX.
Если файл составного индекса уже создан и открыт, то при выдаче команды INDEX с предложением TAG TagName в этот файл добавляется еще один тег.
FOR lExpression
Задает условие, в соответствие с которым можно использовать для отображения и доступа только те записи, которые удовлетворяют выражению фильтра lExpression; ключи индекса создаются в файле индекса только для записей, удовлетворяющих условию фильтра.
Технология Rushmore оптимизирует команду INDEX ... FOR lExpression, если lExpression является оптимизируемым выражением. В целях достижения наилучшей производительности рекомендуется использовать в предложении FOR оптимизируемое выражение. Подробнее об этом см. темы SET OPTIMIZE и Основы технологии Rushmore и главу 17 " Оптимизация приложений" Руководства разработчика.
COMPACT
Предложение COMPACT создает компактный файл .IDX.
ASCENDING
Задает возрастающий порядок для файла .CDX. По умолчанию теги .CDX создаются в возрастающем порядке (ASCENDING можно включить как напоминание о порядке индекса). Таблицу можно индексировать в обратном порядке, включив предложение DESCENDING.
DESCENDING
Задает убывающий порядок для файла .CDX. Предложение DESCENDING нельзя задавать при создании файлов индексов .IDX. Впрочем, убывающий порядок для файла индекса .IDX можно задать с помощью команд SET INDEX и SET ORDER.
UNIQUE
Указывает, что в файл .IDX или в тег .CDX включается только первая запись с конкретным значением ключа индекса. Предложение UNIQUE можно использовать для того, чтобы предотвратить отображение или доступ к повторяющимся записям. Все записи, добавленные с повторяющимися ключами индекса, исключаются из файла индекса. Применение опции UNIQUE в команде INDEX идентично выполнению команды SET UNIQUE ON перед выдачей команды INDEX или REINDEX.
Когда активен индекс или тег индекса с опцией UNIQUE и повторяющаяся запись изменяется таким образом, что это приводит к изменению ее ключа индекса, индекс или тег индекса обновляется. Однако следующую повторяющуюся запись с первоначальным ключом индекса нельзя будет отобразить или обработать до тех пор, пока вы не переиндексируете файл командой REINDEX.
CANDIDATE
Создает тег структурного индекса-кандидата. Ключевое слово CANDIDATE можно задавать только при создании тега структурного индекса; в противном случае Visual FoxPro сгенерирует сообщение об ошибке.
Тег индекса-кандидата предотвращает появление повторящихся значений в поле или в комбинации полей, заданных в выражении индекса eExpression. Термин "кандидат" обозначает тип индекса; имеется в виду, что такой индекс рассматривается в качестве "кандидата" на роль первичного индекса, раз он в состоянии запретить повторяющиеся значения.
Если попытаться создать тег индекса-кандидата для поля или комбинации полей, в которых уже имеются повторяющиеся значения, Visual FoxPro сгенерирует ошибку.
Подробнее о тегах индексов-кандидатов и первичных индексов см. тему Установка первичного индекса или индекса-кандидата и в главе 7 "Работа с таблицами" Руководства разработчика.
ADDITIVE
Сохраняет открытыми все файлы индексов, открытые ранее. Если опустить предложение ADDITIVE при создании файла (или файлов) индекса для таблицы по команде INDEX, все ранее открытые файла индексов (за исключением структурного составного индекса) закрываются.

Комментарии
Если таблица обладает файлом индекса, то выражение индекса определяет порядок отображения записей таблицы и доступа к ним. На физический порядок размещения записей в таблице файл индекса не влияет.
Если установка SET TALK имеет значение ON, Visual FoxPro сообщает о том, сколько записей проиндексировано в ходе процесса индексации. Интервал, с которым отображается количество записей во время индексирования, можно задать с помощью команды SET ODOMETER.
Команда DISPLAY STATUS позволяет отобразить дополнительную информацию об открытых файлах индексов. В эту информацию входят имена всех открытых файлов индексов, их типы (структурный, .CDX, .IDX), их выражения индекса и последовательности сортировки, а также имя главного файла индекса или главного тега.
Количество файлов индексов (.IDX или .CDX), которые вы можете открыть, ограничивается только объемом памяти и имеющимися системными ресурсами. В FoxPro для MS-DOS и Visual FoxPro общее число файлов, которые можно открыть, определяется установкой FILES в файле конфигурации MS-DOS CONFIG.SYS. Подробнее об установке FILES см. документацию по MS-DOS.

Типы индексов
В Visual FoxPro можно создавать файлы индексов двух типов:
Файлы составных индексов .CDX, которые состоят из множества элементов индекса, называемых тегами
Файлы индексов .IDX, каждый из которых содержит только один элемент индекса
Вы также можете создать файл структурного составного индекса, который автоматически открывается вместе с таблицей.
Совет. Поскольку файл структурного составного индекса открывается автоматически вместе с таблицей, этот тип индекса рассматривается как предпочтительный.
С помощью предложения COMPACT вы можете создавать файлы компактных индексов .IDX. Файлы составных индексов всегда являются компактными.
Если вы работаете с одними и теми же файлами и в Visual FoxPro, и в FoxBASE+ или FoxBASE+ для Macintosh, вам следует воспользоваться файлами некомпактных индексов .IDX. В противном случае при построении файлов .IDX задайте предложение COMPACT, чтобы задействовать технологию Rushmore Visual FoxPro.

Порядок индексов и их обновление:
Порядок отображения и обработки таблицы контролируется только одним файлом индекса (главным файлом индекса) или тегом (главным тегом). Некоторые команды (например, SEEK) используют главный файл индекса или тег при поиске записей. Однако при внесении изменений в таблицу обновляются все открытые файлы индексов .IDX и .CDX. Главный файл индекса или главный тег можно задать с помощью предложения INDEX команды USE или с помощью команд SET INDEX и SET ORDER.

Пользовательские функции:
Хотя в выражении индекса допускается пользовательская функция, эти функции не рекомендуется использовать в выражении индекса. Пользовательская функция в выражении индекса приводит к увеличению времени создания или обновления индекса. Кроме того, она может помешать проведению обновлений индекса.
При обновлении индекса Visual FoxPro должен суметь найти пользовательскую функцию, включенную в выражение индекса. Когда Visual FoxPro создает индекс, выражение индекса сохраняется в файле индекса, но в это выражение включается только ссылка на пользовательскую функцию.

Пример:

* В Примере 1 открывается таблица customer и создается файл индекса
* complist, который отображает и обрабатывает записи в алфавитном
* порядке значений поля company.
* В Примере 2 опять таблица customer и создается файл индекса citycomp
* на основе подстроки, состоящей из первых пяти символов поля city и
* первых пяти символов поля company. Когда этот индекс используется,
* записи в таблице упорядочиваются сначала по по полю city, а затем по
* полю company.
* В Примере 3 создаются теги индекса. Первый тег представляет собой тег
* структурного составного индекса для поля address1. Второй тег
* создается в файле неструктурного индекса custcdx. Последний тег также
* создается в файле неструктурного индекса custcdx, но в убывающем
* порядке.
* Example 1

CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE Customer	  && Open customer table
INDEX ON company TO complist
CLEAR
DISPLAY STATUS

* Example 2
CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE Customer	  && Open customer table
INDEX ON SUBSTR(city,1,5) + SUBSTR(company,1,6) TO citycomp
CLEAR
DISPLAY STATUS

* Example 3
CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE Customer	  && Open customer table
INDEX ON address TAG address
INDEX ON company TAG company OF custcdx
CLEAR
DISPLAY STATUS

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 12.02.2003