Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы 2 / ЛекцБазы данных.doc
Скачиваний:
59
Добавлен:
26.04.2015
Размер:
1.08 Mб
Скачать

7.15. Работа с несколькими бд, связывание бд

Используется принцип рабочих областей. В каждый момент времени пользователь работает в одной из 25 рабочих областей. В каждой рабочей об­ласти может быть открыт один файл БД, до 7 индексных файлов и один фор­матный файл. Максимальное число открытых файлов при этом не может превышать 15.

Для переключения рабочих областей в ходе работы используется команда: SELECT <номер рабочей области> / <алиас>

Алиасами рабочей области являются латинские буквы от А до J. Доступ к данным из других рабочих областей осуществляется по её алиасу.

Например, чтобы обратиться к некоторому полю файла из другой рабочей области необходимо использовать конструкцию:

<алиас>  <имя поля>

Например:

SELECT A

USE STUD

SELECT В

USE ICZ

A  FIOS

Для наглядности вместо номеров областей или букв можно использовать имена БД, открытых в этих областях, или альтернативные имена этих баз.

81

Например:

SELECT В

USE SOTR ALIAS S2

В дальнейшем при необходимости сделать область 'В' текущей можно написать:

SELECT S2

Если альтернативное имя не назначено, то по умолчанию им становится основное имя БД.

Например:

SELECT В

USE SOTR

Далее можно написать:

SELECT SOTR

В команде USE можно указывать и область, в которой открывается база:

USE KADRS IN A

Однако перехода в указанную область здесь не происходит. Для перехода необходимо указывать SELECT.

Существуют две возможности связывания двух БД. Первый способ обеспечивает объединение двух БД из разных рабочих областей в новом файле:

JOIN WITH <алиас> ТО <имя файла новой БД>

FOR <условие> [FIELDS <список полей>]

Если список полей отсутствует, берутся все поля из текущего файла и все поля из алиасного.

Записи нового файла формируются по следующему правилу:

Для каждой записи текущего файла просматриваются все записи алиасного файла с проверкой условия. Если условие выполняется, то объединенная запись добавляется в новый файл.

При использовании этого способа необходимо знать о наличии места на диске.

Например, слияние двух баз данных : “SPISOKD(Name, Cena, Kod)” (табл. 7.1) и “KOLDETAL (Kod, Kol, Data )” (табл. 7.2) в один - “Справочник деталей” производится следующим образом:

S

Имя поля Тип Длина

Kod C 4

Kolich N 6.2

Data C 4

PISOKD Таблица 7.1. KOLDETAL Таблица 7.2.

Имя поля

Тип

Длина

Name

Cena

Kod

C

N

C

40

6.2

4

82

Слияние баз:

SELECT B

USE KOLDETAL

SELECT A

USE SPISOKD

JOIN WITH В ТО ОТНЕТ FOR Kod = B  Kod

FIELDS Kod, Name, Cena, В  Kolich, В  Data

Программа:

SET TALK OFF

CLEAR

SET DEVICE TO SCREEN

SELECT В

USE KOLD

SELECT A

USE SPISOKD

INDEX ON KOD TO KODIND

JOIN WITH В TO OTCHET FOR Kod = В  Kod

FIELDS Kod, Name, Cena, В  Kolich, В  Data

CLOSE ALL

USE OTCHET

INDEX ON NAME TO INDOTCH

@ 1,1 SAY 'Список деталей'

STORE 2 TO ST

STORE REPLICATE ('_', 20) TO CHERTA

  1. 2,1 SAY CHERTA

DO WHILE .NOT. EOF()

? N, Name

SKIP N = N +1

ENDDO

CLOSE ALL

SET TALK ON

RETURN

Второй способ связывания не создает нового файла, а только связывает указатели текущей записи в активном и алиасном файлах.

Связывание обеспечивается командой:

SET RELATION ТО [<ключевое поле>/RECNO()/<выражение> INTO <алиас>]

или SET RELATION TO <ключевое поле> INTO <алиас>

SET RELATION TO <выражение> INTO <имя>

