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

Команды для индексов в Visual FoxPro

« Назад

Команда

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

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

Опции и параметры:

eExpression – индексное выражение, которое может включать имя поля или имена нескольких полей текущей таблицы. Индексный ключ создается в индексном файле для каждой записи таблицы. VFP использует эти ключи для отображения и доступа к записям таблицы.

Индексное выражение сохраняется в заголовке индексного файла.

Нельзя использовать в eExpression переменные, элементы массивов, а также поля других таблиц.

Memo-поля могут быть использованы в eExpression только в сочетании с другими символьными выражениями.

Имена полей таблицы в eExpression указываются без псевдонима таблицы, поскольку в некоторых случаях (при выполнении команды USE ... AGAIN, SQL-запросов и др.) таблица автоматически получает иной псевдоним, и индекс не может быть надлежащим образом обновлен.

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

VFP не поддерживает ключи переменной длины. Потому если индексное выражение вычисляется с различной длиной, например RTRIM(Author), к более коротким результатам будут добавлены правые пробелы. Рациональнее, если есть необходимость уменьшить размер индекса, употребить, например, выражение LEFT(Author, 20).

Длина ключа IDX-индекса должна быть в диапазоне 1 – 100 символов, а CDX-индекса – в диапазоне 1 – 240 символов. В некоторых collate-последовательностях или при использовании 2-байтовых символов длина eExpression в CDX-индексе ограничена 120 символами. При превышении допустимой длины ключа генерируется ошибка "Invalid key length".

Замечание. Употребление RECNO( ) в индексном выражении для буферизованного курсора портит индекс и приводит к бесконечному циклу.

TO IDXFileName – создается индексный IDX-файл. Имя файла может включать путь и не содержать расширения. По умолчанию IDX-файл получает расширение IDX. Однако оно может быть изменено путем соответствующего задания опции

INDEX extension

файла конфигурации VFP.

TAG TagName [COLLATE cCollateSequence] [OF CDXFileName] – создает тег составного индексного CDX-файла CDXFileName. Такой файл в отличие от IDX-файла может содержать несколько индексов (тегов).

Длина имени тега TagName не должна быть более 10 символов.

Составной индексный файл имеет предопределенное расширение – CDX.

Если при выполнении команды INDEX опция OF CDXFileName отсутствует, то будет создан тег структурного составного индексного файла, имя которого всегда совпадает с именем таблицы. Если опция присутствует, то создается тег независимого составного индексного файла. При этом будет создан и файл CDXFileName, если создается его первый тег.

Информация о наличии структурного индексного файла хранится в заголовке таблицы. При открытии таблицы открывается и ее структурный индексный файл, что обеспечивает его постоянное обновление. Если при открытии таблицы структурный индексный файл не обнаружен, то возникнет диалог (рис. 15.10)

216.1.-Не-найден-структурный-CDX-файл

Рис. 15.10. Не найден структурный CDX-файл

При выборе Ignore таблица будет открыта, а ссылка на ненайденный структурный CDX-файл из ее заголовка удалена.

Если, однако, затем потребуется эту ссылку восстановить, то при открытии таблицы следует употребить опцию INDEX:

use TableName index cdxFileName

Независимые CDX-файлы и IDX-файлы должны открываться явно командами SET INDEX или USE с опцией INDEX: в заголовок таблицы никаких сведений о таких файлах не заносится.

Индексные CDX-файлы всегда являются компактными, поэтому опция COMPACT избыточна.

BINARY – создает двоичный индекс.

COLLATE cCollateSequence – задает collate-последовательность. Если опция опущена, то для cCollateSequence берется значение по умолчанию – MACHINE или установленное командой SET COLLATE.

Реакция системы при попытке создать существующий IDX-файл или тег CDX-файла зависит от установки SET SAFETY.

FOR lExpression – задает условие-фильтр: доступны (как для просмотра, так и для редактирования) будут только записи, для которых lExpression вычисляется со значением .T. Для повышения быстродействия выражение lExpression должно быть рашмор-оптимизируемо.

COMPACT – создает компактный IDX-файл.

ASCENDING – (по умолчанию) задает возрастающий порядок для тега CDX-файла.

DESCENDING – задает убывающий порядок для тега CDX-файла.

Тег CDX-файла, однако, может быть иметь возрастающий порядок, но открыт с опцией DESCENDING командой SET INDEX или получить ее командой SET ORDER.

IDX-файл всегда имеет возрастающий порядок, но тоже может быть употреблен с убывающим порядком благодаря опции DESCENDING команд SET INDEX и SET ORDER.

UNIQUE – указывает, что при наличии записей с повторяющимися ключами в IDX-файл или тег CDX-файла будет включаться ключ только для первой записи. Таким образом, если UNIQUE-индекс является управляющим, то в подмножестве записей с повторяющимися индексными выражениями доступна только первая.

Использование опции UNIQUE равнозначно установке SET UNIQUE в ON перед выполнение команды INDEX или REINDEX.

Если UNIQUE-индекс активен и значение индексного выражения изменилось таким образом, что уникальность восстановлена, то прежде неуникальная запись будет доступна только после выполнения REINDEX.

