ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Базы данных
Добавлен: 28.11.2018
Просмотров: 2686
Скачиваний: 8
26
Как
видно
,
команда
LIST
показала
записи
именно
в
же
-
лаемом
,
а
не
в
фактическом
порядке
.
Файл
базы
KADR.DBF
ни
-
какому
изменению
не
подвергся
,
но
всеми
перемещениями
ука
-
зателя
записей
управляет
теперь
индексный
файл
KADRTAB.IDX.
Каково
содержимое
индексного
файла
?
Хотя
в
FoxPro
не
предусмотрена
какая
-
либо
возможность
непосредственного
дос
-
тупа
к
индексу
,
мы
можем
просмотреть
его
во
внутреннем
тек
-
стовом
редакторе
FoxPro (
с
помощью
команды
MODIFY FILE
KADTRAB.IDX).
Тогда
мы
увидим
,
что
кроме
технической
ин
-
формации
в
заголовке
файл
KADRTAB.IDX
будет
содержать
значения
ключевого
поля
TAB
индексируемой
базы
данных
,
расположенные
в
порядке
возрастания
,
и
(
в
закодированной
форме
)
фактические
номера
этих
записей
в
базе
данных
.
В
на
-
шем
случае
3-6,
1-13, 7-54, 2-98, 4-234
и
т
.
д
.
Пример
.
Рассмотрим
включение
FOR-
условия
в
команду
индексирования
.
Пусть
требуется
создать
индексный
файл
KADRPOL.IDX,
содержащий
ссылки
только
на
те
записи
базы
KADR.DBF,
которые
соответствуют
всем
мужчинам
(
ро
l='
М
'),
причем
упорядоченные
в
алфавитном
порядке
фамилий
.
USE kadr
INDEX ON faro TO kadrpol FOR pol='M' COMPACT
LIST FAM, POL
Record
#
FAM
POL
6
МИРОНОВ
P.
И
. M
4
ПОПОВ
А
.
А
.
М
2
ПОТАПОВ
Д
.
П
.
М
1
СИДОРОВ
П
.
С
.
М
7
ЯКОВЛЕВ
А
.
И
.
М
Видим
,
что
содержание
и
порядок
предъявления
записей
из
базы
KADR.DBF
отвечают
желаемым
.
Если
порядок
предъявления
фамилий
безразличен
и
по
ним
не
предполагается
поиск
,
ключевое
поле
(
в
данном
случае
FAM)
можно
опустить
,
заменив
его
пробелом
в
команде
индек
-
сирования
INDEX ON ' 'TO kadrpol FOR pol='M' COMPACT
При
этом
индексный
файл
будет
меньших
размеров
.
Если
индексный
файл
был
уже
создан
,
его
нужно
открыть
при
внесении
новых
записей
или
редактировании
старых
(
если
затрагиваются
индексные
поля
)
и
,
конечно
,
если
предполагается
27
индексный
поиск
.
Индексные
файлы
могут
быть
открыты
совме
-
стно
с
открытием
своей
базы
данных
(<DBF-
файл
>)
командой
:
USE <DBF-
файл
> [INDEX <
список
индексных
файлов
>
Команды
SET INDEX
открывает
только
индексы
(
база
должна
быть
уже
открыта
):
SET INDEX TO [<
список
индексных
файлов
>
Команда
SET INDEX TO
без
параметра
закрывает
все
ин
-
дексные
файлы
,
кроме
структурного
,
для
текущей
базы
.
Такое
же
действие
осуществляет
команда
CLOSE INDEX
Ускоренный
поиск
Индексный
файл
не
только
упорядочивает
базу
данных
для
просмотра
,
но
и
ускоряет
поиск
в
ней
по
ключу
,
заданному
в
индексе
,
если
пользоваться
командой
SEEK. <
выражение
>
Команда
применяет
специальный
алгоритм
ускоренного
поиска
,
в
котором
база
просматривается
не
сплошь
,
а
в
соответ
-
ствии
с
информацией
,
содержащейся
в
индексе
.
При
наличии
индекса
сначала
именно
в
нем
,
а
не
в
самой
базе
ведется
поиск
номера
записи
с
указанным
в
команде
SEEK
знанием
выражения
в
индексном
поле
.
При
этом
поиск
в
индексе
выполняется
не
последовательно
,
а
скачками
(
так
называемый
двоичный
поиск
),
что
позволяет
быстро
локализовать
номер
нужной
записи
.
Только
после
этого
указатель
записей
устанав
-
ливается
на
искомую
запись
в
основной
базе
данных
.
Команда
SEEK
разыскивает
только
одну
первую
запись
,
в
которой
в
ин
-
дексном
поле
наблюдается
<
выражение
>,
т
.
е
.
когда
<
по
-
ле
>=<
выражение
>,
и
устанавливает
на
нее
указатель
записей
.
Пример
.
Проведем
в
базе
KADR.DBF
поиск
записи
с
та
-
бельным
номером
234.
USE kadr INDEX kadrtab
SEEK 234
DISPLAY tab,fam
Record
#
TAB
FAM
4 234
ПОПОВ
А
.
А
.
Функции
RECNO(), FOUND(), EOF()
реагируют
на
резуль
-
таты
поиска
командой
SEEK
точно
гак
же
,
как
и
командами
LOCATE
и
CONTINUE.
Если
поиск
удачный
, RECNOQ
равно
но
-
28
меру
найденной
записи
, FOUND()=.T., EOF()=.F.;
если
нет
,
RECNO()
равно
числу
записей
в
базе
данных
плюс
единица
,
FOUND()=.F., EOF()=.T..
Все
это
относится
и
к
индексам
с
FOR-
условием
.
Для
индексированных
баз
существует
модификация
функ
-
ции
указания
номера
записи
с
аргументом
нуль
- RECNO(O),
ко
-
торая
в
случае
неудачного
поиска
возвращает
номер
записи
,
имеющей
самое
близкое
следующее
значение
к
ключу
поиска
,
заданному
в
команде
SEEK.
Использовав
этот
номер
,
можно
затем
перейти
в
указанную
запись
.
Однако
если
действует
ко
-
манда
SET NEAR ON,
то
в
случае
неудачного
поиска
указатель
записей
сразу
устано
-
вится
не
на
конец
файла
,
а
на
эту
близкую
запись
.
По
умолча
-
нию
SET NEAR OFF.
Это
предоставляет
инструмент
ускоренного
поиска
по
ключу
,
заданному
приблизительно
или
даже
частично
непра
-
вильно
.
Например
,
задана
фамилия
с
неверными
инициалами
или
окончанием
.
Часто
такая
ситуация
встречается
при
поиске
в
числовых
полях
.
Пусть
в
базе
KADR.DBF
нужно
найти
запись
,
где
средняя
зарплата
равна
600000
руб
.
Ввиду
того
что
,
воз
-
можно
,
никто
не
получает
именно
такую
зарплату
,
поиск
окажет
-
ся
неудачным
,
хотя
и
есть
зарплаты
,
близкие
к
этой
цифре
.
Если
же
мы
имеем
возможность
позиционировать
указатель
на
запи
-
си
с
ближайшим
значением
,
то
,
вызвав
затем
какое
-
нибудь
средство
просмотра
данных
(
например
,
команду
BROWSE)
и
пролистав
данные
в
базе
вблизи
найденного
места
,
мы
получим
возможно
'
все
-
таки
найти
и
отобрать
подходящие
записи
.
USE kadr
INDEX ON szar TO kadrzar COMPACT
SET NEAR ON
SEEK 600000
BROWSE
При
этом
мы
не
будем
стеснены
в
возможности
переме
-
щаться
в
базе
данных
.
Такой
механизм
называется
«
мягким
»
или
приблизительным
поиском
в
отличие
от
обычного
,
точного
поиска
.
Пример
.
Пусть
нужно
указать
фамилии
родителей
,
у
кото
-
рых
трое
детей
.
Если
их
не
окажется
,
выводить
ничего
не
нужно
.
USE kadr
INDEX ON det TO kadrdet COMPACT
IF SEEK(3)
LIST fam, det WHILE det=3
29
ENDIF
Управление
индексами
Один
и
тот
же
файл
DBF
может
иметь
любое
число
индек
-
сов
,
и
все
они
могут
быть
одновременно
открыты
командами
SET INDEX
или
USE-INDEX.
В
нашем
случае
команда
•
USE kadr INDEX kadrtab, polfam
открывает
два
индекса
KADRTAB.IDX
и
POLFAM.IDX.
При
вводе
,
удалении
,
редактировании
записей
все
откры
-
тые
индексные
файлы
будут
соответствующим
образом
изме
-
няться
.
Однако
главным
управляющим
индексом
,
т
.
е
.
таким
,
в
соответствии
с
которым
при
необходимости
будет
перемещать
-
ся
указатель
записей
,
может
быть
,
конечно
,
только
один
.
Им
яв
-
ляется
индексный
файл
,
открытый
самым
первым
в
команде
(
здесь
KADRTAB.IDX),
или
назначенный
таковым
опцией
ORDER.
В
случае
,
если
необходимо
сделать
главным
другой
ин
-
декс
,
используется
команда
•
SET ORDER TO <IDX-
файл
>
Команда
объявляет
главный
индекс
среди
открытых
ин
-
дексных
файлов
в
текущей
или
указанной
рабочей
<
области
>.
Опции
команды
совпадают
с
описанными
выше
для
команды
SET INDEX TO.
Например
,
следующие
команды
сделают
глав
-
ным
индекс
POLFAM.IDX
SET ORDER TO polfam
или
SET ORDER TO 2
Команда
SET ORDER TO 0
или
просто
SET ORDER TO
без
параметра
отключает
все
индексы
от
управления
перемещени
-
ем
указателя
записей
.
Теперь
уже
не
будет
главного
индекса
.
Однако
сами
индексы
остаются
открытыми
и
чувствительными
к
изменениям
в
базе
данных
.
В
случае
изменения
большого
объема
данных
необходи
-
мо
отключить
индексы
командой
SET INDEX TO
с
последующим
восстановлением
командой
REINDEX.
Индексирование
не
только
логически
упорядочивает
запи
-
си
базы
данных
,
но
позволяет
легко
выполнить
и
физическую
сортировку
данных
.
Для
этого
только
надо
скопировать
проин
-
дексированную
базу
в
новый
файл
командой
COPY TO <
новый
30
файл
>.
В
таком
<
новом
файле
>
записи
будет
уже
расположены
заданным
образом
.
Задание
2
1.
Упорядочить
файл
GROUP
по
датам
рождения
отдельно
для
мужчин
и
женщин
.
2.
Упорядочить
файл
STUDY
по
названиям
предмета
.
3.
Упорядочить
файл
GROUP
по
номеру
полиса
отдельно
для
мужчин
и
женщин
.
4.
Упорядочить
файл
GROUP
по
фамилиям
отдельно
для
муж
-
чин
и
женщин
.
Для
проверки
выполнения
задания
студент
должен
вы
-
слать
в
текстовом
виде
команды
FOX PRO,
выполняющие
зада
-
ния
1-4.