Лабораторные работы (в ХГТУ)
Задание: Для модели базы данных, разработанной в первой самостоятельной работе [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 идет связь книг с авторами и авторы данной книги отображаются в книге «Список авторов».
Таким образом в данной форме отображаются все данные, которые были в печатном документе.