|
ПЫиеглЬд* Inlejpity |
j -Paiom Table 'ChUd Tabt» ' Ooloip Ьн«п |
Riil9C'VUpd«»r3 |
Puh< ifi hoWnfl |
Bfr D |
rasjij"-"» Restrict tmm Cascade mrm |
CmckJo ignore Ignore |
jlytOTO |
Jpwra»ir rjyxTtv |
Ru-esfer fleolng |
Which tulc do you waid to apply when a lecoid In the parent (able It dalotod?
* & |
icide: Delete all related retold* In the rtiilrt table fiearict Prohibit the deloiinn II there are related reroute In the child table. Jiyore: Allow the deletion and leave I elated recoids In the child table alone.
OK |
Help |
Cancel
Рис. 5.4. Задание условий ссылочной целостности.
Затем правой кнопкой мыши на экран вызывают контекстное меню, из которого выбирают команду Edit Relationship.
Для удаления взаимосвязи ее надо предварительно выделить, а затем нажать клавишу Del.
Одним из главных условий создания базы ддцных является обеспечите условий ссылочной целостности. Выполнение этих условий гарантирует помещение в базу данных только достоверной информации. Ссылочная целостность обеспечивается механизмом каскадных воздействий: каскадное удаление и каскадное редактирование ключевых полей. Каскадное удаление — это одновременное удаление записи из родительской таблицы с удалением соответствующих записей из всех дочерних таблиц. Удаление записи из дочерней таблицы не влечет за собой удаления соответствующей записи из родительской таблицы. Аналогично, при изменении зна- че»тя поля (полей) первичного ключа, необходимо изменить значение соответствую!него поля (полей) внешнего ключа дочерней таблицы (или таб.шц), то есть каскадное редактирование.
Для установления каскадных воздействий надо выделить линию взаимосвязи щелчком левой кнопки мыши и вызвать на экран контекстное меню, щелкнув правой кнопки мыши, когда курсор удерживается на линии связи. В появившемся на экране контекстном меню надо выбрать команду Referential Integnty. На экран выводится диалоговая панель Referential Integrity Builder (рис. 5.4).
В верхней части диалоговой панели Referential Integrity имеются графы:
• Parent Table — содержит имена родительских таблиц. Указателем (черным треугольником) отмечена текущая родительская таблица
• Child Table — содержит имена дочерних таблиц, которые могут быть соединены с соответствующим и родительскими таблицами.
• Update — содержит один из возможных типов каскадных воздействий при редактировании поля (полей) первичного ключа у соответствующей пары таблиц (имена таблиц указаны в левых графах).
• Delete — содержит один из возможных типов каскадных воздействий при удалении записи из родительской таблицы.
• Insert — содержит один из возможных типов каскадных воздействий при вставке записи в родительскую таблицу.
• Parent Tag — содержит имя тега в родительской таблице. В графе справа (Child Tag) будет указано имя соответствующего тега дочерней таблицы.
• Child Tag — содержит имя тега в дочерней таблице. В графе слева (Parent Tag), будет указано имя соответствующего тега родительской таблицы.
Установить соответствующий тип каскадных воздействий можно либо в верхней части диалоговой панели, либо в шгжней части диалоговой панели.
В верхней части диалоговой панели в одной из граф Update, Delete или Insert курсором мыши выделяют нужное поле (клетку). В поле появляется кнопка раскрывающегося списка, в котором можно выбрать одно из значений:
Cascade — при изменении значения поля (полей) первичного ключа или альтернативного ключа (Candidate) в родительской таблице автоматически выполняется каскадное изменение значения соответствующего поля (полей) внешнего ключа дочерней таблицы (таблиц).
Restrict — запрещает изменение значения поля (полей) первичного или альтернативного ключа в родительской таблице, если в Дочерней таблице (таблицах) имеются соответствующие значения во внешнем ключе.
Ignore — допускаются любые изменения в значениях первичного и альтернативного ключей в родительской таблице. Условия ссылочной целостности не контролируются.
Аналогично работают с графами Delete и Insert, но для графы Insert возможны только два воздействия: Restrict и Ignore.
В нижней части диалоговой панели имеются три вкладки:
Rules lor Updating — управление каскадным редактированием записей;
Rules for Deleting — управление каскадным удалением записей; Rules for Inserting — управление каскадным добавлением записей.
Тип воздействия Cascade, Restrict и Ignore устанавливается с помощью соответствующей радиокнопки.
5.5. ОБЪЕДИНЕНИЕ ДВУХ ТАБЛИЧНЫХ ФАЙЛОВ В ОДИН ФАЙЛ
В некоторых случаях требуется информацию из разных таблиц свести в одну таблицу. Одна таблица размешается в активной рабочей области, а вторая таблица — в пассивной области. В результате объединения будет получен новый (третий) табличный файл, который будет записан по указанному адресу. В состав нового (третьего) табличного файла могут быть включены любые поля из двух объединяемых таблиц. Для этих целей используют команду:
JOIN WITH <псевдоним пассивной рабочей области>
ТО <нмя создаваемого файла>
(FOR <выр. L> I
[FIELDS Сспнсок имен полей> ]
[NOOPTIMIZE]
В опции FIELDS указываются имена полей как из активной рабочей области, так и из пассивной рабочей области. Если опция FIELDS опущена, то в создаваемый файл записываются все поля обеих таблиц.
Отметим особенности выполнения команды:
• Если в пассивной таблице нет записи с каким-либо значением общего поля, а в активной таблице такое значение общего поля имеется, то запись из активной рабочей таблицы не помещается в результирующую таблицу.
• Если в активной или пассивной таблице имеются записи с дублирующим значением общего поля, то в результирующий файл помещаются все найденные записи.
5.6. КОРРЕКТИРОВКА ДАННЫХ В СВЯЗАННЫХ ТАБЛИЦАХ
Иногда бывает нужно внести большое количество изменений в одну таблицу используя данные из другой таблицы. Для этого корректируемую таблицу надо поместить в активную рабочую область, а таблицу-источник для исправления данных — в пассивную рабочую область. Для этих целей предусмотрена команда:
UPDATE ON <кмя общего поля>,
FROM < псевдоним пассивной рабочей областн>
REPLACE <имя поля 1 в активной рабочей обласпО WITH <выражепне 1> [, <нмя поля 2 в активной рабочей областн> WITH <выражсиие 2>... ] [RANDOM]
Назначение опций.
ON — указывается имя общего поля. Причем обе таблицы должны быть проиндексированы по этому полю в порядке возрастания. FROM — указывается псевдоним пассивной рабочей области, в которую помещается таблица-источник данных корректировки. REPLACE — указывается имя поля в активной таблицы, куда надо внести изменения в соответствии с <выражением>, указанным в опции WITH и составленным по значениям полей пассивной таблицы.
К недостаткам этой команды следует отнести отсутствие контроля на достоверность данных после внесения изменений. Для обеспечения достоверности должны быть предприняты дополнительные меры.
5.7. СОЗДАНИЕ ИТОГОВОГО ТАБЛИЧНОГО ФАЙЛА
При создании отчетов необходимо иметь итоговые суммы по некоторым числовым столбцам (полям). Команда TOTAL создает Итоговый табличный файл, содержащий суммы по указанным Полям. Предварительно табличный файл должен быть отсортирован по ключевому полю. При работе команды подсчитывается сУММа по указанным числовым полям, поля других типов копируются в итоговый файл.
Содержание некоторых таблиц приведено на рис. 5.6. |
гнжолао |
4[Дрдц» 5jB«T£g> |
SjCortX* |
КТ стеной StHgrvti |
*П*Ю_ 101Алгл«0 |
10; Л«щнн |
И[Стсп*1 |
11СвЙ^Ю5^ ]2аЭ*у^эеьм 13 Aneru*rw#< 5Мыи»ж |
13!Мс*<вй UPiWb |
_ 1S Аэс«е I^UarwT }*7>Ь(/1(И1 |
Рис. 5.5. Взаимосвязи между таблицами. |
Формат команды:
TOTAL ON <имя ключевого поля> ТО <имя итогового файла> [SCOPE]
[FIELDS <список имен полей> ]
[FOR <вырХ1> J [WHILE <BUp.L2> ]
[NOOPTIMLZEJ
Назначение опций этой команды описано в п. 4.1.
5.8. ПРИМЕРЫ
Родительская тяйица | Дочерняя тябляцв | --------------------------- | |
Имя | Первичный кмоч | Имя | Внешпяй кооч |
Fain | Key Jam | Author Key Jam Ca og Customer Salesman Sale Sale | Key Jam Key fam Key fam Key fem_sk Keyjam.cs |
Im | Kcy_im | Author Catalog Customer Salesman Sale Sale | Key.im Key_im Keyjm Key_im Key im sk Kcy_im_cs |
Ot | Key_ot | Author Catalog Customer Salesman Sale | Key ot Key Ot Key ot Key_ot Key_ot_sk |
Town | Key_town | Author Customer | Key town Keyjcwn |
Street | Keyjrcet | Author Customer | Key_strcct Key_strect |
Customer | Key_cust | Account Older | Key cust Key_cust |
Catalog | Key_book | Author Sale Order | Key book Key~book Key“book |
Salesman Account Sale | Key salmn Key_acnt Key_docum | Order Sale Order Order | Key salmn Key acnt Key_acnt Key docum |
рис. 5.6. Содержание таблиц Fam, lm, Ot и Catalog.
При таком расположении данных в таблицах достаточно ^УДно определить, какому автору принадлежит та или иная кни- ^ Для облегчения просмотра и одновременного редактирования Четырех таблиц можно свести в одно окно Browse либо все поля Вссх таблиц, либо некоторые поля всех таблиц.
Пример 1. Вывести в окно Browse информацию об авторах 11 их книгах.
Для этого надо взять четыре таблицы: Fam, Im, Ot и Catalog, установить между ними взаимосвязи и результат вывести в окно
Browse. J
&& Закрытие всех файлов && Задание рабочего каталога |
CLOSE ALL SET DEFA TO E:\PRIMER |
Предполагается, что все таблицы (Fam, Im, Ot и Catalog) уже созданы и заполнены, и индексы для всех таблиц построены по условиям примеров гл. 4.
USE Catalog.dbf IN 6 ALIAS ctl INDEX catalog;
ORDER TAG tag(2)
USE Fan.dbf IN 10 ALIAS Earn INDEX fam ORDER TAG Name USE Im.dbf IN 11 ALIAS im INDEX im ORDER TAG tag(l) j USE Ct.dbf IN 12 ALIAS ot INDEX ot ORDER TAG Ot SELE Ctl
SET RELATION TO Key_im INTO im, key_ot INTO ot StLECT fam
SET RELATION TO Key_fam INTO ctl SET SKIP TO ctl
BROWSE FIELDS fam.name_fam, im.name_im, ot.name_.ot,? Ctl.name_book
Результат выполнения этой программы приведен на рис. 5.7. На рис. 5.7 видно, что издано несколько книгавторов Гоголя Н. В. и Пушкина А. С., авторы Короленко В. Г. и Куш М. С. имеют по одному изданию. В поле Name_fam взаимосвязь «один-ко-многим» отображена многоточием.
Особое внимание следует обратить на назначение текуШИ* индексов. Для таблиц Fam, Im и Ot текущими индексами буду! первичные ключи. Для таблицы Catalog текущим индексом будет внешний ключ Fam, так как эту таблицу надо просматривать по полю Key_fam и выбирать фамилии соответствующие указанному внешнему ключу.
В командах USE часть текущих индексов задана именами тегов, а часть — функциями TAG, возвращающими имя тега по его порядковому номеру.
|
|
|
|
Haeeja* | Навс» ч i |
| Namebnofc If |
■"бвммамж | 1_________..! |
| |
Гогопь ——................. —............. | .ИиколвЛ | [Восмпьвяич iBacmimbwi | Р»оср Мертвые |
| inmWloH [йжоый | Вкипьеы* | Вемогм к» еуорв 6*о Джяыо! тйзеесш |
Г шок |
| -------- —------------------------------------------------------------ Ш | |
Двоамв___________; | [iwm | 'Сергею* | гНюы»влст»*е «мет |
"*Е-орсв |
|
|
|
ЗаРисо |
|
| I |
СпиЛЖО |
|
|
|
клбмв |
| J ' - f — -,, 1 |
|
Коржааж |
| J |
|
дГКсрзшехо______ | блапжк! | Тмектмэпсеи! | Г OOCCTV у рвсолэсч I |
Щ Kyi | Моисей | Cewew;Твлвт>в^вчв>»овго1Ий.зает» | |
Угееи._______________ j |
|
|
|
НТЛосвв _ ' |
|
|
|
Д Нагл |
|
|
|
A. Her.. I |
| ....... н | |
Я Пулкж | Аяеясдчи) | Сергеевич | Иэбрв«<е |
Я.................. Апгнсачи> 1 | Сергеев»н | Евг*»*Л Окт | |
3 _ 2Zj | Сергеев»*____ | Пцж» | |
| Сергеевич | 1ео“ __________________________________ Jr.l |
---------- ____ Рис. 5.7. Результат выполнения программы примера 1. |
Пример 2. Свести в одну постоянную таблицу поля Fam.Name_fam, Im.Name_im, Ot.Namc_ot и Ctl.Name_book. CLOSE ALL && Закрытие всех файлов
SET DEFA TO E:\PRIMER && Задание рабочего каталога
USE Catalog.dbf IN 6 ALIAS ctl INDEX catalog;
ORDER TAG Fam
USE Fam.dbf IN 10 ALIAS fam INDEX fam ORDER TAG Name USE Im.dbf IN 11 ALIAS im INDEX im ORDER TAG Im USE Ot.dbf IN 12 ALIAS ot INDEX Ot ORDER TAG ot SELECT ctl
J0IN WITH fam TO Summa.dbf;
POR ctl.Key_fam= fam.Key_f am;
FIELDS ctl.Name_book, fam.Name_fam, ctl.Key_im, CU1.Key_ot
l'SE summa.dbf IN 13 ALIAS Sum SELECT sum
JOIN WITH Im TO Summal FOR im.Key_im=sum.Key_im; fields sum.Name_fam, im.Name_im, sum.Key_ot
*Л WCHMW4 |
;м»е*а„ ^Нииччй_ Нкммй |
Сякуитм______________;Т«пяжцт» вовдхс«гддж.з»«»ра В<силм»м_ |Р«оср Мергаыадуш BacMO»»w IflwuMf «уоробоо Дням» Bannwew ~ [Повести {к^ражм |
Йй______ [Гогоя* |
Гога л_ П хил* |А«*е*«р _ Щ_|Гужж__ ^Аяв(с»йв_ Г jau«i_____________ A/«mkl3_________ [Ctprewns __________ <ui«c*cs_ ____[с^)геееи<_________ ^П(юм Коtiw«Впяои^^ >Г»п<Л |
.Ншолай \tn |
Iixopwtw -MgaHKis ЯвЦЛвМЧ_______ ЦрЫЫЖИ»_ СКИ»1 |
Рис. 5.8. Результат выполнения программы примера 2. |
Результат выполнения программы представлен на рис. 5.8 После выполнения программы примера 2 в каталог PRIMER будет добавлено три новых табличных факта — Summa, Summal и Summa2. Пример 3. Подсчитать сумму каждого заказа и обший объем проданных книг в натуральном и денежном выражении. В таблице Order имеются сведения о наименовании проданной книги (Key_book), о количестве экземпляров каждого наименования книг (Volume) и предоставленной торговой скидке. ИШ таблиц Fam, Im и Ot надо подставить (по ключам) фактические значения фамилии, имени и отчества автора книги, и из таблицы Catalog подставить фактическое название книги. |
sum.Name_book, USE Summal.dbf IN 14 ALIAS Suml SELECT suml JOIN WITH Ot TO Summa2 FOR ot.Key_ot=suml.Key_ot; FIELDS suml.Name_f am, suml.Name_im, ot.Name_ot,; suml.Name_book USE Summa2.dbf IN 15 ALIAS Sum2 SELECT sum2 BROWSE |
CLOSE ALL && Закрытие всех файлов SET DEFA ТО Е:\PRIMER && Задание рабочего каталога USE Order.dbf IN 5 ALIAS ord INDEX order; ORDER TAG Book USE Catalog.dbf IN 6 ALIAS ctl INDEX catalog; ORDER TAG Fam USE Fam.dbf IN 10 ALIAS fam INDEX fan; ORDER TAG Name USE Im.dbf IN 11 ALIAS im INDEX im; ORDER TAG Zm USE Ot.dbf IN 12 ALIAS Ot INDEX ot; ORDER TAG ot SELE ctl SET RELATION TO Key_im INTO im, key_ot INTO ot,; Key_book INTO ord SELECT fam SET RELATION TO Key_fam INTO ctl SET SKIP TO ctl BROWSE FIELDS «Автор» = ALLTRIM[fam.name_fam) +; ' + ALLTRIM(im.name_im) +; ' + ALLTRIM(ot.name_ot),; ct1.name_book:H=«Наименование»: 4 0,; ord.volume:Н=«Кол-во», ctl.price:Н=«Цена»,; ord.proc:H-«Скидка»,; «Сумма» = ord.volume*ctl.price*(100-ord.proc)/100; NOWAIT CLEAR SELECT fam SET ORDER TO name m=o n2=o 1)0 while.T. lF eof() EXIT |
ENDIF
nl = r.l + ord. volume
n2 = n2 + ord.volume*ctl.price*(100-ord.proc)/100
SKIP
ENDDO
? «Объем продаж», nl, «книг»
? «Общая сумма продаж», п2
В окно Browse помещены два вычисляемых (виртуальных) поля:
• фамилия, имя и отчество автора:
«Аз сер» = ALLTRIM (fam. rsane_f am) + ' * + ALLTRTM (im. na.roe_iin> j,
+ ' ' + ALLTRIM(ot.name_ot),;
• сумма проданных книг, указанного автора, с учетом торговой скидки:
«Сумма» = ord.volume*ctl.price*(100-ord.proc)/100 -И
Если торговая скидка не предоставляется (т. е. торгов^™ скидка составляет 0%), то сумма покупки все равно рассчитывается по той же формуле (для книги Пушкин А. С. «Избранное»).
С помощью цикла DO WHILE рассчитывается общее коли ство проданных экземпляров книг и общая сумма всех прод Результат вычислений выводится в окно Visual FoxPro. Чтс увидеть результат расчета вместе с окном Browse, надо в кома: BROWSE предусмотреть опцию NOWAIT.
Результат выполнения программы представлен на рис. 5.9.
Пример 4. Подсчитать количество проданных книг каждому клиенту можно также с помощью команды TOTAL, при этом в файл проекта добавляется новый табличный файл- Для подсчета общей суммы от продажи всех книг также придется использовать никл (в программе цикл не показан). На рис. 5.10 вверху показана исходная таблица Order, из которой видно, что клиент 1 (поле Key_cusl) сделал два заказа (поле Keyorder) на 200 и 100 экземпляров, внизу показана итоговая таблица ReA 9 которой подсчитано количество проданных экземпляров книг по
пред»* S0C КИИ- Of щая спш» продаж 46SjCOOO |
В1«!П |
Кф*вви1______________________________
I оро Гдл»пск» Пометы и р*джмы_____
(здМениб Семулоеич^ }Тс*счв*«* гчо^ иго*» алегра
Ле»* _ _____ 1________________
(100X1 |
Ло:«.
Нитамсс*__ ________ _____
ооох
rv^i*^ Дао» миф Ccpr cot^ &w* r-Wf Ссргсш* Саносюе Ocrcce
Obfafyy*_________________
■iur^________________________
! UctNwwoTapjcrp^opfcO^_;Иэйрато»
.Трдгоы** Ссктц
Рис. 5.9. Результат выполнения программы примера 3.
каждому клиенту. Чтобы подсчитать количество проданных экземпляров книг по каждому клиенту, надо индекс, построенный по нолю Key cust, сделать текущим.
CLOSE ALL ScSc Закрытие всех файлов
SET DEFA ТО E:\PRIMER && Задание рабочего каталога
USE Order.dbf IN 5 ALIAS ord INDEX order;
ORDER TAG Book
SELECT ord
SET ORDER TO TAG tag(2)
TOTAL TO rez ON Key_cust FIELDS volume USE rez.dbf IN 1 ALIAS rez SELE rez
Key_oider| ICcf_cu»t |
HDf |
Кру talmn К> v book Volume Proc Key1 acnt
2 3‘ 200 5 00 31
...
Рис. 5.10. Вверху — исходная таблица Customer, внизу — результат работы команды TOTAL (таблица Rez). В таблице Rez посчитан итог по первому клиенту (Key_cust = 1), поэтому количество строк уменьшилось на 1.
5.9. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. По какому признаку определяются родительская таблица и дочерняя таблица?
2. Что такое общее поле? Какими свойствами обладает общее поле?.
3. Назовите три типа объединения таблиц.
4. Пер числите действия, которые необходимо выполнить перед установлением взаимосвязи между таблицами.
5. Назовите шесть подходов установления взаимосвязи между таблицами.
6. Какое назначение и какие особенности работы команды JOIN9
7. Какое назначение н какие особенности работы команды UPDATE7
8. Какое назначение и какие особенности работы команды TOTAL?
9. Какое назначение и какие особенности работы команды SET RELATION ТО?
jO. Какое назначение и какие особенности работы команды SET SKIP ТО?
11. Что такое рабочая область и каково максимальное количество рабочих областей?
12. Как присваиваются имена и номера рабочим областям?
13. Укажите назначение алиаса рабочей области.
14. Объясните понятие текущей рабочей области. Как установить текущую рабочую область?
15. Укажите направление установления взаимосвязи «один-к-одному».
16. Объясните понятие «ссылочная целостность».
|7. Объясните понятие «каскадное воздействие».
18. Что такое каскадное изменение?
19. Что такое каскадное удаление?
20. Как установить ссылочную целостность между таблицами?
21. Как задать каскадные воздействия между таблицами?
Глава 6
РАБОТА С ПРОГРАММНЫМИ ФАЙЛАМИ
При работе с базой данных часто бывает необходимо при каждом новом запуске представлять на экране одну и ту же базу данных в различных вариантах. Процесс конфигурирования базы данных достаточно длительный. Для облегчения этого процесса используют программные файлы. В каждом программном файле записывают и сохраняют на диске один из вариантов конфигурации базы данных. Впоследствии, запуская программный файл на выполнение, получают желаемую конфигурацию базы данных.
6.1. СОЗДАНИЕ ПРОГРАММНОГО ФАЙЛА
Программный файл создается с помощью встроенного текстового редактора FoxPro. Текстовый редактор можно запустить как из окна Command, так и из Главного меню.
а.Чтобы запустить текстовый редактор из окна Command, в этом окне надо задать команду:
MODIFY COMMAND | FILE [<имя файла> |?]
[NOEDIT]
[NOMENU]
[NOWAIT]
[RANGE <Bbip.NI>, <nbip.N2>]
[[WINDOW <нмя окна 1>]
[IN [WINDOW'] <имя окна 2> | IN SCREEN ]
[SAME]
[SAVE]
Ключевое слово COMMAND предназначено как для создания нового программного файла (имя файла не указывается) с расширением.pig, так и для открытия уже существующего файл® (имя файла указывается либо полностью, либо частично — п° шаблону).
Ключевое слово FILE предназначено только для открытия существующего программного файла, причем имя файла надо указывать полностью.
Если имя файла не известно, то вместо имени файла можно указать символ «?* и на экран будут выведен список имен программных файлов (с расширением.prg), где можно выбрать имя нужного файла.
Назначение опций:
NOEDIT — разрешает просмотр текста, но редактирование текста запрещено;
NOMENU — запрещает вызов системного меню окна редактирования, то есть блокирует клавишу F10 и кнопку в левом верхнем углу окна редактирования.
NOWAIT — после открытия окна редактирования разрешает работу (без пауз) программы, вызвавшей открытие окна редактирования. В противном случае работа программы прерывается до закрытия окна редактирования
RANGE <выр.М1>, <Bbip.N2> — при работе с Мето-иолем позволяет выбрать часть текста в указанном интервале от <выр.Ы1> до <выр.Ы2>.
WINDOW <нмя окна 1> — открывает окно редактирования с характеристиками другого предварительно открытого окна <имя окна 1>.
IN WINDOW <имя окна 2> — открывает окно редактирования внутри окна <имяокна2>.
IN SCREEN — опция задана по умолчанию. Открывает окно редактирования внутри главного окна FoxPro.
SAME — если текст программы, текст документа или Мето-поде Уже открыты, то запрещает новое редактирование в окне редактора.
Дата добавления: 2015-09-29; просмотров: 30 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |