Лабораторные работы (в ХГТУ) (Lab2)

Посмотреть архив целиком

Министерство Образования Российской Федерации
Хабаровский Государственный Технический Университет





Кафедра: “Программного обеспечения ВТ и АС”









Лабораторная работа №2



Тема: “ Проектирование системы экранных

форм для ведения локальной базы данных ”









Выполнил:

студент группы ПО-02

Самойленко П.Р.

Проверил:

к.т.н., доцент

Саринков А.А.





Хабаровск 2002



Таблицы, используемы в экранных формах

Создадим систему экранных форм для работы со сложной связью между таблицами «Книги» и «Авторы». Данные таблицы связываются между собой с помощью третьей таблицы – «Соответствие». Таким образом, один автор может быть привязан к нескольким книгам, в написании которых он принимал участие. Связь между таблицами можно посмотреть на схеме данных.


Связь книга->автор

Вид формы на этапе проектирования:


Вид формы работающего приложения:


Содержимое левой таблицы меняется при изменения указателя в правой таблице. За это отвечает процедура:

procedure TSvaz.Table1AfterScroll(DataSet: TDataSet);

begin

query1.Close;

query1.Params[0].Value:=table1.FieldByName('KOD').AsInteger;

query1.Open;

end;

Например при переходе на следующую запись мы меняем значение параметра “par” у компонента Query1 на значение поля “KOD” текущей записи компонента table1.

Сам текст запроса Query1:

select *

from AVTOR

where kod in(

select kavt

from SOOTV

where kknig=:par )


Для навигации по названиям книг можно пользоваться компонентом «DBNavigator», который привязан к тому же набору что и DBGrid1(левая таблица). Для добавления и удаления автора надо пользоваться кнопками «Добавить» и «Удалить».

Процедура нажатия на кнопку «удалить»:

procedure TSvaz.BitBtn1Click(Sender: TObject);

begin

table2.FindKey([table1.fieldbyname('KOD').asinteger,query1.fieldbyname('KOD').asinteger]);

table2.Delete; // переход, удаление и обновление

Table1.AfterScroll(table1);

end;

Процедура нажатия на кнопку «добавить»:

procedure TSvaz.BitBtn3Click(Sender: TObject);

begin

table2.Append; // добавление записи в таблицу «Соответствие»

table2.FieldByName('KKNIG').Asinteger:=table1.fieldbyname('KOD').AsInteger; // в поле

//“KKNIG” поместить значение кода текущей книги

ShowWindow(Vibor_Avt.Handle, SW_SHOW); // показать форму выбора автора

Vibor_Avt.Show;

svaz.Enabled:=false; // заблокировать форму

end;

После выхода из формы выбора автора управление передается процедуре:

procedure TSvaz.vstavka;

begin

if not (TableProv.FindKey([table2.fieldbyname('KKnig').asinteger, table2.fieldbyname('KAvt'). asinteger])) then begin // поиск такой же записи как хотим ввести в уже введенных

try

Table2.post; // сохранение

table2.Close; // обновление

table2.Open;

except

messagedlg('Данный автор присутствует в списке',mtinformation,[mbok],0); // сюда никогда

//не перейдет

end;

end

else begin

table2.Cancel;

messagedlg('Данный автор присутствует в списке',mtinformation,[mbok],0);

end;

end;

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

Николаев Констанитн   (04.12.01 20:54)

Уважаемые специалисты!

Что значит ошибка "Index is out of date"?

С уважением,
Константин.

Ю.Ю.   (05.12.01 02:48)

Ошибка в индексном файле. Нужно удалить и создать заново.

kaif ©   (05.12.01 22:13)

Эта ошибка существует в D3,D4,D5. В D6 не проверял, но уверен и там она есть. Я пробовал писать даже на Borland Second Team по этому поводу, но никто меня слушать даже не захотел - отсылали на форумы. Хотя это чудовищный баг, по моему мнению. Ошибка генерится по следующему алгоритму:
1. Вставляете запись в таблицу Paradox, с нарушением уникального индекса. Неважно, первичного или вторичного. Возникает Key violation.
2. Делаете невинный SQL-запрос против этой таблицы. Любой, например,
SELECT * FROM


3. Вставляете еще раз запись с нарушением уникального индекса. сообщение Key violation больше не появляется.
После переоткрытия таблицы будете гарантированно иметь "Index is out of date."
Кто не верит, могу выслать исходный код демонстрационной программы .
Из за этого мне пришлось выбирать между Paradox и Local SQL. Выбор был трудный. И я выбрал InterBase.
Главная подлость этой ошибки в том, что программист не пытается обычно создать более 1 key violation подряд. Этим обычно занимается пользователь. Поэтому ошибка плохо уловима и иногда вылезает через пару месяцев работы базы.

С описанной ошибкой столкнулся и я.


Форма выбора автора

В роли списка выступает компонент DBLookupListBox, который берет код из таблицы авторов и вставляет его в таблицу соответствия. При закрытии формы срабатывает процедура TSvaz.vstavka:

procedure TVibor_Avt.FormClose(Sender: TObject; var Action: TCloseAction);

begin

ShowWindow(Vibor_Avt.Handle, SW_HIDE); // скрыть форму, но не закрывать

action:=canone;

svaz.Enabled:=true;

if ((svaz.Table2.State=dsInsert) or (svaz.Table2.State=dsedit)) then svaz.vstavka;

// если мы добавляем нового автора, то перейти к vstavka

svaz.Table1.AfterScroll(svaz.table1);

end;

При нажатии на кнопку «Добавить» открывается форма редактирования списка авторов.


Форма выбора автора

Эта форма появляется на экране либо при нажатии на кнопке «Авторы» в меню главной формы, либо при нажатии на кнопке «Добавить» в форме, описанной выше.


Форма отображения всех таблиц


В этой форме заголовки столбцов в таблицах показываются «как есть», в отличие от всех предыдущих форм, где заголовок задавался на этапе проектирования – для удобства и наглядности. DBGrid’ы связаны с наборами данных, расположенными на поверхности формы DM, которая имеет тип DataModule.


Форма DM.

Вид формы на этапе проектирования:


Формы такого типа не имеют визуальных свойств и являются контейнером для не визуальных компонентов.



Случайные файлы

Файл
13646-1.rtf
176792.rtf
11205-1.rtf
115645.rtf
24273-1.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.