Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных / lab6OBDRob_s_dekilkoma_b_d

.doc
Скачиваний:
7
Добавлен:
07.02.2016
Размер:
64.51 Кб
Скачать

Лабораторна робота№ 6 (2г)

Тема роботи: Робота з декількома базами.

Мета роботи: одержати навички в визначенні зв'язків між БД у FOXPRO та роботі з робочими областями.

Рекомендована література:

  1. Попов А.А. Програмування в середовищі СКБД FOXPRO 2.0. -М. ,Радіо і зв'язок, 1998

  2. Обробка даних за допомогою комп'ютера (під. ред. А. А. Стогни ) Київ. Выща школа. 1991

  3. Гончарів А.FOXPRO у прикладах. Версії 2.5, 2.6, 3.0,Пітерпрес, 1996

  4. Джон Кауфельд FOXPRO 2.6 FOR WINDOWS Для «чайників». К. Діалектика. Інформейши Комп'ютер Ентерпрайз. 1996.

І. Теоретичні відомості

У FoxPro допускається робота відразу з багатьма базами даних і при цьому

можливо встановлення різноманітних зв'язків між ними. Покажчики записів

у таких зв'язаних базах будуть рухатися синхронно. База, у якій покажчик

рухається довільно, вважається старшої, а база/бази, у якій покажчик випливає

за покажчиком старшої бази, -молодшої. У старшій і молодшій базах повинні бути

поля, які несуть якусь загальну ознаку, інакше, хоча зв'язок і можливий, він

буде безглуздим. Допускається зчеплення однієї бази з декількома іншими.

Молодші бази, у свою чергу, можуть бути зв'язані з базами наступного рівня і т.д.

Можливе встановлення двох типів зв'язків між записами двох зчеплених баз даних.

Зв'язок типу: " один-до-одного" переміщає покажчик у молодшій базі таким чином,

що він завжди установлюється на перший зустрінутий їм запис зі співпадаючою

ознакою. Інші такі записи (якщо вони є) залишаються "не заміченими". Цей зв'язок установлюється просто командою SET RELATION. Зв'язок типу: " один-до-багатьох" дозволяє звернутися до всіх записів молодшої бази зі співпадаючою ознакою

(команди SET RELATION і SET SKIP TO).

Понятие о рабочих областях

В FoxPro можливо обробляти одразу декілька файлів баз даних (до 25). Кожен такий файл типу DFB і всі допоміжні файли (наприклад індексні) відкриваються у своєї окремої робочої області. Перехід з області в область здійснюється командою

SELECT <робоча область/псевдонім >

Перші десять робітників областей ідентифікуються номерами 1-10 або буквами A-J. Області з 11-й 25-ю позначаються номерами або буквено-цифровими іменами W11 - W25. Якщо як параметр вказати цифру 0, відбудеться перехід у першу вільну робочу область. Крім того, робітники області і файли бази даних можуть ідентифікуватися так названими псевдонімами. Псевдонім області за замовчуванням є саме ім'я файлу бази даних, який знаходиться у неї. Як псевдонім можна вказати і будь-яке інше слово в команді USE. Використання псевдоніма дозволяє при роботі з різними базами називати їх одним ім'ям (псевдонімом). Це робить програму незалежної від імені конкретної бази. Область, у якої ми знаходимося в даний момент, називається активною робочою областю, і в ній можна працювати з базою даних, яка знаходиться тут, використовуючи всі припустимі команди системи. Одночасно навіть в одній команді можна мати доступ (з декілька обмеженнями) до полів інших баз. У цьому випадку ім'я полю з неактивної області - складне. Власному імені полю передує ім'я робочої області або псевдонім, які розділені знаками "-" і ">"або (що більш зручно) крапкою:

<робоча область/псевдонім> -> <ім'я полю>

або <робоча область/псевдонім>.<ім'я полю>

Наприклад, складні імена для поля FAM з бази KADR.DBF ідентичні, якщо ця база відкрита в області A або 1 :

KADR.FAM, A.FAM, KADR->FAM, A->FAM.