Активный (управляющий) UNIQUE-индекс не препятствует добавлению записей с неуникальными значениями ключей, но ограничивает к ним доступ.

CANDIDATE – создается кандидатный тег структурного индекса. Опция CANDIDATE может быть включена только при создании тега структурного индекса. В противном случае VFP генерирует ошибку.

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

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

После выполнения команды INDEX управляющим становится созданный ей индекс или тег. Записи отображаются и обрабатываются в порядке, определяемом индексным выражением управляющего индекса или тега. Физический порядок записей не нарушается.

Если SET TALK установлен в ON, VFP сообщит о количестве проиндексированных записей. Интервал между сообщениями регулируется командой SET ODOMETER.

Информация об открытых индексных файлах отображается командой DISPLAY STATUS.

Изменение значения ключевого поля изменяет значение ключа и, следовательно, его позицию в индексном файле. Это нужно учитывать при выполнении команд, таких, как SCAN ... ENDSCAN, REPLACE ALL. Также необходимо понимать результат команды REPLACE при работе с индексом, построенным с применением опции FOR.

Пусть, например, все записи таблицы Authors имеют одно и то же значение InputDate (рис. 15.11).

216.2.-Фрагмент-таблицы-Authors

Рис. 15.11. Фрагмент таблицы Authors

Выполним следующий код:

select Authors

&&

&& Создаем индексный IDX-файл d:\iDate.idx

index on InputDate to d:\iDate

&&

&& Управляющим является индекс iDate

k = 0                                   && Число обновленных записей

scan

replace Authors.InputDate with Authors.InputDate + 1

k = k + 1

endscan

? k                                          && Напечатает: 1

При выполнении цикла SCAN ... ENDSCAN, когда управляющим является индекс iDate с индексным выражением InputDate, изменится дата только первой записи таблицы. Это объясняется тем, что после увеличения даты на 1 день, ключ первой записи перемещается на последнюю позицию, что влечет завершение цикла SCAN ... ENDSCAN.

Тот же результат будет получен и при выполнении цикла DO WHILE … ENDDO.

Команда

SET UNIQUE ON | OFF

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

По умолчанию команда установлена в OFF.

Замечание. Индексный файл сохраняет свою SET UNIQUE-установку при выполнении REINDEX.

Установка команды сохраняется с текущей сессией данных.

Команда

REINDEX [COMPACT]

перестраивает все открытые индексные файлы текущей таблицы. Если указана опция COMPACT, обычные IDX-файлы конвертируются в компактные IDX-файлы.

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

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

При выполнении REINDEX также обновляется и структурный индексный CDX-файл, который автоматически открывается с таблицей и, следовательно, всегда ей отвечает (если, конечно, не было в сбоев в работе системы).

Для ускорения перестройки индексных файлов можно, обратившись к функции SYS(3050), установить достаточно большой размер буфера, например такой, что в нем размещается вся таблица.

Пример 1:

select Authors

if IsExclusive( )

reindex

else

wait 'Таблицу нужно открыть монопольно!' window

endif

Пример 2. Выполняется обновление IDX-файла SomeTableIndex, а также структурного CDX-файла SomeTable.cdx (если таковой имеется).

use SomeTable index SomeTableIndex exclusive

reindex

Команда

SET ORDER TO [nIndexNumber | IDXIndexFileName | [TAG] TagName
                  
[OF CDXFileName] [IN nWorkArea | cTableAlias]

                   [ASCENDING | DESCENDING]]

устанавливает управляющий индексный файл или тег (индекс) для текущей или указанной таблицы.

Опции и параметры:

nIndexNumber – номер, по которому выбирается управляющий индексный файл или управляющий тег составного индекса.

Параметр nIndexNumber указывает на индексный IDX-файл или тег структурного или независимого составного индекса. IDX-файлы и независимые составные индексные файлы задаются в списке открываемых индексных файлов команды SET INDEX или опции INDEX команды USE.

Первоначально нумеруются IDX-файлы в соответствии с порядком их следования в списке. Затем нумеруются теги (индексы) структурного CDX-файла, если таковой имеется, в порядке их создания. И, наконец, нумеруются теги независимых CDX-файлов также в порядке их создания.

Следующий пример показывает, как реализуется нумерация индексных IDX-файлов и тегов CDX-файлов.

Таблица Video.dbf открывается с тремя индексными файлами Title.idx, Costs.cdx и Rating.idx в первой рабочей области. Один из них является составным.

use Video index Title.idx, Costs.cdx, Rating.idx in 1

Таблица Video имеет также структурный составной индексный файл Video.cdx с двумя тегами NumberSold и YearSold. Этот CDX-файл автоматически открывается с таблицей Video.

Независимый составной индексный файл Costs.cdx имеет теги RentalCost и BuyCost.

Поскольку IDX-файлы нумеруются в первую очередь, то SET ORDER TO 1 сделает управляющим индекс Title.idx, а SET ORDER TO 2 – Rating.idx:

set order to 1                       && Управляющий индекс Title.idx

