книги / Проектирование автоматизированных информационных систем на основе объектно-ориентированного подхода
..pdfНа диаграмме, представленной на рис. П3.55, изображены только идентифицирующие отношения (Identifying Relationships) и список таб лиц совпадает с числом классов соответствующей диаграммы. Это не означает, что число классов и их структура будут всегда совпадать с ре ляционной моделью. Рассмотрим пример диаграммы модели данных, структура которой отличается от соответствующей диаграммы классов.
Рис. П3.56. Диаграмма заказа продукции
Построим диаграмму для заказа продукции. Соответствующая диаграмма классов представлена на рис. П3.15.
На диаграмме классов представлены классы: «Customer», «Or der», «OrderPositon» и «Product». Диаграмма данных будет содержать четыре одноименные таблицы и ряд дополнительных таблиц. К до полнительным таблицам отнесем таблицу единиц измерений, табли цу состояний документов и таблицу, определяющую набор состояний для конкретного документа.
Диаграмма для заказа продукции представлена на рис. П3.56. Таблица «Заказ» была названа «PROD_ORDER», потому что «ORDER» является служебным словом языка запросов SQL.
Часть операций классов может быть перенесена на уровень базы данных и реализована в виде триггеров, функций и процедур.
Рассмотрим пример создания триггера для таблицы «ORDERPOSITION». Назначение создаваемого триггера - автома тический расчет стоимости товарной позиции.
Для этого в окне спецификации таблицы «ORDER POSITION» перейдем на закладку «Triggers» и, воспользовавшись кнопкой «New», создадим новый триггер. Изменим системное имя триггера на «CALC_VALUES_BUI». Далее отметим события активации триггера («Trigger Event»): «Insert» и «Update». Для «Update» укажем поля «PRODUCT_ID», «MEASURE_UNIT_ID». Тип триггера («Trigger Туре») установим в «Before». Свойство «Granularity», определяющее, когда должен отрабатывать триггер, установим в «Row». В тело триг гера («Action Body») поместим текст, представленный ниже:
DECLARE
V_DATE DATE;
Begin
/^Определим дату заказа*/
SELECT ORDER_DATE
INTO V _DATE
FROM PROD_ORDER
WHERE I D = : NEW. O R D E R _ ID ;
/*Получим действующую цену без налогов на переданный продукт*/
:NEW.P R IC E : = F _ G E T _ C U R R E N T _ P R IC E ( :NEW.PRO DUCT _ID, :N E W .M E A SU R E _ U N IT _ ID , V _ D A T E , 0 ) ;
/*Рассчитаем сумму без налогов*/
:NEW.AMOUNT : = ROUND ( : NEW.P R IC E * : NEW.QUANTITY, 2 ) ;
Третья, заключительная, страница мастера (рис. П3.59) позволяет указать имя файла, в который будет записан DDL-скрипт, и опреде лить необходимость его непосредственного выполнения из Rational
Rose (опция «Execute»).
В случае установки «Execute» и заполнения параметров соедине ния Rational Rose не только создаст DDL-скрипт, но и выполнит его,
используя указанное соединение.
Результат работы мастера для нашей схемы представлен ниже:
CREATE TABLE DEPARTMENT |
( |
|
|
|
|
|
|
|
|||||||
ID NUMBER |
( |
1 0 |
) |
|
NOT |
NULL, |
|
|
|
|
|
||||
NAME VARCHAR2 |
( 1 2 8 |
) |
NOT |
NULL, |
|
|
|
||||||||
PHONE_NUMBER |
VARCHAR2 |
( |
|
3 2 |
) , |
|
|
|
|
||||||
FAX_NUMBER |
VARCHAR2 |
( 3 2 |
) , |
|
|
|
|
||||||||
COMPANY_ID NUMBER ( |
1 0 |
) |
NOT |
NULL, |
|
|
|||||||||
O F F IC E _ ID |
NUMBER |
|
( |
1 0 |
) |
|
NOT NULL, |
|
|
||||||
CONSTRAINT |
PK_DEPARTMENT |
PRIMARY |
KEY |
(CO M PAN Y _ID, |
|||||||||||
O F F I C E _ I D , I D ) , |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CONSTRAINT TC_DEPARTMENT_NAME |
UNIQUE |
(NAME) |
|||||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE M EASURE_UNIT |
( |
|
|
|
|
|
|||||||||
ID NUMBER |
( |
1 0 |
) |
|
NOT |
NULL, |
|
|
|
|
|
||||
NAME VARCHAR2 |
( |
3 2 |
) |
NOT |
NULL, |
|
|
|
|||||||
SHORT_NAME |
VARCHAR2 |
( |
1 |
|
) |
NOT |
NULL, |
|
|
||||||
CONSTRAINT TC_MU_SHORT_NAME UNIQUE |
(SH O R T _ N A M E ), |
||||||||||||||
CONSTRAINT PK_M EASURE_UNIT PRIMARY |
KEY ( I D ) , |
||||||||||||||
CONSTRAINT TC_MU_NAME |
UNIQUE |
(NAME) |
|
|
|||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE |
DOCUMENT_STATE ( |
|
|
|
|
||||||||||
ID NUMBER |
( |
5 |
) |
NOT |
NULL, |
|
|
|
|
|
|||||
ST A T E _ ID |
NUMBER |
( |
1 0 |
) |
NOT |
NULL, |
|
|
|
||||||
DOCUMENTED |
NUMBER |
( |
1 0 |
|
) |
NOT |
NULL, |
|
|
||||||
CONSTRAINT PK_DOCUMENT_STATE PRIMARY KEY |
|||||||||||||||
(DOCUMENT_ID, |
S T A T E E D , |
ID ) |
|
|
|
|
|
|
|
|
|||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE PROD_ORDER ( |
|
|
|
|
|
|
|
||||||||
ID NUMBER |
( |
1 0 |
) |
|
NOT |
NULL, |
|
|
|
|
|
||||
ORDER_NUMBER |
VARCHAR2 |
( |
|
3 2 |
) |
NOT |
N U LL, |
||||||||
ORDER_DATE DATE NOT NULL, |
|
|
|
|
|
||||||||||
SHIPMENT_DATE |
DATE, |
|
|
|
|
|
|
|
|
|
|||||
P R IO R IT Y |
NUMBER |
( |
1 |
) |
DEFAULT |
9 |
NOT |
|
N U LL, |
CUSTOMER _ID NUMBER ( |
1 0 |
) |
NOT |
NULL, |
|
||||||||||
CONSTRAINT |
PK_ORDER PRIMARY KEY |
( I D ) , |
|
||||||||||||
CONSTRAINT |
A K _ O R D E R _ l |
UNIQUE |
|
(ORDER_DATE, |
|||||||||||
ORDER_NUMBER) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE |
TABLE |
O R D E R _ P O S IT IO N ( |
|
|
|
|
|
||||||||
ID NUMBER |
( 1 0 |
) |
NOT |
NULL, |
|
|
|
|
|
|
|||||
O R DER _ID NUMBER ( |
|
1 0 |
) |
NOT |
NULL, |
|
|
||||||||
PRO DUC T _ID |
NUMBER |
|
( |
1 0 |
) |
NOT |
|
NULL, |
|
||||||
M E A S U R E _ U N IT _ ID |
NUMBER |
( |
1 0 |
) |
NOT |
NULL, |
|||||||||
QUANTITY NUMBER |
( |
|
1 0 , |
3 |
) DEFAULT 0 NOT NULL, |
||||||||||
P R IC E NUMBER |
( |
1 0 , |
2 |
) |
DEFAULT |
0 |
NOT NULL, |
||||||||
T A X _ P R IC E |
NUMBER |
( |
1 0 , |
2 |
) DEFAULT 0 NOT NULL, |
||||||||||
AMOUNT NUMBER |
( |
1 0 , |
2 |
) |
DEFAULT |
0 |
NOT |
NULL, |
|||||||
TAX_AMOUNT |
NUMBER |
|
( |
1 0 |
) |
DEFAULT |
0 NOT |
NULL, |
|||||||
CONSTRAINT |
P K _ O R D E R _ P O S IT IO N 6 |
PRIMARY |
KEY (O R D E R _ID , |
||||||||||||
ID) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE |
TABLE |
O F F IC E |
( |
|
|
|
|
|
|
|
|
|
|||
ID NUMBER |
( 1 0 |
) |
NOT |
NULL, |
|
|
|
|
|
|
|||||
NAME |
VARCHAR2 |
( |
1 2 8 |
) |
NOT |
NULL, |
|
|
|
||||||
ADDRESS VARCHAR2 |
( |
2 5 6 |
) , |
|
|
|
|
|
|
||||||
COMPANY_ID |
NUMBER |
|
( |
1 0 |
) |
NOT |
|
NULL, |
|
||||||
CONSTRAINT |
P K _ O F F IC E |
PRIMARY |
|
KEY |
(COMPANY_ID, ID ) , |
||||||||||
CONSTRAINT |
T C _O FFIC E _N A M E |
UNIQUE |
(NAME) |
||||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE |
TABLE |
COMPANY |
( |
|
|
|
|
|
|
|
|
|
|||
ID NUMBER |
( 1 0 |
) |
NOT |
N U LL, |
|
|
|
|
|
|
|||||
NAME |
VARCHAR2 |
( |
2 5 6 |
) |
NOT |
NULL, |
|
|
|
||||||
INN |
VARCHAR2 |
( |
1 2 |
|
) |
NOT |
NULL, |
|
|
|
|
||||
J U R ID IC A L _ A D D R E S S |
|
VARCHAR2 |
( |
|
2 5 6 |
) NOT |
NULL, |
||||||||
P O ST _A D D R E SS VARCHAR2 |
( |
2 5 6 |
) , |
|
|
|
|||||||||
PHONE_NUMBER |
VARCHAR2 |
( |
3 2 |
) , |
|
|
|
|
|||||||
FAX_NUMBER |
VARCHAR2 |
( |
3 2 |
) , |
|
|
|
|
|
||||||
CONSTRAINT |
A K _CO M PA NY _l |
UNIQUE |
(NAME, |
IN N , |
|||||||||||
JU R ID IC A L _ A D D R E SS) , |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
CONSTRAINT |
P K _ C o m p a n y |
PRIMARY |
KEY |
( I D ) , |
|||||||||||
CONSTRAINT |
T C _ C o m p a n y _ N A M E |
UNIQUE |
(NAME) |
||||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE PRODUCT (
ID NUMBER ( 1 0 ) NOT N U LL,
PRODUCT CODE VARCHAR2 ( 3 2 ) NOT NULL,
ШШЕ |
VARCHAR2 |
( |
1 2 8 |
) |
NOT |
NULL, |
|
|
||||||
D E SC R IPT IO N VARCHAR2 |
( 2 5 6 |
) , |
|
|
|
|
||||||||
PRODUCER VARCHAR2 |
( |
1 2 8 |
) , |
|
|
|
|
|
||||||
ITEM_WEIGHT |
NUMBER |
( 1 2 , |
6 ) NOT N U LL, |
|||||||||||
CONSTRAINT |
PK_PRODUCT PRIMARY KEY |
( I D ) , |
||||||||||||
CONSTRAINT |
TC_PRODUCT_NAME |
UNIQUE |
(N A M E ), |
|||||||||||
CONSTRAINT |
TC_PRODUCT_CODE |
UNIQUE |
( PRODUCT_CODE) |
|||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE |
TABLE |
WAREHOUSE |
( |
|
|
|
|
|
|
|
||||
ID NUMBER |
( |
1 0 |
) |
NOT |
NULL, |
|
|
|
|
|
||||
NAME |
VARCHAR2 |
( 1 2 8 |
) |
NOT |
NULL, |
|
|
|||||||
ADDRESS VARCHAR2 |
( |
2 5 6 |
) |
NOT |
NULL, |
|
||||||||
PHONE_NUMBER |
VARCHAR2 |
( |
3 2 |
) , |
|
|
|
|
||||||
FAX_NUMBER |
VARCHAR2 |
( |
3 2 |
) , |
|
|
|
|
||||||
COMPANY_ID |
NUMBER |
( |
1 0 |
) |
NOT |
NULL, |
|
|||||||
CONSTRAINT |
PK_WAREHOUSE |
PRIMARY KEY |
(CO M PAN Y _ID, I D ) , |
|||||||||||
CONSTRAINT |
TC |
WAREHOUSE |
UNIQUE |
(NAME) |
||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE |
TABLE |
CONTRACTOR |
( |
|
|
|
|
|
|
|||||
I D NUMBER |
( |
1 0 |
) |
NOT |
NULL, |
|
|
|
|
|
||||
NAME |
VARCHAR2 |
( |
2 5 6 |
) |
NOT |
NULL, |
|
|
||||||
INN |
VARCHAR2 |
( |
1 2 |
) |
NOT |
NULL, |
|
|
|
|||||
JUR IDA L _ADD RESS VARCHAR2 |
( |
2 5 6 |
) |
NOT |
N U LL, |
|||||||||
POST_ADDRESS |
VARCHAR2 |
( |
2 5 6 |
) , |
|
|
|
|||||||
PHONE_NUMBER VARCHAR2 |
( |
3 2 |
) , |
|
|
|
||||||||
FAX_NUMBER |
VARCHAR2 |
( |
3 2 |
) , |
|
|
|
|
||||||
CONTACT_PERSON |
VARCHAR2 |
( |
6 4 |
) |
NOT N U LL, |
|||||||||
E_M AIL VARCHAR2 |
( |
6 4 |
) , |
|
|
|
|
|
|
|||||
NOTE |
VARCHAR2 |
( |
1 2 8 |
) , |
|
|
|
|
|
|
|
|||
CONSTRAINT |
PK_CONTRACTOR |
PRIMARY |
KEY |
( I D ) , |
||||||||||
CONSTRAINT |
TC_CONTRACTOR_NAME |
UNIQUE |
(NAME) |
|||||||||||
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE |
TABLE |
S T A T E _ L IS T |
( |
|
|
|
|
|
|
|||||
I D NUMBER |
( |
1 0 |
) |
NOT |
NULL, |
|
|
|
|
|
||||
NAME VARCHAR2 |
( |
3 2 |
) |
NOT |
NULL, |
|
|
|
||||||
CONSTRAINT |
T C _ST A T E _ L IST _ N A M E |
UNIQUE |
(N A M E ), |
|||||||||||
CONSTRAINT |
P K _ S T A T E _ L IS T |
PRIMARY |
KEY |
( I D ) |
)
/
ALTER TABLE DEPARTMENT ADD ( CONSTRAINT FK_DEPARTMENT2 FOREIGN KEY (COMPANY_ID, O F F I C E _ I D ) REFERENCES O F F IC E
( COMPANY_ID, I D ) )
/
ALTER |
TABLE |
DOCUMENT_STATE ADD ( |
CONSTRAINT |
|
||||||||||||
FK_DOCUMENT_ID FOREIGN KEY (DOCUMENT_ID) REFERENCES |
||||||||||||||||
PROD_ORDER ( I D ) ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
DOCUMENT_STATE |
ADD |
( |
CONSTRAINT |
|
||||||||||
F K _ S T A T E _ L I S T _ ID |
FOREIGN |
KEY |
(S T A T E _ ID ) |
REFERENCES |
||||||||||||
S T A T E _ L IS T ( I D ) ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
PROD_ORDER |
ADD |
( |
CONSTRAINT |
FK_CUSTOMER_ID |
||||||||||
FOREIGN KEY |
(C U ST O M E R _ID ) |
|
REFERENCES |
CONTRACTOR |
( I D ) ) |
|||||||||||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
O R D E R _ P O S IT IO N |
ADD |
( |
CONSTRAINT |
|
||||||||||
F K _ O R D E R _ P O S IT IO N 10 FOREIGN |
KEY |
(PR O D U C T _ID ) |
REFERENCES |
|||||||||||||
PRODUCT |
( I D ) ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
O R D E R _ P O S IT IO N |
ADD |
( |
CONSTRAINT |
|
||||||||||
FK_ORDER_MU_ID |
FOREIGN |
KEY |
(M E A S U R E _ U N IT _ ID ) |
REFERENCES |
||||||||||||
MEASURE_UNIT |
( I D ) ) |
|
|
|
|
|
|
|
|
|
|
|
|
|||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
O R D E R _ P O S IT IO N |
ADD |
( |
CONSTRAINT FK _ORDER _ID |
|||||||||||
FOREIGN KEY |
(O R D E R _ ID ) |
REFERENCES |
PROD_ORDER |
( I D ) ) |
||||||||||||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
O F F IC E |
ADD |
( |
CONSTRAINT |
FK _ O F FIC E |
FOREIGN |
|||||||||
KEY (COM PANY _ID) |
REFERENCES |
COMPANY |
( I D ) ) |
|
|
|
||||||||||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER |
TABLE |
WAREHOUSE |
|
ADD |
( |
CONSTRAINT |
FK_WAREHOUSE3 |
|||||||||
FOREIGN KEY |
(CO M PAN Y _ID) |
REFERENCES |
COMPANY |
( I D ) ) |
|
|||||||||||
/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TRIGGER C A L C _ V A L U E S _ B U I BEFORE |
UPDATE |
OF |
||||||||||||||
M E A SU R E _ U N IT _ ID , |
PR O D U C T _ ID |
OR |
IN SE R T |
ON |
O R D E R _PO SIT IO N |
|||||||||||
FOR EACH |
ROW |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
DECLARE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
V _DATE |
DATE; |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
B e g i n |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/ * О п р е д е л и м д а т у з а к а з а * / |
|
|
|
|
|
|
|
|
||||||||
SELECT |
ORDER _DATE |
|
|
|
|
|
|
|
|
|
|
|
|
|||
INTO |
V _D ATE |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
FROM |
PROD_ORDER |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
WHERE I D = |
: NEW. O R D E R _ ID ; |
|
|
|
|
/ * П о л у ч и м д е й с т в у ю щ у ю ц е н у б е з н а л о г о в н а п е р е д а н н ы й п р о д у к т * /
: N E W .P R IC E : = F _G E T _ C U R R E N T _ P R IC E ( :N E W .PR O D U C T _ID , : N E W .M E A SU R E _ U N IT _ ID , V _ D A T E , 0 ) ;
/ * Р а с с ч и т а е м с у м м у б е з н а л о г о в * /
:NEW.AMOUNT |
:= |
ROUND (: NEW . P R I C E * |
: NEW . Q U A N T I T Y , 2 ) ; |
/ * П о л у ч и м д е й с т в у ю щ у ю ц е н у с н а л о г а м и н а п е р е д а н н ы й |
|||
п р о д у к т * / |
|
|
|
: NEW. TAX _PR ICE |
: = F _G E T _ C U R R E N T _ P R IC E |
||
( :NEW .PR O D UCT _ID, |
: NEW. M E A SU R E _ U N IT _ ID , |
V _ D A T E , 1 ) ; |
|
/ ^ Р а с с ч и т а е м с у м м у с н а л о г а м и * / |
|
||
: NEW. TAX_AMOUNT |
:= ROUND (: NEW . T A X _ P R I С Е * |
||
: N E W .Q U A N TIT Y , 2 ) ; |
|
|
|
E n d ;
/
Выполнение скрипта в сессии Oracle 8 создаст все объекты и связи схемы данных «MainSchema».
12. Разработка приложения
Разработка приложения является итоговым этапом проделанной работы. В качестве средства разработки будем использовать C++
Builder и СУБД Oracle 8.
Мы остановили свой выбор именно на C++ Builder, потому что этот инструмент обладает относительной простотой использования
при высоких возможностях.
Так как цель данного раздела - показать, как использовать получен
ные результаты при создании программного продукта, то мы рассмот рим лишь пример программирования одного блока системы. Точнее го воря, создадим экранную форму работы с заказами. Для этого придется создать все объекты базы данных, изображенные на рис. П3.56. О том, как это сделать, подробно описано в предыдущем разделе.
Данная форма должна содержать список ранее созданных заказов и предоставлять ряд сервисных операций по работе с ними. Все эти операции прописаны в классе «OrderForm». Конечно, на этапе проек тирования мы описали эти операции в довольно общем виде, не ука зав у большинства ни типа возвращаемого значения, ни аргументов. Теперь мы имеем возможность превратить заготовки операций в функциональный код.
Экранная форма работы с заказами позволяет изменять, удалять существующий заказ либо создавать новые заказы. В случае измене ния или создания нового заказа необходимо отредактировать или за нести товарные позиции. Для этих целей может вызываться отдель ная форма, функциональность которой задается классом «OrderPosForm», либо можно совместить все функции на одной форме.