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

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

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

Компонент «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 ( ) ;

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