Робоча область у складному імені вказується будь-яким дозволеним образом (буквою, ім'ям її бази даних, псевдонімом), але ні номером. Номер може бути зазначений у команді SELECT і у функціях. У кожній області підтримуються свої покажчики записів, на

положення яких не впливають переходи між областями.

При вході в СКБД активізується область 1 (або A), і, якщо ви працюєте тільки з одною базою, піклуватися про відкриття областей не потрібно.

Приклад:

У файлі KADR серед інших утримуються зведення про прізвища і табельні номери працівників, а у файлі BRIG1 - про табельні номери TAB і вироблення VIR. Необхідно на прізвище (наприклад, МИРОНОВ) з файлу KADR знайти його вироблення з файлу BRIG1.

SЕLECT a - перехід в область A

USE brig1 - відкриття файлу BRIG1.DBF

SELECT b - перехід в область B

USE kadr - відкриття файлу KADR.DBF

LOCATE FOR fam='МИРОНОВ' - пошук запису з прізвищем МИРОНОВ

SELECT a - перехід в область A

LOCATE FOR tab=b.tab - пошук запису у файлі BRIG1 з та-

бельним номером МИРОНОВА

? b.fam tab, vir - видача даних з обох баз

МИРОНОВ Р.И. 468 204.00

У команді USE можна одночасно вказувати й область, у якої відкривається база. Однак перехід у зазначену область не відбувається. Так, після виконання команд USE brig1 IN a і

USE kard IN b ми залишимося в поточній області A і команда SELECT B знадобиться все рівно.

Очевидно, що такий засіб зв'язку файлів дуже трудомісткий, коли потрібно встановити зв'язок не з однієї, а з декількома прізвищами.

У FoxPro є команда, яка спрощує цю задачу.

Команда SET RELATION TO <ключ> INTO < область>

[, <ключ> INTO <область>...] [ADDITIVE]

зв'язує покажчик записів в активній робочій області з покажчиками з інших робочих областей, імена яких зазначені після слова INTO, по заданому загальному полю (ключеві). Єдина умова - файл, з яким установлюється зв'язок, повинний бути індексований по цьому полю.

Приклад:

Зв'язати файл KARD.DBF і BRIG1.DBF по полю TAB.

Вивести для кожного табельного номеру файлу BRIG1.DBF відповідне прізвище і вироблення.

USE brig1 IN a

USE kadr INDEX kadrtab IN b

SET RELATION TO tab INTO b

LIST tab, vir, b.fam

Результат на екрані:

Record # TAB VIR B.FAM

1 98 446.00 ПОТАПОВ Д.П.

2 6 480.72 КУЛАКОВА М.И.

3 13 12.00 СИДОРОВ П.С.

4 468 204.00 МИРОНОВ Р.И.

Тут виведені записи файлу BRIG1.DBF, у які включено поле відповідних їм прізвищ KADR.DBF (B.FAM).

У FoxPro є можливість установлювати зв'язки з декілька базами одночасно. Якщо зі старшим файлом, який вже зв'язаний з іншим, необхідно зв'язати деякий третій (четвертий і

т.д.), потрібно в усі наступні команди SET RELATION включати слово ADDITIVE, що забезпечить збереження зв'язків, які були встановлені раніше.

Зв'язок між усіма файлами одночасно розривається командою

SET RELATION TO без параметрів.

Зв'язок з окремим файлом у заданої < області > розривається командою

SET RELATION OF INTO < область>

Наступна команда встановлює зв'язок "один-до-багатьох" між двома або декількома базами даних:

SET SKIP TO[< область1> [, < область2>]...]

При цьому с кожним записом зі старшої бази можуть бути зчеплені декілька записів з молодшої бази. Зв'язок може бути встановлений відразу з декількома молодшими базами, що знаходяться в зазначених <областях>.

Перш ніж використовувати команду SET SKIP TO, необхідно виконати початкове зчеплення виду „один-до-одного” командою

SET RELATION. Видалення зв'язку „один-до-багатьох” здійснюється командою SET SKIP TO без параметрів.

П р и м е р:

Розглянемо приклад організації зв'язку однієї бази з декількома базами, причому цей зв'язок буде реалізований за схемою " один-до-багатьох".

Покладемо, що у бригадних файлах BRIG3.DBF і BRIG5.DBF деякі табельні номери можуть зустрічатися кілька разів (наприклад, якщо фіксується вироблення кожного працівника по окремим нарядам). Допускаємо також, що робітники можуть працювати відразу в декількох бригадах. Потрібно для кожного прізвища і табельного номеру з бази KADR.DBF пред'явити усі вироблення з баз BRIG3.DBF і BRIG5.DBF, що індексовані по полю TAB (індекси BRIG3.IND і BRIG5.IND).

Рішення приведене нижче:

SELECT a

USE kadr IN a && Відкриття старшої бази в області A

USE brig3 IN b INDEX brig3 && Відкриття молодшої бази в області B

USE brig5 IN c INDEX brig5 && Відкриття іншої молодшої бази в C

*Установлення зв'язку одна-з-однієї KADR.DBF з BRIG3.DBF, BRIG5.DBF

SET RELATION TO tab INTO b, tab INTO c

*Установлення зв'язку одна-со-многими бази KADR.DBF з

SEN SKIP TO b,c && базами BRIG3.DBF і BRIG5.DBF

BROWSE FIELDS a.fam :H='прізвище' , a.tab :H='Табель'

b.tab :H='Таб/Бриг3' , b.vir :H='Вир/Бриг3',;

с.tab :H='Таб/Бриг5' , c.vir :H='Вир/Бриг5'

SET RELATION TO && скасування всіх зв'язків

Для наочності тут приведені табельні номери працівників з усіх бригад. Бачимо, що ЄФІМОВ А.П. з табельним номером 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 280.50 446 50.00

ЄФІМОВ А.П. 446 446 130.00 446 80.00

ЄФІМОВ А.П. 446 446 0.00 446 100.00

