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

книги / Проектирование автоматизированных информационных систем на основе объектно-ориентированного подхода

..pdf
Скачиваний:
0
Добавлен:
12.11.2023
Размер:
10.56 Mб
Скачать

На диаграмме, представленной на рис. П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», либо можно совместить все функции на одной форме.

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