Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование автоматизированных информационных систем на основе о..pdf
Скачиваний:
27
Добавлен:
15.11.2022
Размер:
10.45 Mб
Скачать

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

Данная форма не должна содержать никаких элементов управле­ ния, таких как кнопки, выпадающие списки и т.п. Подобные элемен­ ты должны находиться в дочерних окнах. Главное окно, как правило, содержит меню, панели инструментов и строку состояния, а остав­ шееся пространство служит для размещения дочерних окон.

Создадим меню для главной формы. Для этого расположим ком­ понент «MainMenu» с панели инструментов «Standard» на главной форме. Переименуем его в «MainMDIMenu». Затем двойным щелч­ ком на компоненте откроем редактор структуры меню. В данном ре­ дакторе мы можем создать все необходимые пункты главного меню. Создадим их согласно структуре, представленной на рис. П3.61.

Файл

Модуль

Отчеты

Выход

Бухгалтерский учет

Товарный баланс

 

Оприходование товара

Поступления за период

 

Работа с накладными

Реализация за период

 

АРМ менеджера

Остатки по складам

 

Работа с заказами

Анализ продаж за период

 

План закупок

 

 

АРМ кладовщика

 

 

Работа с накладными

 

 

Акт приема-передачи

 

 

товара от контрагента

 

Справочники

Служебное

Окно

Реквизиты

Администрирование

Каскад

Подразделения

Настройки

Мозаика

Товары

Передача данных

Следующее окно

Контрагенты

 

Предыдущее окно

 

 

Закрыть окно

Справка

 

 

Инструкция пользователя

О программе

Рис. П3.61. Структура меню для главной формы

Установим свойство «Menu» нашей формы в «MainMDIMenu». Теперь главная форма будет выглядеть так же, как на рис. П3.62.

Для завершения работы над главной формой поместим на нее па­ нель инструментов (компонент «ТооШаг») и строку состояния (ком­ понент «StatusBar»). Установим свойство «Flat» панели инструментов в «True» и создадим пока всего две кнопки. Одну проассоциируем (свойство кнопки «Menultem») с пунктом меню «Выход», а вторую

/ / Product

# i n c l u d e " P r o d u c t . h "

c l a s s O r d e r P o s i t i o n

{

O r d e r P o s i t i o n ( ) ;

 

 

 

 

 

O r d e r P o s i t i o n ( c o n s t O r d e r P o s i t i o n & r i g h t ) ;

 

- O r d e r P o s i t i o n ( ) ;

 

 

 

 

O r d e r P o s i t i o n

&

o p e r a t o r = ( c o n s t

O r d e r P o s i t i o n

i n t o p e r a t o r = = ( c o n s t O r d e r P o s i t i o n b r i g h t )

c o n s t ;

i n t o p e r a t o r ! = ( c o n s t O r d e r P o s i t i o n b r i g h t )

c o n s t ;

/ / П о л у ч и т ь д е й с т в у ю щ и й ) ц е н у п о п р а й с - л и с т у

 

d o u b l e g e t A c t u a l P r i c e

( ) ;

 

 

/ / П о л у ч е н и е ц е н ы с у ч е т о м н а л о г о в

 

 

d o u b l e g e t A c t u a l T a x P r i c e ( ) ;

 

 

/ / Р а с ч е т с у м м ы

 

 

 

 

 

d o u b l e c a l c A m o u n t

( ) ;

 

 

 

/ / Р а с ч е т с у м м ы с н а л о г а м и

 

 

d o u b l e c a l c A m o u n t T a x

( ) ;

 

 

c o n s t P r o d u c t * g e t _ t h e _ P r o d u c t () c o n s t ;

 

v o i d s e t _ t h e _ P r o d u c t

( P r o d u c t * v a l u e ) ;

 

p u b l i c :

 

 

 

 

 

b r i g h t ) ;

 

 

 

 

 

p

r o t e c t e d :

p

