ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Базы данных
Добавлен: 28.11.2018
Просмотров: 2679
Скачиваний: 8
31
3.
УСТАНОВЛЕНИЕ
СВЯЗЕЙ
МЕЖДУ
ФАЙЛАМИ
Понятие
о
рабочих
областях
В
FoxPro
можно
обрабатывать
сразу
несколько
файлов
баз
данных
.
Каждый
такой
файл
типа
DBF
и
все
вспомогатель
-
ные
файлы
(
например
,
индексные
)
открываются
в
своей
от
-
дельной
рабочей
области
.
Переход
из
области
в
область
осуще
-
ствляется
командой
•
SELECT
<
рабочая
область
/
псевдоним
>
Первые
десять
рабочих
областей
идентифицируются
но
-
мерами
1-10
или
буквами
А
- J.
Области
с
11-
й
по
25-
ю
обозна
-
чаются
номерами
или
буквенно
-
цифровыми
именами
W11 -
W25.
Область
,
в
которой
мы
находимся
в
данный
момент
,
назы
-
вается
активной
рабочей
областью
и
в
ней
можно
работать
с
находящейся
здесь
базой
данных
,
используя
все
допустимые
команды
системы
.
Одновременно
даже
в
одной
команде
можно
иметь
доступ
(
с
некоторыми
ограничениями
)
к
полям
других
баз
.
В
этом
случае
имя
поля
из
неактивной
области
–
составное
.
Имени
поля
тогда
предшествует
имя
рабочей
области
,
разде
-
ленные
знаками
«-»
и
«>«
или
(
что
более
удобно
)
точкой
:
<
рабочая
область
> - > <
имя
поля
>
или
<
рабочая
область
>.<
имя
поля
>
Например
,
следующие
составные
имена
для
поля
FAM
из
базы
KADR.DBF
идентичны
,
если
эта
база
открыта
в
области
А
или
1:
KADR.FAM, A.FAM, KADR->FAM, A->FAM.
При
входе
в
СУБД
активизируется
область
1 (
или
А
),
и
,
если
вы
работаете
только
с
одной
базой
,
заботиться
об
откры
-
тии
областей
не
нужно
.
Пример
.
В
файле
KADR
среди
прочих
содержатся
сведе
-
ния
о
фамилиях
и
табельных
номерах
работников
,
а
в
файле
BRIG1 -
о
табельных
номерах
TAB
и
выработке
VIR.
Необходимо
по
фамилии
(
например
,
МИРОНОВ
)
из
файла
KADR
найти
его
выработку
из
файла
BRIG1.
32
CLOSE DATA
HSE
kadr
-
открытие
файла
KADR.DBF
USE brigl IN 0
-
открытие
BRIG1.DBF
в
свободной
области
LOCATE FOR fam='
МИРОНОВ
'
-
поиск
записи
с
фамилией
МИРО
-
НОВ
SELECT
brigl -
переход
в
область
BRIG1
LOCATE FOR tab=b.tab
-
поиск
записи
в
файле
BRIG1
с
та
-
бельным
номером
МИРОНОВА
? a.fam, tab, vir
-
выдача
данных
из
обеих
баз
МИРОНОВ
Р
.
И
. 468 204000
Замечание
.
Как
уже
говорилось
,
в
команде
USE
можно
одновременно
указывать
и
область
,
в
которой
открывается
база
данных
.
Однако
переход
в
указанную
область
при
этом
не
про
-
исходит
.
Так
,
после
выполнения
команд
USE brig1 IN 0
мы
все
равно
остаемся
в
текущей
области
А
.
Установление
связей
между
файлами
В
FoxPro
допускается
работа
сразу
с
несколькими
базами
данных
в
при
этом
возможно
установление
связей
между
ними
.
Указатели
записей
в
таких
связанных
базах
будут
двигаться
синхронно
.
База
,
в
которой
указатель
движется
,
произвольно
,
считается
старшей
,
а
база
/
базы
,
в
которой
указатель
следует
за
указателем
старшей
базы
, -
младшей
.
В
старшей
и
младших
базах
должны
быть
поля
,
несущие
какой
-
то
общий
признак
,
ина
-
че
,
хотя
связь
и
возможна
,
она
будет
бессмысленна
.
Допускает
-
ся
сцепление
одной
базы
с
несколькими
другими
.
Младшие
ба
-
зы
,
в
свою
очередь
,
могут
быть
связаны
с
базами
следующего
уровня
и
т
.
д
.
Возможно
установление
двух
типов
связей
между
запися
-
ми
двух
сцепленных
баз
данных
.
Связь
типа
одна
-
запись
-
к
-
одной
перемещает
указатель
в
младшей
базе
таким
образом
,
что
он
всегда
устанавливается
в
младшей
на
первую
встречен
-
ную
им
запись
с
совпадающим
признаком
.
Остальные
такие
за
-
писи
(
если
есть
)
остаются
«
не
замеченными
».
Эта
связь
уста
-
навливается
просто
командой
SET RELATION.
Связь
типа
одна
-
запись
-
ко
-
многим
позволяет
обратиться
ко
всем
записям
млад
-
шей
базы
с
совпадающим
признаком
(
команды
SET RELATION
и
SET SKIP TO).
Оба
типа
связей
могут
быть
распространены
на
несколько
баз
сразу
.
33
Связь
вида
одна
-
запись
-
с
-
одной
Команда
SET RELATION TO <
ключ
> INTO <
область
>
[,<
ключ
> INTO <
область
>...] [ADDITIVE]
связывает
указатель
записей
в
активной
рабочей
области
с
ука
-
зателями
записей
из
других
рабочих
областей
,
имена
которых
указаны
после
слова
INTO,
по
заданному
общему
полю
(
ключу
).
Единственное
условие
-
файл
,
с
которым
устанавливается
связь
,
должен
быть
проиндексирован
по
этому
полю
.
Пример
.
Связать
файлы
KADR.DBF
и
BRIG1.DBF
по
полю
TAB.
Вывести
для
каждого
табельного
номера
файла
BRIG1.DBF
соответствующую
фамилию
и
выработку
.
USE brigl IN a
USE kadr INDEX kadrftab IN b
SET RELATION TO tab INTO
Ь
LIST tab,vir,b.fam
Record
#
TAB
VIR
B.FAM
1 98
446000
ПОТАПОВ
Д
.
П
.
2 6 480072
КУЛАКОВА
М
.
И
.
3 13
120000
СИДОРОВ
П
.
С
.
4 468
204000
МИРОНОВ
Р
.
И
.
Здесь
выведены
записи
файла
BRIG1.DBF,
в
которые
включено
поле
соответствующих
им
фамилий
KADR.DBF
(B.FAM).
В
FoxPro
имеется
возможность
устанавливать
связи
с
не
-
сколькими
базами
одновременно
.
Если
со
старшим
файлом
,
ко
-
торый
уже
связан
с
другим
,
необходимо
связать
некоторый
тре
-
тий
(
четвертый
и
т
.
д
.),
следует
во
все
последующие
команды
SET RELATION
включить
слово
ADDITIVE,
которое
обеспечит
сохранение
связей
,
установленных
ранее
.
Связь
между
всеми
файлами
разрывается
командой
SET
RELATION
ТО
без
параметров
.
Связь
с
отдельным
файлом
в
заданной
<
области
> -
командой
SET RELATION OFF INTO <
область
>
Для
сохранения
созданной
связи
используют
команду
CREATE VIEW <
имя
файла
связи
>
34
Открыть
файл
связи
можно
при
помощи
команды
SET VIEW TO <
имя
файла
связи
>
Связь
вида
одна
-
запись
-
со
-
многими
Следующая
команда
устанавливает
связь
такого
типа
между
двумя
или
несколькими
базами
данных
:
•
SET SKIP TO [<
область
1> [,<
область
2>]... ]
При
этом
с
каждой
записью
из
старшей
базы
могут
быть
сцеплены
несколько
записей
из
младшей
базы
.
Связь
может
быть
установлена
сразу
с
несколькими
младшими
базами
,
нахо
-
дящимися
в
указанных
<
областях
>.
Прежде
чем
использовать
команду
SET SKIP TO,
необхо
-
димо
выполнить
начальное
сцепление
вида
одна
-
запись
-
с
-
одной
командой
SET RELATION.
Удаление
связи
одна
-
запись
-
со
-
многими
осуществляется
командой
SET SKIP
ТО
без
параметров
.
Пример
.
Пусть
в
бригадных
файле
BRIG3.DBF
некоторые
табельные
номера
могут
встречаться
несколько
раз
(
например
,
если
фиксируются
выработки
каждого
работника
по
отдельным
нарядам
).
Допускаем
также
,
что
рабочие
могут
работать
сразу
в
нескольких
бригадах
.
Требуется
для
каждой
фамилии
и
табель
-
ного
номера
из
базы
KADR.DBF
предъявить
все
выработки
дан
-
ного
работника
из
баз
BRIG3.DBF
и
BRIG5;DBF,
которые
проин
-
дексированы
по
полю
TAB (
индексы
BRIG3.IDX
и
BRIG5.IDX).
BROWSE
-
ОКНО
показано
на
рис
. 1.,
решение
приведено
ниже
:
SELECT a
USE kadr IN a
&&
Открытие
старшей
базы
области
А
USE brig3 IN b INDEX brig3
&&
Открытие
младшей
базы
в
об
-
ласти
В
USE brig5 IN
с
INDEX brig5
&&
Открытие
другой
младшей
базы
в
С
*
Установление
связи
одна
-
с
-
одной
базы
KADR.DBF
с
*
базами
BRIG3.DBF, BROG5.DBF
S
ЕТ
RELATION TO tab INTO b, tab INTO
с
*
Установление
связи
одна
-
со
-
многими
базы
KADR.DBF
с
S
ЕТ
SKIP TO b,c
&&
базами
BRIG3.DBF
и
BRIG5.DBF
BROWSE FIELDS a.fam :
Н
='
Фамилия
' .a.tab :
Н
='
Табель
',;
b.tab :
Н
='
Таб
/
БригЗ
',b.vir :
Н
='
Выр
/
БригЗ
', ;
с
,tab :
Н
='
Таб
/
Бриг
5',
с
.vir :
Н
='
Выр
/
Бриг
5'
ЗЕТ
RELATION TO
&&
Отмена
всех
связей
35
Фамилия
Табель
Таб
/
Бриг
3
Выр
/
Бриг
3
Таб
/
Бриг
5
Выр
/
Бриг
5
Ефимов
А
.
П
.
▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒
446
▒▒▒▒▒
▒▒▒▒▒
446
446
446
280050
130000
446
446
446
50000
80065
10020
Ларионов
Т
.
С
.
▒▒▒▒▒▒▒▒▒▒▒▒▒▒
321
▒▒▒▒▒
321
321
25070
60000
321
321
650000
Рис
. 1
Для
наглядности
здесь
выведены
табельные
номера
ра
-
ботников
из
всех
бригад
.
Видим
,
что
ЕФИМОВ
А
.
П
.
с
табельным
номером
446
в
файле
BRIG3.DBF
имеет
две
записи
,
а
в
файле
BRIG5.DBF -
три
,
ЛАРИОНОВ
Т
.
С
.
в
бригаде
номер
3 -
две
запи
-
си
,
а
в
бригаде
номер
5 -
одну
.
Здесь
повторяющиеся
поля
из
старшей
базы
отображены
символом
заполнения
.
Для
быстрого
перемещения
от
записи
к
записи
в
старшей
базе
можно
исполь
-
зовать
клавиши
Ctrl-<
вниз
>/<
вверх
>.
Хотя
клавиши
дополнения
и
удаления
(Ctrl-N, Ctrl-T)
здесь
доступны
,
они
действуют
только
на
старшую
базу
.
Если
при
этом
нужно
,
чтобы
что
-
то
происходило
и
с
младшими
базами
,
следует
их
перепрограммировать
.
Команды
DISPLAY/LIST
предъявляют
записи
похожим
об
-
разом
,
но
для
каждой
сцепленной
записи
из
младших
баз
значе
-
ния
полей
из
старшей
базы
будут
повторяться
.
Ниже
приведен
результат
выполнения
команды
LIST a.fam,a.tab, b.tab,b.vir,c,tab,c.vir OFF :
A.FAM
A.TAB B.TAB B.VIR
C.TAB
C.VIR
ЕФИМОВ
А
.
П
.
446 446 280050
446
50000
ЕФИМОВ
А
.
П
.
446 446 130000
446
80065
ЕФИМОВ
А
.
П
.
446 446 0
446
100020
ЛАРИОНОВ
Т
.
С
. 321 321 25070
321
650000
ЛАРИОНОВ
Т
.
С
. 321 321 60000
321 0
Рассмотренный
пример
соответствует
сцеплению
одной
базы
с
одной
.
При
этом
реализовано
два
уровня
данных
.
База
KADR.DBF
образует
старший
,
первый
уровень
,
а
база
BRIG3.DBF
второй
уровень
(
рис
.2,).