ЛАРИОНОВ Т.С.321 321 25.70 321 650.00

ЛАРИОНОВ Т.С.321 321 60.00 321 0.00

Розглянутий приклад відповідає зчепленню однієї бази з декількома . При цьому реалізовано два рівні даних. База KADR.DBF утворить старший, перший рівень, а бази BRIG3.DBF і BRIG5.DBF - молодший, другий рівень .

Зчеплення баз можна поширити і на більше число рівнів. Наприклад, нехай є три бази даних ( <база1>, <база2>,<база3>), у яких утримуються дані про підприємства, цехи для усіх підприємств і ділянки для всіх цехів усіх підприємств. Необхідно зв'язати ці бази таким чином, щоб для кожного поточного запису з бази підприємств покажчик записів бази цехів ставав на перший запис, де знаходяться зведення про цех, приналежний даному підприємству, а покажчик у базі ділянок - на запис з інформацією про ділянку цього цеху. Природно, що усі бази повинні мати поля, що дозволяють зробити їхній власне зчеплення: база цехів повинна мати поле з назвою підприємство, а база ділянок - поле з назвою підприємства і поле з номерами цехів. Саме по цих полях повинне бути зроблене індексування.

На відміну від попереднього приклада , де зчеплення бази KADR.DBF виконувалося з усіма підлеглими базами відразу, тут команди SET RELATION TO уводяться в міру переміщення з області в область. Схема організації зв'язків приведена нижче:

USE <база1> IN a

USE <база2> IN b INDEX <індекс2>

USE <база3> IN c INDEX <індекс3>

SELECT a

SET RELATION TO <ключ бази1> INTO b && Зчеплення Бази1 з Базою2

SELECT b

SET RELATION TO <> INTO c && Зчеплення Бази2 з Базою3

Апарат зчеплення баз командою SET RELATION є могутнім засобом доступу до "родинних" даних. Однак, оскільки таке зчеплення волоче синхронне переміщення покажчиків записів у усіх підлеглих базах слідом за переміщенням покажчика в головної базі, це може віднімати багато часу у випадку, якщо доступ до молодшій базі в даний момент не потрібний. Тому часто буває доцільним тимчасове роз'єднання баз. У багатьох випадках узагалі краще удатися до пошуку потрібного запису командою/функцією SEEK, ніж до встановлення постійного зв'язку.

ІІ. Порядок виконання роботи

  1. Вивчити теоретичний матеріал.

  2. Виконати задачу відповідно до свого номера варіанта.

  3. Скласти звіт, в якому викласти коротко теоретичний матеріал, показати розв,язання задачі.

ІІІ. Індивідуальні завдання

Задани наступні файли, у яких зберігається інформація про магазин:

СЛУЖБОВЕЦЬ- номер, прізвище, адреса, номер відділу, посада, утворення, рік

народження, родиний стан, кількість дітей.

ВІДДІЛ- номер відділу, номер товару.

ТОВАР- номер товару, найменування, ціна, кількість, номер виробника товару, номер постачальника.

ВИРОБНИК- номер виробника товару, найменування виробника,

атрибути виробника ( адреса, телефон, факс, адреса елек-

тронної пошти).

ПОСТАЧАЛЬНИК- номер постачальника, найменування постачальника, атрибути постачальника ( адреса, телефон, факс, адреса електронної пошти).

1.Видати інформацію про найменування виробників товарів, які продає продавець Іванов за ціною більш ніж 300 гр.

2. Видати адреса і факс постачальників і найменування товарів, ціна яких більш ніж 50 гривень.

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

4. Назвати прізвища й адреса продавців, які торгують товарами від виробників з Росії.

5.Видати інформацію про всіх співробітників, що мають 3 і більш дітей, і які реалізують товари заданого номеру.

6.Назвати прізвища керівників відділів, що продають товар, який поставлений заданим постачальником.

7.Видати інформацію про виробника товару і кількість товару, який поставлений з Одеси.

8.Видати замовлення постачальникові про чергове постачання товару, кількість якого у відділі, керівник якого Петров, менш ніж 100 одиниць.

9. Назвати прізвища керівників відділів, що послали замовлення виробникам товарів з Мінська.

10. Видати інформацію для преміювання продавців-ветеранів, які продавали товар фірми-виробника "SAMSUNG".

11.Для проведення опитування для фірми, що робить ляльки Барбі, видати домашні адреси службовців, які мають дітей.

12.Для проведення опитувань серед службовців, що мають родини, видати список найменувань і цін товарів, які виробляються в Україні й окремо за рубежем.

13.Для постачальника з Києва видати інформацію про виробників з Києва, товари яких реалізовані за останній квартал.

14.Для виробника товарів із Дніпропетровська видати інформацію про постачальників з Дніпропетровська , що поставляли товари у відділ москательних товарів.

15.Для акції фірми "LG" - навчання службовців - видати інформацію про службовців, які реалізують вироби цієї фірми і не мають спеціальну вищу освіту.

Соседние файлы в папке Базы данных