u b l i c :

 

c o n s t d o u b l e g e t _ q u a n t i t y

 

v o i d s e t _ q u a n t i t y ( d o u b l e

() c o n s t ; v a l u e ) ;

c o n s t c h a r * g e t _ m e a s u r e U n i t v o i d s e t _ m e a s u r e U n i t ( c h a r *

() c o n s t ; v a l u e ) ;

c o n s t d o u b l e g e t _ p r i c e v o i d s e t _ p r i c e ( d o u b l e

() c o n s t ; v a l u e ) ;

c o n s t d o u b l e g e t _ t a x P r i c e v o i d s e t _ t a x P r i c e ( d o u b l e

() c o n s t ; v a l u e ) ;

c o n s t d o u b l e g e t _ a m o u n t v o i d s e t _ a m o u n t ( d o u b l e

() c o n s t ; v a l u e ) ;

c o n s t d o u b l e g e t _ _ t a x A m o u n t v o i d s e t t a x A m o u n t ( d o u b l e

() c o n s t ; v a l u e ) ;

d o u b l e q u a n t i t y ;

c h a r * m e a s u r e U n i t ; d o u b l e p r i c e d -

d o u b l e t a x P r ic e d - d o u b l e a m o u n t ;

d o u b l e t a x A m o u n t ;

P r o d u c t * t h e P r o d u c t ;

Ниже представлен фрагмент кода соответствующего файла «Order,срр».

/ / O r d e r

# i n c l u d e " O r d e r . h "

/ / C l a s s O r d e r

O r d e r : : O r d e r ()

{

}

O r d e r : : O r d e r ( c o n s t O r d e r b r i g h t )

{

}

O r d e r : : - O r d e r ()

{

}

O r d e r & O r d e r : : o p e r a t o r = ( c o n s t O r d e r b r i g h t )

