Задание: Для моделибазы данных,разработаннойв первой самостоятельнойработе [1], используя DataBaseDesktop,дать описаниесистемы соответствующихтаблиц локальнойбазы данных в формате Paradox7.
Структуратаблиц:
ТаблицаAVTOR:
Код автора(KOD)-ключевое,автоинкрементноеполе;
Фамилия,имя, отчество(FIO)-строкадо 50 символов,обязательногозаполнения;
Год рождения(ROZD)– строка до 4символов смаской “####”
ТаблицаCIKL:
Код цикла(KOD)-ключевое,автоинкрементноеполе;
Названиецикла (NAZV)-строка до 120символов,обязательногозаполнения;
ТаблицаDISCIP:
Коддисциплины(KOD)-ключевое,автоинкрементноеполе;
Названиедисциплины(NAZV)-строка до 120символов,обязательногозаполнения;
Код цикла(KCIKL)- содержит ссылкуна таблицуподстановкиCIKL,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
ТаблицаGRUP:
Код группы(KOD)-ключевое,автоинкрементноеполе;
Кодспециальности(KSP)- содержит ссылкуна таблицуподстановкиSPEC,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
Названиепотока (POTOK)- строка до 20символов,обязательногозаполнения;
Годпоступления(GOD)- строка до 4символов смаской “####”,обязательногозаполнения.
ТаблицаKNIGI:
Код книги(KOD)-ключевое,автоинкрементноеполе;
Названиекниги (NAZV)-строка до 120символов,обязательногозаполнения;
Количествокниг (KOLICH)– короткоецелое типаSHORT;
Год издания(GOD)- строка до 4символов смаской “####”,обязательногозаполнения.
ТаблицаRecomend:
Кодрекомендации(KOD)-ключевое,автоинкрементноеполе;
На какойсеместр рекомендация(SEMESTR)- короткое целоетипа SHORT,обязательногозаполнения;
Код книги(KKNIG)- содержит ссылкуна таблицуподстановкиKNIGI,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
Кодспециальности(KSPEC)- содержит ссылкуна таблицуподстановкиSPEC,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
Коддисциплины(KDISC)- содержит ссылкуна таблицуподстановкиDISCIP,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
ТаблицаSOOTV:
Кодсоответствия(KOD)-ключевое,автоинкрементноеполе;
Код книги(KKNIG)- содержит ссылкуна таблицуподстановкиKNIGI,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
Код автора(KAVT)- содержит ссылкуна таблицуподстановкиAVTOR,по полю KOD,типа LongInteger(установленассылочнаяцелостность);
ТаблицаSPEC:
Кодспециальности(KOD)-ключевое,автоинкрементноеполе;
Названиеспециальности(NAZV)- строка до 120символов,обязательногозаполнения;
Номерспециальности(NOM)- строка до 10символов,обязательногозаполнения;
Кафедра:“ПрограммногообеспеченияВТ и АС”
к.т.н., доцент
СаринковА.А.
Таблицы,используемыв экранныхформах
Создадимсистему экранныхформ для работысо сложнойсвязью междутаблицами«Книги» и «Авторы».Данные таблицысвязываютсямежду собойс помощью третьейтаблицы –«Соответствие».Таким образом,один авторможет бытьпривязан кнесколькимкнигам, в написаниикоторых онпринимал участие.Связь междутаблицами можнопосмотретьна схеме данных.
Связь книга->автор
Вид формына этапе проектирования:
Вид формыработающегоприложения:
Содержимоелевой таблицыменяется приизмененияуказателя вправой таблице.За это отвечаетпроцедура:
procedureTSvaz.Table1AfterScroll(DataSet: TDataSet);
begin
query1.Close;
query1.Params[0].Value:=table1.FieldByName('KOD').AsInteger;
query1.Open;
end;
Напримерпри переходена следующуюзапись мы меняемзначение параметра“par”у компонентаQuery1на значениеполя “KOD”текущей записикомпонентаtable1.
Сам текстзапроса Query1:
select*
fromAVTOR
wherekod in(
selectkavt
from SOOTV
wherekknig=:par )
Для навигациипо названиямкниг можнопользоватьсякомпонентом«DBNavigator», которыйпривязан к томуже набору чтои DBGrid1(леваятаблица). Длядобавленияи удаленияавтора надопользоватьсякнопками «Добавить»и «Удалить».
Процедуранажатия накнопку «удалить»:
procedureTSvaz.BitBtn1Click(Sender: TObject);
begin
table2.FindKey([table1.fieldbyname('KOD').asinteger,query1.fieldbyname('KOD').asinteger]);
table2.Delete; // переход, удалениеи обновление
Table1.AfterScroll(table1);
end;
Процедуранажатия накнопку «добавить»:
procedureTSvaz.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;
После выходаиз формы выбораавтора управлениепередаетсяпроцедуре:
procedureTSvaz.vstavka;
begin
ifnot(TableProv.FindKey([table2.fieldbyname('KKnig').asinteger,table2.fieldbyname('KAvt'). asinteger])) thenbegin //поисктакойжезаписикакхотимввестивужевведенных
try
Table2.post; //сохранение
table2.Close; //обновление
table2.Open;
except
messagedlg('Данныйавтор присутствуетв списке',mtinformation,[mbok],0); // сюда никогда
//неперейдет
end;
end
elsebegin
table2.Cancel;
messagedlg('Данныйавторприсутствуетвсписке',mtinformation,[mbok],0);
end;
end;
Из-за ошибкив Delphiпришлось вставлятьеще два компонентаTableProvи DataProv– для того, чтобсначала искатьтакую же записьв таблицесоответствия,какую хотимввести, и незадействоватьуникальныйиндекс, построенныйпо полям Kknigи Kavt.Так как программапотом перестаетработать. Вотвырезка изконференции:
НиколаевКонстанитн (04.12.0120:54)
Уважаемыеспециалисты!
Чтозначит ошибка"Index is out of date"?
Суважением,
Константин.
Ю.Ю. (05.12.0102:48)
Ошибкав индексномфайле. Нужноудалить и создатьзаново.
kaif© (05.12.0122:13)
Эта ошибкасуществуетв D3,D4,D5. В D6 не проверял,но уверен и тамона есть. Я пробовалписать дажена Borland Second Team по этомуповоду, но никтоменя слушатьдаже не захотел- отсылали нафорумы. Хотяэто чудовищныйбаг, по моемумнению. Ошибкагенерится последующемуалгоритму:
1.Вставляетезапись в таблицуParadox, с нарушениемуникальногоиндекса. Неважно,первичногоили вторичного.ВозникаетKey violation.
2. Делаетеневинный SQL-запроспротив этойтаблицы. Любой,например,
SELECT * FROM