SET RELATION TO RECNO () INTO <алиас>

Для работы этой команды необходимы следующие условия:

- открытый файл в текущей рабочей области;

  • открытый файл в другой рабочей области;

83

- если используется опция <ключевое поле>, то главный файл должен быть ин-

дексирован по этому полю и оба файла должны иметь его в своей структуре;

RECNO ( ) функция, которая определяет номер текущего кортежа в активном отношении.

Суть работы команды:

1) Если указана опция <ключевое поле>, то каждая запись активного файла связывается с первой записью алиасного файла, имеющего такой же ключ.

2) Если указана опция RECNO( ), то каждая запись активного файла связывается с записью алиасного файла, имеющего тот же номер.

3) Если используется опция <выражение>, то каждая запись активного файла связывается с одной записью алиасного файла, номер которой равен значению <выражения>.

Пример 7.9.

SPISOKD (Name, Cena, Kod)

KOLD (Kod, Kolich, Data)

ОТСН (Kod, Name, Cena, Kolich, Data)

SELECT В

USE KOLD

SELECT A

USE SPISOKD

INDEX ON Kod TO KODNDX

SET RELATION TO Kod INTO В

LIST Kod, Name, Cena, В  Kolich, В  Data

Индексируется при этом только главный файл.

Пример 7.10. Работа с тремя БД. Пусть имеется 3 БД:

KADR (FIO, GR, DOLG, STAG)

O

A B

KLAD (FIO, OTDEL, SUM)

DOPL (FIO, DOPL)

S

KADR

FIO

DOLGN

OKLAD

FIO SUMMA

ELECT A

USE KADR INDEX ON FIO TO KADR1

SELECT B

U

FIO, DOLGN

SUMMA

SE OKLAD INDEX ON FIO TO OKLAD1

SELECT C

USE DOPL

INDEX ON FIO TO DOPL1

  • С

    Рис.7.18

    вяжем таблицыKADR и OKLAD (рис.7.18)

SELECT A

SET RELATION TO FIO INTO B

L

84

IST FIO, DOLGN, B SUMMA

  • Далее свяжем таблицы OKLAD и DOPL

SELECT В

SET RELATION TO FIO INTO С

LIST FIO, SUMMA, С  DOPL, С  DOPL + SUMMA

REPLACE ALL SUMMA WITH С  DOPL + SUMMA

Связывание таблиц оператором LOCATE.

Пусть имеется 3 БД: STUDENT (NS, FIO, GRUPPA)

DISCIPL (ND, NAME_D, KAF)

YSPEV (NS, ND, ОС)

Пример 7.11. Поиск студентов, получивших 5 по всем предметам:

SELECT A

USE STUD

SELECT В

USE DISCIPL

SELECT С

USE YSPEV

LOCATE FOR ОС = 5

IF FAUND( )

ST=2

DO WHILE FOUND()

SELECT A

LOCATE FOR NS = C  NS

IF FOUND ()

@ ST, 1 SAY FIO

@ ST.20 SAY GRUPPA

ENDIF

ST = ST + 1

CONTINUE

ENDDO

WITH "Нажмите ввод"

ELSE

@ 1,1 SAY "Отличников нет"

ENDIF

CLOSE ALL

Пример 7.12. Поиск студентов, получивших неудовлетворительные оценки по математике.

CLEAR

SELECT В

LOCATE FOR NAME_D = ‘ ’

NUM = ND

SELECT С

85

LOCATE FOR ND = NUM AND ОС = 2

IF FAUND()

ST = 2

DO WHILE FOUND()

SELECT A

LOCATE FOR NS = С  NS

IF ST > 20

WATE ' '

@ 2,0 CLEAR

ST = 2

ENDIF

ST = ST + 1

IF FOUND()

@ ST,1 SAY FIO

@ ST,20 SAY GRUPPA

ENDIF

SELECT С

CONTINUE

ENDDO

WITH "Нажмите ввод"

ELSE

@ 1,1 SAY "Студентов с неудовлетворительной оценкой нет"

ENDIF

CLOSE ALL

RETURN

Соседние файлы в папке лабы 2