Добавлен: 28.11.2018

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

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

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
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.