Добавлен: 28.11.2018

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

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

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