
Англ. Группы D, F / D / ibase
.pdf
www.vr-online.ru |
© Шкрыль Андрей |
DM.IBTransaction1.RollbackRetaining;
exit;
end;
{Если запрос выполнился, то потверждаем транзакцию}
DM.IBTransaction1.CommitRetaining;
{Обновляем набор данных, можно и Refresh но мне так больше нравится и работает это корректней}
IBQuery1.Close;
IBQuery1.Open;
end;
Кидаем на форму компонет еще один компонент IBQuery, свойство
DATABASENAME DM.IBDATABASE1.
В свойстве SQL IBQuery3 пишем:
Delete from Tovar where TovarID=:Par1
Это означает – удалить из таблицы товаров товар с кодом равным значению параметра.
Щелкаем по свойству Params компонента IBQuery3, появляется окошко
Выделяем запись Par1 и в инспекторе объектов правим свойство DataType на ftInteger, в свойстве Value пишем значение по умолчанию 0.
Кидаем на форму еще одну кнопку, в Caption пишем “–“ В событие OnClick, пишем:
procedure TFormTovar.Button4Click(Sender: TObject); begin
{Спрашиваем юзера, правда ли он хочет удалить запись} if MessageDlg('Вы уверены, что хотите удалить запись',
mtConfirmation,[mbYes,mbNo],0)=mrYes then
{если да, то}
www.vr-online.ru |
© Шкрыль Андрей |
begin
{запоминаем код выбранной записи, и помещаем это значение в параметр Par1}
IBQuery3.Params.ParamByName('Par1').Value:= IBQuery1TOVARID.Value;
{Пытаемся удалить запись} try
IBQuery3.ExecSQL;
{если не получилось, то сообщаем об этом юзеру} except
ShowMessage('Удаление не прошло!'+#13+ 'Запись заблокировано, либо уже удалена!');
{откатывем транзакцию}
DM.IBTransaction1.RollbackRetaining;
exit;
end;
{Если все нормалек, то потверждаем транзакцию}
DM.IBTransaction1.CommitRetaining;
{Обновляем набор данных}
IBQuery1.Close;
IBQuery1.Open;
end;
end;
На рис.18. представлен окончательный вариант справочника товары.

www.vr-online.ru |
© Шкрыль Андрей |
Рис.18.
Вуаля! Один справочник закончили, фу! Теперь можно сделать пару глотков пивка, или сходить поганять чайку!
Если у тебя все получилось, то второй справочник мы закодим без проблем, потому что будет делать все тоже самое, только будут изменяться название полей, с которыми будем работать. Если же у тебя что не срастается, то возвращайся к началу, и читай, читай.
Итак, идем дальше!

www.vr-online.ru |
© Шкрыль Андрей |
Создаем новую форму, называем ее FormFirm. В свойство Caption пишем - Справочник – фирмы. Сохраняем под именем UFirm
Кидаем компоненты DBGrid, DBNavigator, Button – 2 штуки, IBQuery, DataSource (рис.19.).
Рис.19.
Свойство Enabled кнопки «Выбрать», установи в False.
Для компонента DBNavigator, свойство VisibleButtons сделай такими же, как первый раз.
В Cвойство DataSet, компонента DataSource устанавливаем IBQuery1. В Свойство
DataSource компонентов DBGrid и DBNavigator ставим DataSource1.
Выбираем пункт меню File\USE Unit, рис.20.

www.vr-online.ru |
© Шкрыль Андрей |
Рис.20.
Выбираем UDM и жмем ОК. Это нужно чтоб мы смогли подключить компонент
IBQuery1 к компоненту IBDatabase.
В свойстве Database компонента IBQuery1 ставим:
Теперь заходим в свойство SQL этого же компонента
И пишем в окне Command Text Editor следующий запрос:
select * from Firm order by Name
Если перевести на русский язык, то это будет означать:
Выбрать все данные из таблицы Фирмы, и отсортировать по названию фирмы!
Щелкаем два раза по компонету IBQuery1. Щелкаем правой кнопкой мыши по появившемуся окошку и выбираем AddAllFields. После этого настроим отображение полей:

www.vr-online.ru |
© Шкрыль Андрей |
Выбираем FIRMID и в инспекторе объектов, свойство Visible ставим в False. Теперь это поле не будет отображаться на экране, во время работы с программой.
Для Name в свойство DisplayLabel пишем “Название фирмы”. В свойство DisplayWidth ставим 30 – это свойство отвечает за ширину поля в DBGRid.
Щелкаем два раза на кнопке Закрыть и пишем код: FormFirm.Close.
Выбираем пункт меню Project\Option . И помощью стрелочек переносит FormFirm в правую половину окна, таким образом мы говорим Delphi что во время работы программы мы будет сами следить за созданием этой формы и ее удалением.
Жмем оК!
Делаем активной MainForm и для пункта меню Справочники\Фирмы пишем код! Но предварительно нам надо подключить модуль FormFirmTovar, это делается с помощью пункта меню File\USE UNIT.
FormFirm:=TFormFirm.Create(self);
FormFirm.IBQuery1.Open;
FormFirm.ShowModal;
Идем на форму FormFirm в событии OnClose пишем: FormFirm.IBQuery1.Close; {Закрыть набор данных, если закрывают справочник}
Кидаем на форму компонет IBQuery, свойство DATABASENAME DM.IBDATABASE1. В свойстве SQL IBQuery2 пишем:
insert into Firm (Name) VALUES (:NAME);
www.vr-online.ru |
© Шкрыль Андрей |
Это означает вставить новую запись в таблицу Firm со значением взятым из параметра
Name.
Щелакаем по свойству Params компонента IBQuery2, в появившемся окошке. Выделяем запись Name и в инспекторе объектов правим свойство DataType на ftString,
в свойстве Value пишем значение по умолчанию «БББ».
Кидаем на форму еще одну кнопку, в Caption пишем “+”. В событие OnClick этой кнопки пишем:
procedure TFormFirm.Button3Click(Sender: TObject); var
s:string; begin
{Запрашиваем у пользователя данные}
s:=InputBox('Введите данные','Введите название организации','');
{Передаем введенное название в параметр}
IBQuery2.Params.ParamByName('Name').Value:=s;
{пытаемся выполнить запрос} try
IBQuery2.ExecSQL;
{если не удалось, то сообщаем об ошибке} except
ShowMessage('Добавление не получилось!'+#13+ 'Повторите попытку');
{откатываем транзакцию}
DM.IBTransaction1.RollbackRetaining;
exit;
end;
{если запрос выполнился, то потверждаем транзакцию}
DM.IBTransaction1.CommitRetaining;
{обновляем набор данных}
IBQuery1.Close;
IBQuery1.Open;
end;
Кидаем на форму еще один компонет IBQuery, свойство DATABASENAME - DM.IBDATABASE1.
В свойстве SQL IBQuery3 пишем: Delete from Firm
www.vr-online.ru |
© Шкрыль Андрей |
where FirmID=:Par1
Это означает - а впрочем, ты уже должен знать, что это означает, если не знаешь, то назад, назад, назад, читай все сначала!
Щелакаем по свойству Params компонента IBQuery3, в появившемся окошке выделяем запись Par1 и в инспекторе объектов правим свойство DataType на ftInteger, в свойстве Value пишем значение по умолчанию 0.
Кидаем на форму еще одну кнопку, в Caption пишем “-“. В событие OnClick, пишем:
procedure TFormFirm.Button4Click(Sender: TObject); begin
{Спрашиваем юзера, правда ли он хочет удалить запись} if MessageDlg('Вы уверены, что хотите удалить запись',
mtConfirmation,[mbYes,mbNo],0)=mrYes then
{если да, то} begin
{запоминаем код выбранной записи, и помещаем это значение в параметр Par1}
IBQuery3.Params.ParamByName('Par1').Value:= IBQuery1FIRMID.Value;
{Пытаемся удалить запись} try
IBQuery3.ExecSQL;
{если не получилось и не срослось, то сообщаем об этом юзеру} except
ShowMessage('Удаление не прошло!'+#13+ 'Запись заблокировано, либо уже удалена!');
{откатывем транзакцию}
DM.IBTransaction1.RollbackRetaining;
exit;
end;
{Если все нормалек, то потверждаем транзакцию}
DM.IBTransaction1.CommitRetaining;
{Обновляем набор данных}
IBQuery1.Close;
IBQuery1.Open;
end;
end;
На рис.21. представлен окончательный вариант справочника организации.

www.vr-online.ru |
© Шкрыль Андрей |
Рис.21.
Вуаля! Наш последний справочник завершен.
Теперь перейдем к самому интересному. Будем кодить процесс продажи товара.
Переходим на главную форму MainForm, кидаем компоненты DBGrid, IBQuery, DataSource, три Button (рис.22).
Рис.22.

www.vr-online.ru |
© Шкрыль Андрей |
У кнопок в свойство Caption пишем “Открыть базу”, “Продать”, “Закрыть”. Выбираем пункт меню File\USE Unit. Выбираем UDM и жмем ОК
В свойстве Database компонента IBQuery1 ставим:
Теперь заходим в свойство SQL этого же компонента
И пишем в окне Command Text Editor следующий запрос:
select * from Sale,Tovar,Firm where
Sale.FIRMKOD=FIRM.FIRMID and
Sale.TOVARKOD=TOVAR.TOVARID
На русский язык это переводитсяr как выбрать все данные по продажам, причем код организации заменить на название организации, а код товара, заменить на код товара. Таким образом с помощью этого запроса мы связываем все три таблицы.
Свойство DataSet, компонента DataSource устанавливаем в IBQuery1. А свойство
DataSource компонента DBGrid устанавливаем в DataSource1
Щелкаем два раза по кнопке “Открыть базу”, и здесь напишем простую процедуру аутентификацииэто просто пример, реально так ничего не защитишь, по хорошему надо заводить пользователей средствами Interbase и давать им роли и все такое, ну да ладно, у нас учебная база, нам можно.
procedure TMainForm.Button1Click(Sender: TObject); var
s:string; begin
{спрашиваем пароль входа} s:=InputBox('Аутентификация','Введите пароль:','');
{если пароль правильный, то} if s='Parol' then
begin
{открываем базу продаж}
IBQuery1.Open;
{кнопку "Открыть базу" делаем недоступной}
Button1.Enabled:=false; end
else {если пароль не правильный, то ругаемся}