WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 10 | 11 || 13 | 14 |

CreateListDlg:=TCreateListDlg(GetProcAddress (hLib, 'CREATELISTDLL'));

SetListConnection:=TSetListConnection(GetProcAddress (hlib, 'SETLISTCONNECTION'));

ShowListDlg:=TshowListDlg(GetProcAddress (hlib,'SHOWLISTDLG'));

CreateListDlg(Application.Handle, nil);

SetListConnection(fDM.GetSessionHandle) ;

ShowListDlg/// (true);

FreeLibrary(hlib);

end;

Откомпилируйте проект main и запустите программу. Подключитесь к БД и выберите пункт меню «Учебные курсы\Группы». Попробуйте выполнить операции вставки, удаления и изменения данных.

Дерево проектной группы к данному моменту содержит четыре проекта (рис. 68).

3.4.3.7. ОБЩАЯ СХЕМА ВЫЗОВА ФОРМ СПИСКА и ЭЛЕМЕНТА Схема создания дилогового окна Группы аналогична схеме создания входного диалога, но отличается наличием каскадного вызова DLLбиблиотеки, т. е. DLL-библиотека вызывается из другой DLL-библиотеки.

Ниже приведем схематическое описание работы приложения при выборе пункта меню «Учебный процесс/Группы...»:

• запуск приложения;

• после выбора пункта меню «Учебный процесс/Группы...»:

- 119- Рис. 68. Дерево проектной группы > uMain загружает DLL В память: hLib:=LoadLibrary ( ' DLGLIB02. DLL' ) ;

эта функция возвращает описатель (хэндл) загруженной библиотеки;

• после загрузки библиотеки dlglib0l. dll начинается работа с ее экспорти- руемыми функциями или процедурами:

> сначала определяются адреса экспортируемых процедур:

CreateListDlg:= TCreateListDlg (GetProcAddres's (hLib, ' CREATELISTDLL ' ) ) ;

SetListConnection:= TSetListConnection(GetProcAddress(hLib, 'SETLISTCONNECTION') ) ;

ShowListDlg:= TshowListDlg(GetProcAddress(hlib,'SHOWLISTDLG'));

найденные адреса присваиваются специально объявленным в разделе type пе- ременным, имеющим процедурный тип;

>- как и в случае с диалогом ввода диалоговое окно отображения списка необходимо сформировать самим. Для этого:

- создается диалоговое ОКНО: CreateListDlg:=TcreateListDlg (Get- ProcAddress (hLib,'CREATELISTDLL'));

- производится подключение к БД: SetListConnection (fDM.Get- SessionHandle); при этом диалогу передается тот же handle, полученный из main, подобно эстафетной палочке;

- созданное окно отображается для манипуляции с данными из БД, с которой только что связались: ShowListDlg;

> возможны четыре варианта манипуляции с данными из БД с помощью вызванного диалога:

- при нажатии кнопки «Удалить» вызывается хранимая процедура del groups, которая удаляет из базы выбранную в списке строку;

- 120- - при нажатии кнопки «Свойства...» вызывается DLL-библиотека dlglib01.dll (процесс вызова DLL-библиотеки dlglib01.dll будет описан ниже). В процессе работы DLL-библиотеки dlglib01.dll могут быть вызваны хранимые процедуры get_groups и upd_groups;

- при нажатии кнопки «Добавить...» вызывается DLL-библиотека dlglib01.dll, во время работы которой может быть вызвана хранимая проце- дура ins_groups;

- при нажатии кнопки «Выход» данные из выбранной строки сохраня- ются в объекте Groups.

> после выполнения манипуляций с данными диалоговое окно уничтожа- ется FreeLibrary (hlib) и управление возвращается главному модулю;

• работа библиотеки dlglibOl.dll описывается следующим образом:

> модуль ulGroups загружает DLL в память hLib:=LoadLibrary ( ' DLG- LIBOI. DLL ' ); как и в предыдущем случае эта функция возвращает описатель (хэндл) загруженной библиотеки;

>- затем определяются адреса экспортируемых процедур загруженной биб- лиотеки CreateEleraDlg:= TCreateElemDlg(GetProcAddress(hLib,'CREATEELEMDLL'));

SetListConnection:= TSetElemConnection(GetProcAddress(hLib,'SETELEMCONNECTION'));

ShowElemDlg:= TshowElemDlg(GetProcAddress(hlib, 'SHOWELEMDLG')) ;

найденные адреса присваиваются специально объявленным в разделе type пе- ременным, имеющим процедурный тип;

>- создается пустой экземпляр класса PGroups, который должен переда- ваться в форму элемента PGroups:=TGroups.Create;

> создается окно CreateElemDlg (Application. Handle, PGroups);

> устанавливается связь с БД SetElemConnection (DataBasel. Handle);

> на экран вызывается форма элемента showElemDlg (true), с помощью которой производятся следущие действия:

- если диалог вызван для вставки нового элемента, то с помощью функции insElem вызывается хранимая процедура ins_groups;

- если диалог вызван для редактирования элемента, то сначала с помо- щью функции GetElem вызывается хранимая процедура get_groups, которая производит выборку записи на форму, а затем с помощью функции UpdElem вызывается хранимая процедура upd_groups, которая заменяет отредактиро- ванные значения вызванной записи в базе;

> после выполнения манипуляций с данными диалоговое окно уничтожа- ется FreeLibrary (hlib) и управление возвращается dlglib02. dll.

Описанная схема приведена на рис. 69.

- 121- Рис. 69. Схема вызова форм списка и элемента 3.4.4. ДИАЛОГОВЫЕ ОКНА ДЛЯ ТАБЛИЦ STUDENTS, CATHEDRA, TEACHER, SUBJECT, STUDYING, ADVANCING Остальные диалоговые окна для оставшихся таблиц строятся по аналогии.

Причем для таблиц Cathedra и Teacher используется каскадный вызов DLL- библиотек (см. проекты dlglibOl и dlglib02), а для остальных таблиц DLL- библиотека вызывается с использованием пункта меню. При этом используется схема вызова диалога, описанная при создании формы для подключения к БД (см. проект dll_login).

- 122- ЗАКЛЮЧЕНИЕ На современном этапе развития технологии машинного моделирования ре- альной дейс твительности, сфера применения «чистого программирования», ко- гда и данные, и код создаются в пределах одной среды программирования, су- жается. На смену этой технологии приходят более сложные технологии моде- лирования реальной дейс твительности, согласно которым средствами СУБД разрабатываются модели реальной действительнос ти коллективного пользова- ния, а затем, используя ту или иную среду программирования, разрабатываются пользовательские интерфейсы для различных категорий пользователей.

Поэтому на современном этапе резко возрастает роль моделирования дан- ных. Следует отметить также резкое усложнение машинных моделей на совре- менном этапе, так как сферой машинного моделирования охватывается все бо- лее широкий круг жизнедеятельности человека. Это приводит к увеличению сроков разработки моделей, причем эти сроки становятся сопоставимыми со сроками эксплуатации разработок. В связи с этим становится актуальной про- блема сокращения сроков разработок и их адаптируемость к изменяющимся внешним условиям.

В создавшихся условиях освоение средств визуальной разработки баз дан- ных, таких как рассмотренное нами CASE-средство ERwin, обеспечивающих по сравнению с разработкой баз данных на основе SQL-запросов существенное со- кращение сроков разработки и повышение их надежнос ти, может оказаться весьма полезным для будущих специалис тов. Это поможет им сравнительно легко разрабатывать и поддерживать довольно сложные модели реальной дей- ствительности. Весьма ценное качество таких средств — масштабируемость раз- работок. Благодаря этому качеству разработанный код можно легко перенести от одной СУБД к другой, практически не внося в него изменения.

В предлагаемом пособии подробно изложены все этапы проектирования базы данных с помощью CASE-средств: создание сущностей предметной облас- ти, создание доменов, установка атрибутов сущности, установка связей между сущностями, создание пользовательских свойств, разработка индексов, генера- торов, триггеров, хранимых процедур, создание физической модели базы дан- ных и генерация отчетов по разработанной базе данных. Изложение материала сопровождается примером разработки небольшой предметной области.

- 123- ПРИЛОЖЕНИЕ А. СПИСОК МАКРОКОМАНД ERWIN Макропеременные, используемые в таблице:

,, — определяемый пользователем текст или числовое значение, применяемое при генерации;

- SQL-команда, например, INSERT, UPDATE или DELETE;

- фрагмент макрокода;

- булево выражение, которое может возвращать значение FALSE или TRUE;

, , ~ фрагмент ТСКСТа ИЛИ ЧИСЛОВОС выражение, которое добавляется перед именем таблицы или колонки при гене- рации;

- разделитель, который вставляется в текст триггера или про- цедуры при генерации (заключается в двойные кавычки);

, , , - ИМЯ таб- лицы, значения по умолчанию, домена или правила валидации;

- переменная, использующаяся в триггере.

Макрокоманд Описание а Оператор несравнения, ! =, возвращает TRUE, если аргу- менты macro codel И macro code2 НС равны %!=(, ) Два символа % необходимо использовать, если %% расширен- (, ный текст триггера должен содержать один символ % %*(, Перемножает аргументы macro codel И macro code) %+(, Складывает аргументы macro codel И macro code) %-(, Вычитает аргумент macro code2 из аргумента macro ) codel %/(, Делит аргумент macrо codel на аргумент macro code) %: Возвращает значение %<(, Оператор сравнения, <, возвращает TRUE, если аргумент ) macro codel меньше macro code%<=(, Оператор сравнения, <=, возвращает TRUE, если ) аргумент %=(, macro codel меньше ИЛИ равен macro code) Присваивает аргумент macro code переменной %==(, variable ) Оператор сравнения, = =, возвращает TRUE, если аргу- %>(, менты macro codel И macro code2 равны ) Оператор сравнения, >, возвращает TRUE, если %>=(, аргумент ) macro codel больше macro codeОператор сравнения, >=, возвращает TRUE, если аргумент macro codel больше ИЛИ равен macro code- 124- Макрокоманда Описание %Action Возвращает имя команды, до или после которой срабаты- вает триггер, например, INSERT, UPDATE или DELETE %Action Возвращает список команд, до или после которых сраба- () тывает триггер, например, INSERT, UPDATE или DELETE %And Выполняет операцию «И» над булевыми предикатами, (, заданными в macro codel и macro code) %AttDatatype Возвращает тип данных текущего атрибута %AttDef Возвращает определение атрибута %AttDefault Возвращает имя значения по умолчанию, связанное с ат- рибутом %AttDomain Возвращает имя домена, связанное с атрибутом %AttFieldname Возвращает имя колонки, соответствующей атрибуту Возвращает целое число, представляющее длину типа %AttFieldWidth данных текущего атрибута, например varchar ( 2 0 ) ->2 Возвращает ID атрибута %A %AttIID sFK Булев предикат, который может быть использован как условие в выражении %if. Он определяет, входит ли те- : кущий атрибут в состав внешнего ключа %AttIsRolenamed Булев предикат, который может быть использован как условие в выражении % If. Он определяет, является ли текущий атрибут именем роли %AttIsPK Булев предикат, который может быть использован как условие в выражении %if. Он определяет, входит ли те- кущий атрибут в состав первичного ключа %AttName Возвращает логическое имя текущего атрибута %AttNullOption Возвращает строку, представляющую режим нулевых значений для текущего атрибута %Att Phis Datatype Возвращает физический тип данных текущего атрибута независимо от того, является ли этот тип данных типом данных, определенным пользователем %Atts (, Выдает список всех атрибутов сущности триггера, вы- , ) полняя заданную функцию для каждого элемента %AttValidation Возвращает имя правила валидации, связанного с данным атрибутом; может быть использован в ForEachFKAtt ИЛИ ForEachAtt %Cardinality Возвращает мощность (кардинальность) связи IChild Возвращает физическое имя таблицы дочерней сущности связи %ChildAtts (, Возвращает список всех атрибутов дочерней сущности в , ) связи, выполняя заданную функцию для каждого элемента %CildFK(, Возвращает список внешних ключей дочерней сущности , ) в связи, выполняя заданную функцию для каждого эле- мента - 125- Макрокоманда Описание %CildFKDecl (, Возвращает список внешних ключей дочерней , ) сущности %CildNK(, Генерирует раздельный список функций для всех , ) неклю- чевых атрибутов дочерней сущности в связи, выполняя ф %CildNKDecl Возвращает список неключевых атрибутов (, дочерней , ) ICildParamDecl j Возвращает список атрибутов дочерней сущности в (, , ) с их типами данных (см. %ParamDecl) %CildPK(, Генерирует раздельный список функций для каждого , ) элемента первичного ключа дочерней сущности, выпол- %CildPKDecl Возвращает спф исок атрибутов первичного ключа (, , ) ней сущности в связи с их типами данных (см.

%Concat (, :

Производит конкантенацию и . Воз- :

вращает результат % Cur rent Database Возвращает имя БД, которое используется в диалоге %CurrentFile Возвращает имя файла модели (. ER1), на основе которой % Cur rent Server Возвращает имя сервера, для которого генерируется %CurrentUser ;

Возвращает имя пользователя, которое используется в %CurrentTriggerDef ault- Часть триггера, определенного пользователем default Body body, которая содержится в diagram-wide-сегменте шаблона CUSTOM TRIGGER FOOTER %CurrentTriggerDef ault- i Часть триггера, определенного пользователем default Footer footer, которая содержится в diagram-wide-сегменте шаблона CUSTOM TRIGGER FOOTER % Cur rent Trigger Default- Часть триггера, определенного пользователем default Header header, которая содержится в diagram-wide-сегменте шаблона CUSTOM TRIGGER HEADER %DatatypeName ( } Возвращает тип данных IDatatypeScale ( ) Для десятичных типов данных возвращает разряд числа %DatatypeWidth() :

Возвращает ширину поля %Datatime Возвращает строку, представляющую текущую дату и %DBMS Возвращает имя СУБД %DBMSDelim Возвращает разделитель операторов СУБД %Decl (,) присваивает ей значение - 126- Макрокоманда Описание %Def aultName Возвращает имя по умолчанию %DefaultValue Возвращает значение по умолчанию %DomainDatatype () %DomainDef () %DomainName Возвращает имя домена %DomainNullOption ( Возвращает режим нулевых значений для домена ) ; (NULL/NOT NULL) %DomainValidation ( Возвращает имя правила валидации, связанное с доменом ) %EntityId() %EntityName () IFile (, ) IFire Задает, когда срабатывает триггер %ForEachAtt (

, Расширяет макрокод для каждого из атрибутов ) заданной {} таблицы %ForEachChildRel Расширяет для каждой связи, в () которой сущность триггера является дочерней {} IForEachDe fault Расширяет макрокод для каждого значения по () умолча- {} нию %ForEachDomain Расширяет макрокод для каждого домена () (} %ForEachEntity Расширяет макрокод для каждой сущности () {} %ForEachFKAtt Расширяет макрокод для каждого из атрибутов () внешнего {} ключа, мигрировавших через текущую связь %ForEachIndex ( [
], Расширяет макрокод для каждого индекса в [], [], подмножест- [] ) ве модели {} %ForEachIndexMem ( Расширяет макрокод для каждого члена индекса в [], под- [] ) множестве модели {} %ForEachKey( [
], Расширяет макрокод для всех инвертированных входов [], [] ) и {} альтернативных ключей в подмножестве модели - 127- Макрокоманда Описание %ForEachKeyMem ( Расширяет макрокод для всех членов ключей [], [] ) {} %ForEachParentRel Расширяет для каждой связи, в () которой сущность триггера явл
Pages:     | 1 |   ...   | 10 | 11 || 13 | 14 |






















© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.