set order to 2                       && Управляющий индекс Rating.idx

Затем нумеруются теги структурного CDX-файла Video.cdx:

&& Устанавливаем в качестве управляющего тег NumberSold файла Video.cdx

set order to 3

&& Устанавливаем в качестве управляющего тег YearSold файла Video.cdx

set order to 4

В последнюю очередь нумеруются теги независимого составного индексного файла Costs.cdx:

&& Устанавливаем в качестве управляющего тег RentalCost файла Costs.cdx

set order to 5

&& Устанавливаем в качестве управляющего тег BuyCost файла Costs.cdx

set order to 6

В качестве nIndexNumber можно указать 0. Выполнение

SET ORDER TO 0

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

Команда SET ORDER TO без дополнительных опций и параметров равнозначна команде SET ORDER TO 0.

Если величина nIndexNumber больше числа открытых IDX-файлов и тегов открытых CDX-файлов, то VFP генерирует ошибку.

IDXIndexFileName – устанавливает IDX-файл с именем IDXIndexFileName в качестве контролирующего.

[TAG] TagName [OF CDXFileName] – устанавливает в качестве управляющего тег с именем TagName CDX-файла CDXFileName. Опция OF CDXFileName употребляется, если имеются одинаковые теги в разных открытых CDX-файлах таблицы.

Если открытый IDX-файл и тег открытого CDX-файла имеют одинаковые имена и опции TAG и OF CDXFileName опущены, то приоритет имеет IDX-файл.

ASCENDING | DESCENDING – обеспечивает отображение и обработку записей в возрастающем или убывающем порядке значений контролирующего индекса. На состав индексного файла или тега эти опция влияния не оказывают.

Команда

SET INDEX TO [IndexFileList | ?] [ORDER nIndexNumber
                   | IDXIndexFileName | [TAG] TagName [OF CDXFileName]
                   [ASCENDING | DESCENDING]] [ADDITIVE]

открывает один или более индексных файлов для текущей таблицы.

Опция и параметр:

IndexFileList – список имен открываемых индексных файлов. Имена файлов разделяются запятыми. В списке может присутствовать любое сочетание имен IDX- и CDX-файлов. Расширения могут быть опущены, если имена IDX- и CDX-файлов не совпадают. Имя файла может содержать путь. Если он опущен, то файл ищется в директории по умолчанию.

Первый индексный файл списка становится после выполнения команды управляющим. Записи, если первый элемент списка IndexFileList – это CDX-файл, будут отображаться и обрабатываться в порядке их физического расположения в таблице до тех пор, пока не выполнена команда SET ORDER TO TAG TagName.

ADDITIVE – ранее открытые индексные файлы таблицы не будут закрыты при выполнении команды. Если опция опущена, то все индексные файлы, кроме структурного составного индексного файла, будут закрыты.

Смысл прочих опций параметров см. в описании команды SET ORDER.

Команда

SET INDEX TO

закроет все открытые индексные файлы текущей таблицы, кроме ее структурного CDX-файла.

Команда

COPY INDEXES IndexFileList | ALL [TO CDXFileName]

создает составной индексный CDX-файл текущей таблицы из ее индексных IDX-файлов.

Опции и параметры:

IndexFileList – список имен IDX-файлов, индексные выражения которых используются для создания тегов CDX-файла. Имена файлов разделяются запятыми.

ALL – в составной CDX-файл войдут все открытые IDX-файлы текущей таблицы.

TO CDXFileName – имя создаваемого независимого составного CDX-файла.

Команда

COPY TAG TagName [OF CDXFileName] TO IndexFileName

создает индексный IDX-файл IndexFileName из тега TagName составного индексного CDX-файла текущей таблицы.

Опция и параметр:

OF CDXFileName – имя открытого составного CDX-файла, содержащего тег TagName. Если опция опущена, то VFP берет первый тег структурного составного CDX-файла, если такового нет, то тег выбирается из открытого независимого составного CDX-файла.

Команды

DELETE TAG TagName1 [OF CDXFileName1]
                   [, TagName2 [OF CDXFileName2]]...

или

DELETE TAG ALL [OF CDXFileName]

удаляют теги из составных индексных CDX-файлов.

Опции и параметры:

TagName1 [OF CDXFileName1] [, TagName2 [OF CDXFileName2]]... – список удаляемых тегов. Опция OF CDXFileName включается, если два или более тегов разных CDX-файлов имеют одинаковое имя.

ALL [OF CDXFileName] – удаляет все теги составного CDX-файла. Если опция OF CDXFileName опущена, то удаляются теги структурного CDX-файла; сам файл удаляется с диска и из заголовка таблицы вычищается ссылка на этот файл. В противном случае удаляются теги открытого CDX-файла, заданного параметром CDXFileName.

VFP выдает предупреждение, если удаляется первичный или кандидатный тег и SET SAFETY установлен в ON.

Команда

CLOSE INDEXES

закрывает, как и SET INDEX TO, все открытые индексные IDX- и составные независимые CDX-файлы таблицы текущей рабочей области. Структурный CDX-файл, автоматически открываемый вместе с таблицей, не закрывается.