Разработка базы данных
Реферат - Компьютеры, программирование
Другие рефераты по предмету Компьютеры, программирование
dbyname('K4').AsString='' then begin
MessageDlg('Введите номер воинской части',mterror,[mbok],0);
ibtable1.fieldbyname('K4').FocusControl;
abort;
end;
if ibtable1.fieldbyname('SerNo').AsString='' then begin
MessageDlg('Введите серийный номер аппарата!', mterror, [mbok],0);
ibtable1.fieldbyname('SerNo').FocusControl;
abort;
end;
if ibtable1.fieldbyname('K3').AsString='' then begin
MessageDlg('Введите модель аппарата!',mterror,[mbok],0);
ibtable1.fieldbyname('K3').FocusControl;
abort;
end;
if ibtable1.State=dsinsert then IBTable1. FieldByName('KOD5'). AsInteger:=-1; (*)
end;
Нужна для предотвращения занесения null в поля SerNo,K3,K4, по которым можно однозначно идентифицировать запись в наборе данных svodka (по ним можно построить ключ).
Еще один нюанс если убрать строку (*), то при добавлении новой записи будет выдаваться ошибка, что не заполнено поле, на которое стоит ограничение not null. Эта ошибка возникает, потому что сервер interBase генерирует уникальное значение в поле “KOD5” после сохранения, а до сохранения он проверяет значение в поле “KOD5”, записи, полученной от клиентского приложения на пустое значение, то есть до генерации не доходит. Для того, чтобы этого избежать мы при добавлении новой записи заносим в поле “KOD5” любое числовое значение, которое все равно потом триггером поменяется на уникальное. Аналогичное действие мы проводим для всех таблиц.
FormMain и FormVvod2
FormMain основная, родительская форма для всех остальных форм. Управление отображением дочерних окон внутри родительской осуществляется с помощью Api функции ShowWindow.
FormVvod2 экранная форма с отображением параметров одного конкретно взятого прибора. Навигация идет по таблице Svodka, с которой связан компонент IBTable1 из формы DM. Воинская часть и модель отображаются с помощью связи компонента TLookupKomboBox из компонентов IBTable44 и IBTable5 соответственно.
Вид форм при работе программы:
FormVvod
Вид формы при работе программы:
В форме отображаются записи таблицы svodka, с которой связан компонент IBTable1. Добавил поля Lookup в компонент IBTable и в таблице появились поля выбора воинской части и модели аппарата.
Vch
В форме список всех воинских частей.
Вид:
Svazka
Вид формы:
С помощью галочки Связанный набор можно устанавливать или убирать связь между таблицами “Раздел”, “Наименование” и “Модель”. Тип связей: “Наименование” подчиненная для “Раздела”, а “Модель” подчиненная для “Наименования”. Процедура клика на CheckBox:
procedure TSvazka.CheckClick(Sender: TObject);
begin
if check.Checked then begin
svazka.Caption:='Редактирование связанных таблиц: Раздел->Наименование->Модель';
dm.IBTable3.active:=false;
dm.IBTable4.active:=false;
dm.IBTable3.IndexFieldNames:='K1';
dm.IBTable3.MasterSource:=dm.DataSource2;
dm.IBTable4.IndexFieldNames:='K2';
dm.IBTable4.MasterSource:=dm.DataSource3;
dm.IBTable3.active:=true;
dm.IBTable4.active:=true;
end
else begin
svazka.Caption:='Редактирование не связанных таблиц';
dm.IBTable3.MasterSource:=nil;
dm.IBTable3.IndexFieldNames:='NAIM';
dm.IBTable4.MasterSource:=nil;
dm.IBTable4.IndexFieldNames:='MODEL';
end;
end;
Из текста процедуры видно, что мы меняем свойства MasterSource, которое содержит ссылку на главную таблицу и выставляем индекс для сортировки по алфавиту при отсутствии связей между таблицами. Но эта форма используется еще и для задания параметров запросу, который будет рассмотрен ниже.
Avt и Opr
О авторе и о программе.
ZaprVibr
Вид формы:
Форма нужна для выбора типа запроса(а по запросу формируем отчет).
Запросы
Поиск не списанного или списанного аппарата
Данные запросы почти полностью одинаковы, рассмотрим поиск не списанного аппарата.
Вид формы:
DbGrid связана с Zapr1 через DZapr.
Текст запроса:
select kod5,vch,model,serno,dvip,cena
from SVODKA,CHASTT,MODELL
where K4 in
(select KOD
from CHASTT
where UPPER(VCH) like upper(:pvch)
) and (UPPER(serno) like upper(:pserno))
and (dspis is null)
and K3 in
(select KOD3
from Modell
where UPPER(Model) like upper(:pmodel)
)
and svodka.k4=chastt.kod and svodka.k3=modell.kod3
order by vch
Тут используются вложенные запросы. Параметры берутся из полей edit. Для независимости от регистра используем процедуру UPPER. Процедура нажатия на кнопку Выполнить:
with dm do begin
Zapr1.Active:=false;
if ch1.Checked then zapr1.ParamByName('pvch').Value:= '%'+edit1.Text+'%'
else zapr1.ParamByName('pvch').Value:='%%';
if ch2.Checked then zapr1.ParamByName('pserno').Value:= '%'+edit2.Text+'%'
else zapr1.ParamByName('pserno').Value:='%%';
if ch3.Checked then zapr1.ParamByName('pmodel').Value: ='%'+edit3.Text+'%'
else zapr1.ParamByName('pmodel').Value:='%%';
Zapr1.Active:=true;
label2.Caption:=inttostr(zapr1.RecordCount);
end;
При нажатии на кнопку просто задаются параметры sql запросу. В SQL используется оператор Like для поиска по части строки символы %, стоящие в начале и в конце параметра означают, что вместо них могут стоять любые другие.
Работает запрос так: ищутся такие записи в svodka, у которых K4 и K3 находятся из вложенных запросов как коды записей с частичным совпадением не ключевых полей с заданными параметрами “pvch” и “pmodel”, и серийный номер частично совпадает с “pserno”.
Аппарат является не списанным, если в поле “DSpis” (Дата списания) содержится значение null. Если нам надо найти списанный аппарат, то запрос будет почти такой же, только DSpis is not null. Поэтому поиск списанного аппарата я рассматривать не буду.
Отобранные записи сортируются по номеру воинской части (Order