If dm.TEMP4.Fields[0].AsString<>'' then
Begin
{11} showmessage('Данная запись уже есть в БД');
{12} exit;
End
Else
Begin
{17} dm.COM.CommandText:='INSERT INTO kadri (fio_st,id_nc_st,id_ug_st,id_zv_st) values ("'+TRIM(e1.Text)+'",'+id_n+','+id_ug+','+id_zv+')';
{18} dm.COM.Execute;
{19} showmessage('Запись добавлена');
{21} dm.st.active:=false;
{22} dm.st.Active:=true;
{23} BitBtn1Click(Sender);
{24} end;
End
Else
Begin
{6} dm.TEMP4.Active:=false;
{7} dm.TEMP4.CommandText:='Select * FROM kadri WHERE (fio_st = "'+TRIM(e1.Text)+'") AND (id_nc_st = '+id_n+') AND (id_ug_st = '+id_ug+') AND (id_zv_st = '+id_zv+')';
{8} dm.TEMP4.Active:=true;
If dm.TEMP4.Fields[0].AsString<>'' then
Begin
If dm.TEMP4.Fields[0].AsString <>dm.st.Fields[0].AsString then
Begin
{35} showmessage('Данная запись уже есть в БД');
{36} exit;
{37} end;
End
Else
Begin
{42} dm.COM.CommandText:='Update kadri SET fio_st = "'+TRIM(e1.Text)+'",id_nc_st = "'+id_n+'",id_ug_st = "'+id_ug+'",id_zv_st = "'+id_zv+'" WHERE id_st = '+dm.st.Fields[0].AsString+'';
{43} dm.COM.Execute;
{44} showmessage('Запись изменена');
{46} dm.st.active:=false;
{47} dm.st.Active:=true;
{48} BitBtn1Click(Sender);
{49} end;
{50} end;
{51} end;
Как мы видим SQL-текст запросов усложнился, но вы уже знаете достаточно и можете сами в нм разобраться. Единственное что стоит отметить это то, что при добавлении в поле БД, где тип данных текстовый используется следующая структура: «"'+Переменная+'"», а при добавлении в поле БД, где тип данных числовой «'+Переменная+'». Собственно это видно и из запроса «Insert …».
Теперь стоит вспомнить о том, что мы говорили о справочниках, а именно что мы к ним еще вернемся. Сейчас как раз настало то время. Дело в том, что мы впервые воспользовались данными из справочников и теперь нам стоит пересмотреть алгоритм удаление из этих справочников. Теперь если мы удалим какое-нибудь звание, то вместе с этим перестанет отображаться информация о студентах, у которых было это звание. Именно перестанет отображаться, а не исчезнет, т.к. в БД информацию об этом студенте останется, а это уже будет захламление ненужной информацией нашей БД, что не есть хорошо.
Возможны два варианта в ситуации, когда мы хотим удалить какую-нибудь информацию из справочника, которая используется в других таблицах. Первое это запретить удаление этой записи пока она используется другими записями, второе это вместе с удалением данных из справочника удалить и все записи, которые используют удаляемую запись.
В данном примере мы будем применять первый способ. Ниже представлен измененный код кнопки «Удалить» для справочника «Национальность»:
{+Proverka}
If dm.pr.Fields[0].AsString='' then
begin
showmessage('Нет данных для удаления');
exit;
end;
{-Proverka}
If application.MessageBox('Вы хотите удалить запись?','Удаление', mb_yesno+mb_iconquestion)=idyes then
begin
{+Proverka2}
dm.TEMP4.Active:=false;
dm.TEMP4.CommandText:='Select * FROM UchPl WHERE id_pr_up = '+dm.pr.Fields[0].AsString+'';
dm.TEMP4.Active:=true;
If dm.TEMP4.Fields[0].AsString<>'' then
Begin
application.MessageBox('Эти данные используются в других таблицах','Удаление невозможно', mb_ok+mb_iconstop);
exit;
end;
{-Proverka2}
dm.COM.CommandText:='DELETE Prep FROM Prep WHERE id_pr = '+dm.pr.Fields[0].AsString+'';
dm.COM.Execute;
showmessage('Запись удалена успешно');
dm.pr.Active:=false;
dm.pr.Active:=true;
end;
end;
Текст обрамленный с спереди {+Proverka2} и сзади{-Proverka2} и есть код проверки на использование данных записей в других таблицах. Похожий код теперь нужно вставлять во все кнопки «Удалить» в тех справочниках данные, из которых используются в других таблицах. Теперь вы без трудов сможете доделать оставшиеся 2 таблицы: «Учебный план» и «электронный журнал». Их примерный внешний вид представлен на рисунках 26 и 27 соответственно.
Рисунок 26 – «Форма «Учебный план»
Рисунок 27 – «Форма «Электронный журнал»
При разработке формы «Электронный журнал» мы сталкиваемся с тем что в таблицу нужно добавить дату. Для ввода даты мы воспользуемся компонентом «DataTimePicker» с вкладки «Win32» (мы дадим ему имя «dtp»).Для добавления даты в «Access» можно использовать параметры или составлять строку. Мы будем использовать второй способ. Для этого напишем функцию под название «Data2», код которой представлен ниже:
function TFMain.DATA2(data:tdatetime):string;
var d,m,g:word;
Begin
decodedate(data,g,m,d);