Работа 4 - Создание хранимой процедуры (2-й пример)
Справочную информацию по Interbase можно найти , например на
http://klog.h17.ru/interbase/
Задание:
Создайте БД, содержащую информацию для сети видеопроката для учета проката видеокассет.
С помощью хранимой процедуры обеспечьте контролера полной информацией о ходе проката кассеты, например, на случай ее порчи или утери.
Создание базы данных
Создадим БД в C:\dbase1\PROKAT_KASSET.GDB . Запускаем IBConsole.exe . Далее:
- В левом окошке этой программы - дв.щелчок на Local Server, вводим: User name = SYSDBA , password = masterkey (если настройки не изменялись )
- Раскрывается список БД, доступных на локальном сервере (но он сейчас не нужен).
- Открываем в меню: Database | Create database
- В окошке Files вписываем имя создаваемого файла и путь, т.е. например C:\dbase1\PROKAT_KASSET.GDB. Size можно не заполнять. Папка C:\dbase1\ должна существовать.
- В окошке Options выберите настройки. Птичку Register обычно оставляют.
- Щелкаем ОК. В левом окошке появляется созданная БД, а на диске - файл C:\dbase1\PROKAT_KASSET.GDB
Создание таблицы - IBConsole, SQL-запрос:
CREATE TABLE prokat
( KOD SMALLINT NOT NULL,
NAZV CHAR(30) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
STOIM SMALLINT NOT NULL,
FIO CHAR(30) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
DAT DATE NOT NULL,
SROK SMALLINT NOT NULL,
PRIMARY KEY (KOD) )
Для ввода запросов: Меню | Tools | Interacive SQL.
Справку по синтаксису запросов вы найдёте в файле \Program Files\Borland\InterBase\bin\SqlRef.hlp (англ)
Для заполнения таблиц данными: щелкаю в левом окне Tables, затем - в правом: дв щелчок по таблице, затем перейти на закладку Data. После заполнения 1-й строки - щелкнуть клавишу "стрелка вниз".
Для сохранения изменений - щелкнуть кнопку Птичка, для сохранения в БД - щелкнуть кнопку Commit & Refresh. Можно также пользоваться кнопками: + (вставить), - (удалить) и т д. Добавляем в таблицу несколько записей
Введём при помощи запроса хранимую процедуру.
Текст запроса:
SET TERM ^ ;
Create procedure prokat_kasset(IN_Kass smallint)
Returns (Name_K Char(30), Fio Char(30), Stoim_prokata smallint)
AS
Begin
For select NAZV, FIO, STOIM * SROK from prokat
where KOD = :IN_Kass
into :Name_K, :Fio, :Stoim_prokata
Do suspend;
End
^
COMMIT WORK ^
SET TERM ;^
Эта процедура принимает входной параметр - код клиента, вычисляет стоимость проката, умножая STOIM * SROK и возвращает название кассеты (:Name_K), фамилию клиента (:Fio), стоимость проката (:Stoim_prokata)
Создаём Делфи-проект для управления базой данных
- Запускаем Делфи7. Для появившейся формы устанавливаем заголовок - свойство Caption : Прокат кассет
- Устанавливаем компоненты для связи с БД
- IBDatabase1, IBTransaction1 (на закладке Interbase). На IBDatabase1 делаем правый щелчок, выбираем Database Editor. Здесь щелкаем Browse и находим нашу БД: C:\dbase1\PROKAT_KASSET.GDB - (файл должен находиться в папке)
- На панели Database Parameters впишите:
User Name: SYSDBA
Password : masterkey
Character set: WIN1251
Уберите птичку Login prompt, щелкните ОК . Согласитесь на отключение БД, если будет запрос.
- Установите (в инспекторе объектов) свойства: IBDatabase1.DefaultTransaction = IBTransaction1,
IBTransaction1.Default = IBDatabase1
- Устанавливаем компоненты для просмотра таблицы Прокат и выбора из неё нужного клиента: IBQuery1, DataSource1, DBGrid1, настраиваем их: IBQuery1.Database = IBDatabase1; DataSource1.DataSet = IBQuery1; DBGrid1.DataSource = DataSource1; IBQuery1.Active = true; Чтобы получить русские заголовки у таблицы, свойство IBQuery1.SQL заполняем так:
select kod as " Код", nazv as " Название", STOIM as " Стоимость за ед.",
Fio as " Фамилия клиента", dat as " Дата выдачи", srok as " На срок" from prokat
(Далее описан пример другого способа русификации заголовков DBGrid)
- Устанавливаем компоненты для просмотра результатов расчёта : IBQuery2, DataSource2, DBGrid2, настраиваем их: IBQuery2.Database = IBDatabase1; DataSource2.DataSet = IBQuery2; DBGrid2.DataSource = DataSource2; IBQuery2.Active = false; Свойство IBQuery2.SQL заполняем так:
select NAME_K as " Название кассеты", FIO as " Клиент",
STOIM_PROKATA as "Цена проката" from prokat_kasset (:Param1)
То есть IBQuery2 будет получать данные от хранимой процедуры prokat_kasset. В отличие от предыдущей работы, в этой не используется компонент StoredProc (хранимая процедура). Расчёт выполняется по щелчку на кнопке "Рассчитать", обработчик имеет вид:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
IBQuery2.Close;
IBQuery2.ParamByName('Param1').Value:=
IBQuery1.Fields[0].Value; // получаем значение поля "Код" выбранной в верхнем окошке записи
IBQuery2.Open;
end;
- Устанавливаем компоненты для правки данных таблицы Прокат : IBTable1, DataSource3, DBGrid3, DBNavigator1, настраиваем их: IBTable1.Database = IBDatabase1; DataSource3.DataSet = IBTable1; DBGrid3.DataSource = DataSource3; IBTable1.Active = true; DBNavigator1.DataSource = DataSource3;
- Для создания русских заголовков у DBGrid3 сделаем так:
- Правый щелчок в окне DBGrid3. Выбираем Columns Editor.
- Появляется окно редактора. В нём делаем правый щелчок, выбираем Add (добавить). В окне добавляется очередная колонка (поле), а в окне инспектора - его свойства. Выбираем из списка FieldName имя поля. Теперь раскрываем Title, вписываем в Caption заголовок для этого столбца. Можно заодно установить выравнивание и цвет фона.
- Чтобы сохранить исправленные данные в файле БД C:\dbase1\PROKAT_KASSET.GDB (на сервере) - щелкаем кнопку
"Изменения таблицы занести в БД", вызывая обработчик:
procedure TfrmMain.btnVklClick(Sender: TObject);
begin
IBTransaction1.CommitRetaining;
ibquery1.Active:= false;
ibquery1.Active:= true;
end;
Скачать все файлы делфи-проекта и файл БД - PROKAT_KASSET.GDB