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

Задание: Для модели базы данных, разработанной в первой самостоятельной работе [1], используя DataBase Desktop, дать описание системы соответствующих таблиц локальной базы данных в формате Paradox7.

Структура таблиц:

Таблица AVTOR:

    Код автора (KOD)-ключевое, автоинкрементное поле;

    Фамилия, имя, отчество (FIO)-строка до 50 символов, обязательного заполнения;

    Год рождения (ROZD) – строка до 4 символов с маской “####”

Таблица CIKL:

    Код цикла (KOD)-ключевое, автоинкрементное поле;

    Название цикла (NAZV)- строка до 120 символов, обязательного заполнения;

Таблица DISCIP:

    Код дисциплины (KOD)-ключевое, автоинкрементное поле;

    Название дисциплины(NAZV)- строка до 120 символов, обязательного заполнения;

    Код цикла (KCIKL) - содержит ссылку на таблицу подстановки CIKL, по полю KOD, типа Long Integer (установлена ссылочная целостность);

Таблица GRUP:

    Код группы (KOD)-ключевое, автоинкрементное поле;

    Код специальности (KSP) - содержит ссылку на таблицу подстановки SPEC, по полю KOD, типа Long Integer (установлена ссылочная целостность);

    Название потока (POTOK) - строка до 20 символов, обязательного заполнения;

    Год поступления (GOD) - строка до 4 символов с маской “####”, обязательного заполнения.

Таблица KNIGI:

    Код книги (KOD)-ключевое, автоинкрементное поле;

    Название книги (NAZV)- строка до 120 символов, обязательного заполнения;

    Количество книг (KOLICH) – короткое целое типа SHORT;

    Год издания (GOD) - строка до 4 символов с маской “####”, обязательного заполнения.

Таблица Recomend:

    Код рекомендации (KOD)-ключевое, автоинкрементное поле;

    На какой семестр рекомендация (SEMESTR) - короткое целое типа SHORT, обязательного заполнения;

    Код книги (KKNIG) - содержит ссылку на таблицу подстановки KNIGI, по полю KOD, типа Long Integer (установлена ссылочная целостность);

    Код специальности (KSPEC) - содержит ссылку на таблицу подстановки SPEC, по полю KOD, типа Long Integer (установлена ссылочная целостность);

    Код дисциплины (KDISC) - содержит ссылку на таблицу подстановки DISCIP, по полю KOD, типа Long Integer (установлена ссылочная целостность);

Таблица SOOTV:

    Код соответствия (KOD)-ключевое, автоинкрементное поле;

    Код книги (KKNIG) - содержит ссылку на таблицу подстановки KNIGI, по полю KOD, типа Long Integer (установлена ссылочная целостность);

    Код автора (KAVT) - содержит ссылку на таблицу подстановки AVTOR, по полю KOD, типа Long Integer (установлена ссылочная целостность);

Таблица SPEC:

    Код специальности (KOD)-ключевое, автоинкрементное поле;

    Название специальности (NAZV) - строка до 120 символов, обязательного заполнения;

    Номер специальности (NOM) - строка до 10 символов, обязательного заполнения;

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

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

Лабораторная работа №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 <table>
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.

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

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

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

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

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

Тема: “ Проектирование экранной формы электронного

аналога исходного документа ”

Выполнил:

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

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

Проверил:

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

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

Хабаровск 2002



Вид формы ввода

Для соединения всех основных таблиц воедино используется таблица SVOD. Для установления связи между таблицами используем компоненты TTable и Tquery. А точнее – их свойства MasterSource.

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

В первых трех таблицах выбирается предмет и специальность, для которых надо вывести рекомендуемую литературу. Таблица «Предмет» связана с таблицей цикл «Цикл» связью многие к одному.

При смене положения указателя в первых трех таблицах запускается процедура zapr – для обновления данных в таблицах «Книги» и «Авторы книг» через компоненты Query.

Процедура zapr.

procedure tsvaz.zapr;

var

i:integer;

begin

cislo:=0;

with querysvod do begin

Close;

parambyname('spec').Value:=table4.fieldbyname('KOD').AsInteger;

parambyname('dis').Value:=table5.fieldbyname('KOD').AsInteger;

Open;

AfterScroll(QuerySvod);

first;

for i:=1 to recordcount do begin

cislo:=cislo+querySvod.fieldbyname('KOLICH').value;

label7.Caption:=floattostr(cislo);

next;

end;

end;

end;

Данная функция задает значения параметрам компонента querysvod, который связан с таблицей «Книги».

Потом подсчитывается количество требуемых книг и выводится на поверхность формы с помощью компонента Label7. Сумма рассчитывается последовательным перебором записей querysvod.

Также в теле данной процедуры вызывается процедура AfterScroll(QuerySvod):

procedure TSvaz.QuerySvodAfterScroll(DataSet: TDataSet);

begin

query1.Close;

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

query1.Open;

end;

Тут задается значение параметру компонента query1 – для обновления записей в таблице «Список авторов».

SQL запросы.

Текст запроса компонента querySvod:

select * from knigi

where kod in(

select KKnig from recomend

where kdisc=:dis and kspec=:spec

)

order by NAZV

выбирает из таблицы knigi.db все поля, где значения kdisc и kspec – берутся из верних таблиц. Результаты запроса отображаются в таблице «Книги».

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

select *

from AVTOR

where kod in(

select kavt

from SOOTV

where kknig=:par )

order by FIO

через таблицу SOOTV идет связь книг с авторами и авторы данной книги отображаются в книге «Список авторов».

Таким образом в данной форме отображаются все данные, которые были в печатном документе.