Добавлен: 28.11.2018

Просмотров: 2686

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

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 

МИРОНОВ

 P.

И

. M 

ПОПОВ

 

А

.

А

М

 

ПОТАПОВ

 

Д

.

П

М

 

СИДОРОВ

 

П

.

С

М

 

ЯКОВЛЕВ

 

А

.

И

М

 

Видим

что

 

содержание

 

и

 

порядок

 

предъявления

 

записей

 

из

 

базы

 KADR.DBF 

отвечают

 

желаемым

Если

 

порядок

 

предъявления

 

фамилий

 

безразличен

 

и

 

по

 

ним

 

не

 

предполагается

 

поиск

ключевое

 

поле

  (

в

 

данном

 

случае

 

FAM) 

можно

 

опустить

заменив

 

его

 

пробелом

 

в

 

команде

 

индек

-

сирования

 

INDEX ON ' 'TO kadrpol FOR pol='M' COMPACT 

При

 

этом

 

индексный

 

файл

 

будет

 

меньших

 

размеров

Если

 

индексный

 

файл

 

был

 

уже

 

создан

его

 

нужно

 

открыть

 

при

 

внесении

 

новых

 

записей

 

или

 

редактировании

 

старых

  (

если

 

затрагиваются

 

индексные

 

поля

и

конечно

если

 

предполагается

 


background image

 

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 

равно

 

но

-


background image

 

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 


background image

 

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  <

новый

 


background image

 

30

файл

>. 

В

 

таком

 <

новом

 

файле

записи

 

будет

 

уже

 

расположены

 

заданным

 

образом

 

Задание

 2 

 

1. 

Упорядочить

 

файл

 GROUP 

по

 

датам

 

рождения

 

отдельно

 

для

 

мужчин

 

и

 

женщин

2. 

Упорядочить

 

файл

 STUDY 

по

 

названиям

 

предмета

3. 

Упорядочить

 

файл

 GROUP 

по

 

номеру

 

полиса

 

отдельно

 

для

 

мужчин

 

и

 

женщин

4. 

Упорядочить

 

файл

 GROUP 

по

 

фамилиям

 

отдельно

 

для

 

муж

-

чин

 

и

 

женщин

 

Для

 

проверки

 

выполнения

 

задания

 

студент

 

должен

 

вы

-

слать

 

в

 

текстовом

 

виде

 

команды

 FOX PRO, 

выполняющие

 

зада

-

ния

 1-4.