{

i n t O r d e r : : o p e r a t o r = = ( c o n s t O r d e r b r i g h t ) c o n s t

{

}

i n t O r d e r : : o p e r a t o r ! = ( c o n s t O r d e r b r i g h t ) c o n s t

{

}

d o u b l e O r d e r : : c a l c A m o u n t ()

{

}

d o u b l e O r d e r : : c a l c T a x ()

{

}

d o u b l e O r d e r : : c a l c T a x A m o u n t ()

{

}

d o u b l e O r d e r : : c a l c P o s Q u a n t i t y ()

{

}

O r d e r P o s i t i o n : : O r d e r P o s i t i o n ()

{

}

O r d e r P o s i t i o n : : O r d e r P o s i t i o n ( c o n s t O r d e r P o s i t i o n & r i g h t )

O r d e r P o s i t i o n : : ~ O r d e r P o s i t i o n ()

{

O r d e r P o s i t i o n & O r d e r P o s i t i o n : : o p e r a t o r = ( c o n s t O r d e r P o ­

s i t i o n S r i g h t )

{

}

i n t

O r d e r P o s i t i o n : : o p e r a t o r = = ( c o n s t

O r d e r P o s i t i o n

b r i g h t )

c o n s t

 

{

 

 

}

 

 

i n t

O r d e r P o s i t i o n : : o p e r a t o r ! = ( c o n s t

O r d e r P o s i t i o n

b r i g h t )

c o n s t

 

{

 

 

}

 

 

d o u b l e O r d e r P o s i t i o n : : g e t A c t u a l P r i c e ()

 

{

 

 

}

 

 

d o u b l e O r d e r P o s i t i o n : : g e t A c t u a l T a x P r i c e

()

{

 

 

}

 

 

Мы видим, что в файле «Order.cpp» содержатся лишь «заглуш­ ки» для соответствующих операций, конструкторов и деструкторов. Прописать функциональную часть той или иной операции придется нам самим.

За поддержку всех действий с заказами отвечает класс «OrderForm», с него и начнем нашу работами с классами от Rational Rose.

Реализаций операций класса «OrderForm» может быть множест­ во. Мы приведем лишь один вариант, не претендуя на его совершен­ ство, ведь наша цель - научиться использовать на практике классы, полученные с помощью Rational Rose.

Так как вся информация о заказах будет храниться в таблицах БД Oracle, то необходимо организовать обмен данных между экзем­ плярами классов и соответствующими таблицами. В связи с этим необходимо воспользоваться одним из компонентов C++ Builder, предназначенных для работы с базами данных. Остановим свой вы­ бор на компоненте «TADOQuery». Данный компонент обладает ши­ рокими возможностями работы с табличными данными при просто­ те использования.

Объявим экземпляр «TADOQuery» в файле-заголовке «Order.h»:

/ / P a y m e n t

# include " P a y m e n t . h" / / C u s t o m e r

# include " C u s t o m e r . h "

// P r o d u c t

include " P r o d u c t . h"

♦ include

< A D O D B .h p p >

/ * м о д у л ь A c t i v e X D a t a O b j e c t s

(A D O )* /

 

 

T A D O Q uery

* C u r r e n t Q u e r y ;

 

Прежде чем начать работу с данными посредством «CurrentQuery», необходимо задать строку соединения - «СоппесtionString». Данную строку можно получить, если выложить компо­ нент «TADOQuery» (панель инструментов «ADO») на форму и вос­ пользоваться стандартным мастером генерации строки соединения. Мастер вызывается по двойному щелчку на кнопке «...» напротив свойства «ConnectionString».

Для хранения этой строки и других настроек базы данных созда­ дим отдельный модуль «DBParams». В файле заголовка «DBParams.h» этого модуля пропишем макроопределение строки соедине­ ния, содержание которой возьмем из ранее созданного компонента:

ifndef D B P a r a m sH

define D B P a ra m sH

define

CONNECT_STRING

" P r o v i d e r = M S D A O R A .

w o r d = t i g e r ;

U s e r I D = s c o t t ;

D a t a S o u r c e = M A T R I X ;

c u r i t y I n f o = T r u e "

 

endif

 

 

1 ;

P

a s s -

P e r s i s t

S e ­

Компонент «TADOQuery» формы можно теперь удалить, он больше не понадобится.

При построении строки соединения был указан Microsoft OLE DB Provider For ODBC Drivers. Источник данных MATRIX был настроен ранее как ODBC-соединение с базой данных MATRIX. Пользователь scott (пароль tiger) является демонстрационным пользователем, кото­ рый всегда создается при установке Oracle. Если таблицы, перечис­ ленные в разд. 11, были созданы от другого пользователя, то в строке соединения необходимо указать именно этого пользователя.

Подключим новый модуль «DBParams.h» в модуле «Order.h». Теперь найдем объявление класса «OrderForm» в «Order.h» и до­

бавим еще один атрибут, а точнее говоря, динамический массив идентификаторов - «orderlD»:

c la s s O r d e r F o r m

{

p u b lic :

O r d e r F o r m ( ) ;

 

 

 

 

 

O r d e r F o r m ( c o n s t O r d e r F o r m b r i g h t ) ;

 

 

- O r d e r F o r m ( ) ;

 

 

 

 

 

O r d e r F o r m & o p e r a t o r = ( c o n s t O r d e r F o r m b r i g h t ) ;

 

i n t o p e r a t o r = = ( c o n s t O r d e r F o r m b r i g h t )

c o n s t ;

 

i n t o p e r a t o r ! = ( c o n s t O r d e r F o r m b r i g h t )

c o n s t ;

 

v o i d

a d d

( ) ;

 

 

 

 

 

v o i d

s e l e c t ( ) ;

 

 

 

 

 

v o i d d e l e t e l t e m ( ) ;

 

 

 

 

 

v o i d c o n f i r m D e l e t e

 

( ) ;

 

 

 

v o i d

f i n d

( ) ;

 

 

 

 

 

v o i d c h a n g e S t a t u s

( c h a r ^ s t a t u s ) ;

 

 

v o i d p r i n t B a n k B i l l

 

( ) ;

 

 

 

v o i d p r i n t C a s h B i l l

 

( ) ;

 

 

 

v o i d g e t P r o d u c t N e t s

( ) ;

 

 

 

v o i d d i s p l a y O r d e r

( ) ;

 

 

 

D y n a m i c A r r a y < ___i n t 6 4 >

o r d e r l D ;

/ ^ м а с с и в

( к о л л е к ц и я ) у н и к а л ь н ы х и д е н т и ф и к а т о р о в * /

 

 

c o n s t O r d e r P o s F o r m g e t _ t h e _ O r d e r P o s F o r m () c o n s t ;

 

v o i d s e t t h e O r d e r P o s F o r m ( O r d e r P o s F o r m v a l u e ) ;

 

c o n s t

O r d e r C o n t r o l

*

g e t _ t h e _ O r d e r C o n t r o l

()

c o n s t ;

 

 

 

 

 

 

 

v o i d s e t _ t h e _ O r d e r C o n t r o l

( O r d e r C o n t r o l * v a l u e ) ;

 

p r o te c te d : p r iv a t e :

O r d e r P o s F o r m O r d e r C o n t r o l

t h e _ O r d e r P o s F o r m ; * t h e O r d e r C o n t r o l ;

Смысл добавления динамического массива заключается в том, чтобы в дальнейшем облегчить вывод списка заказов в некоторый ви­ зуальный компонент, позволяющий работать со списком элементов.

В конструкторе данного класса будет производиться чтение из таблицы «PROD ORDER» кодов заказов и заполнение «ordered». Операция «displayOrder» будет доработана: в качестве аргумента бу­ дет передаваться номер элемента массива, а возвращаемое значение будет иметь тип «Order *». Таким образом, посредством операции «displayOrder» мы сможем получить подробную информацию о лю­ бом заказе.

Ниже приведен текст конструктора класса «OrderForm»:

/ / Class OrderForm

O r d e r F o r m : : O r d e r F o r m ()

{

C u r r e n t Q u e r y C u r r e n t Q u e r y C u r r e n t Q u e r y

= new T A D O Q u e r y ( N U L L ) ;

- >

C o n n e c t i o n s t r i n g = C O N N E C T _ST R IN G ;

- >

SQL - > C l e a r () ;

/ /

Определит все заказы со статусом «НОВЫЕ» и

//

отсортируем по приоритету

C u r r e n t Q u e r y

- >

SQL

- >

A d d ( " S e l e c t

о

. i d

" ) ;

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

A d d ( " F r o m

p r o d _ o r d e r

o ,

d o c u -

m e n t _ s t a t e d s , s t a t e _ l i s t

s

" ) ;

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y

 

- >

SQL

 

- >

A d d ( " W h e r e

o . i d

 

d s . d o c u m e n t e d a n d d s . s t a t e _ i d = s . i d

" ) ;

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

A d d ( " a n d

s . n a m e

= * Н о в ы е*

**);

C u r r e n t Q u e r y

- >

SQL

- >

A d d ( " O r d e r

b y

o . p r i o r i t y

")

;

C u r r e n t Q u e r y - > O p e n ( ) ;

 

 

 

 

 

 

 

 

 

 

o r d e r I D . L e n g t h = 0 ;

 

 

 

 

 

 

 

 

 

 

 

w h ile ( ! ( C u r r e n t Q u e r y - >

E o f ) )

 

 

 

 

 

 

 

«

 

 

 

 

 

 

 

 

 

 

 

 

 

o r d e r I D . L e n g t h + + ;

 

 

 

 

 

 

 

 

 

 

 

o r d e r l D [ o r d e r l D . L e n g t h

 

-

1 ]

=

 

 

C u r r e n t Q u e r y

- >

F ie X d B y M a m e ( " I D " ) - > A s l n t e g e r ;

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y - > N e x t ( ) ;

 

 

 

 

 

 

 

 

 

)

Запрос, который выполняется в данном конструкторе, отбирает только те заказы, которые находятся в состоянии «Новые». Другие состояния менеджера не интересуют.

Доработаем операцию «displayOrder». Изменим ее описание в «Order.h»:

O r d e r * d i s p l a y O r d e r (___ int64 i n d e x ) ;

Так как заказ ассоциирован с конкретным клиентом, то для под­ держки операций обмена данными между классовой моделью и базой данных дополним предок класса «Customer» - класс «Contractor» - целочисленным атрибутом «ГО» и операциями чтения/установки это­ го атрибута «get_ID» и «set_ID». Возможно, придется аналогичным образом дополнить и другие классы, но будем делать это по мере возникновения необходимости.

В «Order.cpp» создадим реализацию операции «displayOrder»:

O r d e r * O r d e r F o r m : : d i s p l a y O r d e r (___int64 i n d e x )

{

O r d e r * C u r r e n t O r d e r ; C u s t o m e r * C u s t ; char* c p ;

C u r r e n t Q u e r y - > C l o s e t ) ;

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

C l e a r ( ) ;

 

 

 

 

 

C u r r e n t Q u e r y

 

- >

SQL

- >

A d d ( " S e l e c t

o . i d ,

о . o r d e r _ n u m b e r , о . c u s t o m e r _ i d , " ) ;

 

 

 

 

 

C u r r e n t Q u e r y

 

 

 

- >

 

SQL

 

 

- >

A d d ( " t o _ _ c h a r ( o . o r d e r _ d a t e , 1 d d . m m . y y y y ' ) o r d e r _ d a t e ,

" ) ;

 

C u r r e n t Q u e r y

- >

SQL - >

 

A d d ( " o . p r i o r i t y ,

c . n a m e

c u s ­

t o m e r , о . s h i p m e n t _ d a t e ") ;

 

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL - >

 

A d d ( " F r o m

p r o d _ o r d e r

o ,

c o n ­

t r a c t o r

c " ) ;

 

 

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL - >

 

A d d ( " W h e r e

o . i d

=

+

I n t -

T o S t r ( o r d e r I D [ i n d e x ] ) + " a n d о . c u s t o m e r _ i d = c . i d " ) ;

 

C u r r e n t Q u e r y - > O p e n ( ) ;

 

 

 

 

 

 

 

C u r r e n t O r d e r

= new O r d e r ( ) ;

 

 

 

 

 

c p

=

new

char

[ C u r r e n t Q u e r y

->

 

F i e l d B y -

N a m e ( " o r d e r _ n u m b e r ") - > , A s S t r i n g . L e n g t h () + 1 ] ;

 

 

 

s t r c p y (

 

c p ,

 

C u r r e n t Q u e r y

 

- >

 

F i e l d B y -

N a m e ( " o r d e r _ n u m b e r ") - > A s S t r i n g . c _ s t r () ) ;

 

 

 

C u r r e n t O r d e r - > s e t _ o r d e r N u m b e r ( c p ) ;

 

 

 

 

c p

=

new

char [ C u r r e n t Q u e r y

- >

 

F i e l d B y -

N a m e ( " o r d e r _ d a t e " ) - > A s S t r i n g . L e n g t h () + 1 ] ;

s t r c p y ( c p ,

C u r r e n t Q u e r y

- >

F i e l d B y N a m e ( " o r d e r _ d a t e " )

- > A s S t r i n g . c _ s t r ( )

) ;

 

 

 

 

 

C u r r e n t O r d e r - > s e t _ o r d e r D a t e ( c p ) ;

 

 

C u r r e n t O r d e r

 

- >

s e t _ p r i o r i t y ( C u r r e n t Q u e r y

- > F i e l d B y ­

Nam e ( " p r i o r i t y " )

- >

A

s l n t e g e r ) ;

 

 

 

Cp

=

new

c h a r [ C u r r e n t Q u e r y

- >

F i e l d B y ­

N am e ( " s h i p m e n t _ d a t e " ) - > A s S t r i n g . L e n g t h () + 1 ] ;

 

s t r c p y (

c p ,

C u r r e n t Q u e r y

- >

F i e l d B y ­

N am e ( " s h i p m e n t _ d a t e " )

- > A s S t r i n g . c _ s t r ()

) ;

 

C u r r e n t O r d e r - > s e t _ s h i p m e n t D a t e ( c p ) ;

 

 

C u s t

= new C u s t o m e r ( ) ;

 

 

 

 

c p =

new c h a r [ C u r r e n t Q u e r y

- > F i e l d B y N a m e

( " c u s t o m e r " )

- > A s S t r i n g . L e n g t h () + 1 ] ;

 

 

 

 

s t r c p y ( c p ,

C u r r e n t Q u e r y

- >

F i e l d B y N a m e ( " c u s t o m e r " ) - >

A s S t r i n g . c _ s t r ( ) ) ;

 

 

 

 

 

 

C u s t - > s e t _ n a m e ( c p ) ;

 

 

 

 

C u s t

- >

 

 

s e t _ I D ( C u r r e n t Q u e r y

- >

F i e l d B y ­

N am e ( " c u s t o m e r _ i d " ) - > A s l n t e g e r ) ;

C u r r e n t O r d e r - > s e t _ t h e _ C u s t o m e r ( C u s t ) ;

r e t u r n C u r r e n t O r d e r ;

}

Заполняются только те атрибуты класса «Order», которые будут в дальнейшем формировать визуальный список.

Важно отметить, что мы не смешиваем визуальные компоненты C++ Builder с классами, полученными с помощью Rational Rose. Это позволяет говорить об относительной переносимости этих классов и возможности использования без значительных доработок в другой среде разработки.

Попробуем увидеть, в прямом смысле этого слова, наши резуль­ таты. В качестве упомянутого ранее визуального компонента, под­ держивающего работу со списком данных, вполне подойдет компо­ нент «StringGrid» (панель инструментов «Additional»). Расположим этот компонент на форме «ChildOrderForm» и установим свойство «Align» в «alLeft». Затем расположим на форме еще два компонен­ та: «Splitter» и «Panel» панелей инструментов «Additional» и «Stan­ dard». У первого установим свойство «Align» в «alLeft», а у второго

 

 

/ / О п р е д е л и м н о в ы й I D з а к а з а

 

 

 

 

 

 

C u r r e n t Q u e r y - > C l o s e ( ) ;

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

 

C l e a r ( ) ;

 

 

 

 

 

 

C u r r e n t Q u e r y

 

~ >

 

 

 

SQL

 

 

- >

 

A d d ( " S e l e c t

s q _ p r o d _ o r d e r . N e x t V a l n e w _ o r d e r _ i d F r o m D u a l " ) ;

 

 

 

C u r r e n t Q u e r y - > O p e n ( ) ;

 

 

 

 

 

 

 

 

 

 

N e w O r d e r l D

=

 

C u r r e n t Q u e r y

 

- >

F i e l d B y -

N a m e ( " n e w _ o r d e r _ i d " ) - > A s l n t e g e r ;

 

 

 

 

 

 

 

 

C u s t = n e w O r d e r - > g e t _ t h e _ C u s t o m e r () ;

 

 

 

 

/ / В ы п о л н и м в с т а в к у д а н н ы х о з а к а з е в б а з у д а н н ы х

 

 

^

 

г

 

 

 

 

 

 

 

 

 

 

 

 

 

 

о

— И И .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y - > C l o s e ( ) ;

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

 

C l e a r ( ) ;

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

A d d

( " I n s e r t

I n t o

p r o d _ o r d e r

( i d ,

o r d e r _ n u m b e r ,

o r d e r _ d a t e ,

p r i o r i t y ,

" ) ;

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

 

 

- >

A d d

( " s h i p m e n t _ d a t e ,

c u s -

t o m e r _ i d ) ") ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

 

A d d ( " V A L U E S ( " ) ;

 

 

 

 

s = s + I n t T o S t r ( N e w O r d e r l D ) + " , " ;

 

 

 

 

 

s = s + " 1 " + n e w O r d e r - > g e t _ o r d e r N u m b e r () + " f , ";

 

s = s

+ " t o _ d a t e ( ,n

+ n e w O r d e r

- >

g e t _ o r d e r D a t e () +

1d d .mm. y y y y 1) ,

";

 

 

 

 

 

 

 

 

 

 

 

 

 

s = s + I n t T o S t r ( n e w O r d e r - > g e t _ p r i o r i t y () ) + " , ";

 

s = s + " t o _ d a t e ( 1 " + n e w O r d e r - > g e t _ s h i p m e n t D a t e () +

1d d . m m . y y y y 1 ) ,

";

 

 

 

 

 

 

 

 

 

 

 

 

 

s = s + I n t T o S t r ( C u s t - > g e t _ _ I D ( ) ) + " )

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

 

A d d ( s ) ;

 

 

 

 

 

 

 

C u r r e n t Q u e r y - > E x e c S Q L ( ) ;

 

 

 

 

 

 

 

 

/ /

У с т а н о в и м

д л я

н о в о г о

з а к а з а

с о с т о я н и е "НОВЫЕ"

 

 

/ /

О п р е д е л и м

ID

с о с т о я н и я

"НОВЫЕ"

 

 

 

 

 

C u r r e n t Q u e r y - > C l o s e ( ) ;

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

 

C l e a r

( ) ;

 

 

 

 

 

 

C u r r e n t Q u e r y

- >

SQL

- >

A d d ( " S e l e c t

i d

F r o m

s t a t e _ l i s t

w h e r e

n a m e

= 1 НОВЫЕ1 " ) ;

 

 

 

 

 

 

 

 

 

 

 

 

 

C u r r e n t Q u e r y - > O p e n ( ) ;

 

 

 

 

 

 

 

 

 

 

S t a t e N e w I D = C u r r e n t Q u e r y - >

 

F i e l d B y N a m e ( " i d " ) - > A s ­

l n t e g e r ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i f ( C h i l d O r d e r F o r m - > T a g ! = 0 )

{

d e le te C u r r e n t O r d e r F o r m ;

C u r r e n t O r d e r F o r m = n e w O r d e r F o r m f ) ; s e t V i s u a l L i s t ( ) ;

}

Перед модальным вызовом формы «AddOrderForm» обнуляется свойство «Tag» текущей формы. В результате работы пользователя с формой «AddOrderForm» заказ может быть и не создан, например, пользователь нажал кнопку «Отмена». В этом случае нет смысла пе­ реформировывать (обновлять) список заказов форм «ChildOrderForm». А в том случае, если пользователь создал заказ, т.е. заполнил необхо­ димые поля и нажал на кнопку «Создать заказ» (это состояние харак­ теризуется взводом «Tag» в значение, отличное от нуля), необходимо удалить текущий экземпляр «CurrentOrderForm», снова создать его (на конструкторе произойдет чтение новых заказов) и вызвать функции заполнения «set_VisualList()» для отображения обновленного списка заказов на экране.

Также стоит обратить внимание на то, что при открытии формы «AddOrderForm» необходимо заполнить выпадающий список клиен­ тов справочными данными. Эта процедура реализуется функцией «set_CustList()», которая вызывается при активизации формы. Текст функции приведен ниже:

D y n a m i c A r r a y < ___int64>

C u s t I D ;

v o id s e t _ C u s t L i s t ()

 

 

 

{ long i ;

 

 

 

 

 

T AD O Q uery

*

C u s t Q u e r y ;

 

C u s t Q u e r y

=

new T A D O Q u e r y ( N U L L ) ;

C u s t Q u e r y - > C o n n e c t i o n s t r i n g = C O N N E C T _ ST R IN G ;

C u s t Q u e r y - > C l o s e ( ) ;

 

C u s t Q u e r y

- >

SQL

- >

C l e a r

( ) ;

C u s t Q u e r y

- >

SQL

- >

A d d

( " S e l e c t i d , n a m e F r o m c o n ­

t r a c t o r O r d e r b y n a m e " ) ;

C u s t Q u e r y

- >

O p e n ( ) ;

C u s t Q u e r y

- >

F i r s t ( ) ;

a d d O r d e r F o r m = new O r d e r F o r m O ;

 

 

 

 

n e w O r d e r =

new O r d e r ( ) ;

 

 

 

 

 

c p

=

new c h a r [ E d i t O r d e r N u m b e r

- >

T e x t . L e n g t h

()

+

1 0 ] ;

s t r c p y ( c p , E d i t O r d e r N u m b e r - > T e x t . c _ s t r ( ) ) ;

 

 

 

n e w O r d e r - > s e t _ o r d e r N u m b e r ( c p ) ;

 

 

 

 

c p

=

new c h a r [ E d i t O r d e r D a t e - >

T e x t . L e n g t h ()

+

1 ]

;

s t r c p y ( c p ,

E d i t O r d e r D a t e - > T e x t . c _ s t r ( ) ) ;

 

 

 

n e w O r d e r - > s e t _ o r d e r D a t e ( c p ) ;

 

 

 

 

 

n e w O r d e r - > s e t _ p r i o r i t y ( S E P r i o r i t y - > V a l u e ) ;

 

 

c p

=

new c h a r [ E d i t O r d e r S h i p D a t e

- > T e x t . L e n g t h ()

+ 1 ] ;

s t r c p y ( c p ,

E d i t O r d e r S h i p D a t e - > T e x t . c _ s t r ( ) ) ;

 

 

n e w O r d e r - > s e t _ s h i p m e n t D a t e ( c p ) ;

 

 

 

O u s t

=

new C u s t o m e r ( ) ;

 

 

 

 

 

C u s t - > s e t _ I D ( C u s t I D [ C u s t C B - > I t e m l n d e x ] ) ;

 

 

 

n e w O r d e r - > s e t _ t h e _ C u s t o m e r ( C u s t ) ;

 

 

 

a d d O r d e r F o r m - > a d d ( n e w O r d e r ) ;

 

 

 

 

 

d e le te

[]

c p ;

 

 

 

 

 

d e le te

C u s t ;

 

 

 

 

 

d e le te n e w O r d e r ;

d e le te a d d O r d e r F o r m ;

C h i l d O r d e r F o r m - > T a g = 1 ;

C l o s e ( ) ;

}

При реализации операции добавления нового заказа мы не затро­ нули использование контролирующего класса «OrderControl», хотя реализация его единственной операции «submit()» могла быть весьма простой и заключалась бы в проверке существования ранее созданно­ го заказа с номером и датой, совпадающими с номером и датой ново­ го заказа.

Мы не ставили перед собой цель полностью внедрить все классы, полученные с помощью Rational Rose. Наша задача была показать, что классы из Rational Rose могут действительно работать в реальном проекте без каких-либо переработок.

Тем, кто раньше работал с визуальными компонентами баз дан­ ных Borland C++ Builder или Borland Delphi, проделанная работа с классами может показаться бессмысленной, поскольку посредством этих компонентов можно действительно работать эффективнее на­ прямую с базой данных, минуя промежуточные классы. Но в общем случае подобных компонентов может и не быть. Продуктов, поддер­ живающих разработку на C++, достаточно много и наш подход в этом отношении отличается универсальностью.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]