Добавлен: 28.11.2018

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

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

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

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. 

 
 
 
 
 


background image

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). 

Оба

типа

связей

могут

быть

распространены

на

несколько

баз

сразу


background image

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 < 

имя

файла

связи


background image

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 

&& 

Отмена

всех

связей

 
 


background image

35

Фамилия

Табель

Таб

/

Бриг

Выр

/

Бриг

Таб

/

Бриг

Выр

/

Бриг

Ефимов

А

.

П

▒▒▒▒▒▒▒▒▒▒▒▒▒▒

▒▒▒▒▒▒▒▒▒▒▒▒▒▒

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,).