English home work / ibase
.pdfwww.vr-online.ru |
© Шкрыль Андрей |
Введение
Привет! Если ты решил почитать эту статью, то значит у тебя есть желание научиться писать клиент-серверные приложения. Это сейчас очень актуальное направление в мире программного обеспечения. Потому что, все больше и больше организаций хотят автоматизировать свои внутренние и внешние процессы.
Мы разработаем клиент – серверное приложения «Продажа товара». Напишем его под Interbase! Так что запасись пивом, включи хороший музон и вперед.
О клиент – серверных базах данных
Не секрет, что базы данных делятся на однопользовательские и многопользовательские! В первом варианте юзер работает один со своей базой данных, и может делать с ней все что хочет. При многопользовательском варианте возникает сразу проблема – нужно обеспечить достоверность данных при одновременной работе нескольких пользователей с одной базой данных.
Чтобы не лохануться и обеспечить юзеров удобной работой в многопользовательском режиме умные дядки придумали транзакции. Вся их фишка заключается в следующем:
Перед внесением изменений в б.д.:
1.начинаем транзакцию
2.вносим изменения
3.пытаемся завершить транзакцию
a.Если завершить удалось, то все ОК
b.Если произошла ошибка, то отказываемся от всех изменений и говорим пользователю, типа попал ты браток.
Этого золотого правила тебе будет достаточно для написания любых клиент серверных приложений. И еще тебе понадобятся хотя бы базовые знания языка SQL! Потому все изменения в б.д. лучше вносить использую запросы, как раз, написанные на этом языке. Конкретно нам понадобяться команды Select, Insert, Update и Delete.
www.vr-online.ru |
© Шкрыль Андрей |
Постановка задачи
Представь что к тебе пришел умный дядька и просит написать ему программу для продажи товара со склада различным организациям
Ты подумал не торопясь над этой затеей и решил, что в твоей базе данных будут следующие таблицы:
•Таблица – ТОВАР (он же справочник ТОВАР)
Название |
Описание |
Тип данных |
|
|
TovarID |
Поле – счетчик |
счетчик |
|
|
Name |
Название товара |
Текст(100) |
|
|
Price |
Цена товара |
Текст (10), текст удобней чем число, потом сам |
|
|
|
|
все поймешь. 7 – для целой части цены, а 2 для |
|
|
|
|
копеек и один символ для запятой! |
|
|
• Таблица – ОРГАНИЗАЦИИ (он же справочник ОРГАНИЗАЦИИ) |
||||
|
|
|
|
|
Название |
Описание |
Тип данных |
|
|
FirmID |
Поле – счетчик |
счетчик |
|
|
Name |
Название организации |
Текст(100) |
|
|
• Таблица - ПРОДАЖИ |
|
|
|
|
|
|
|
Тип данных |
|
Название |
Описание |
|
|
|
SaleID |
Поле – счетчик |
|
счетчик |
|
FirmKod |
Код фирмы, совершающей покупку |
Число |
|
|
TovarKod |
Код товара, который купили |
Число |
|
|
Rem |
Комментарии по покупке |
|
Текст(100) |
|
www.vr-online.ru |
© Шкрыль Андрей |
Создание базы данных в Interbase
Я начну описание данного раздела с процесса установки этой СУБД. Даже если ты никогда не видел и не слышал про эту СУБД, установить ее проще пареной репы, проще наверно только играть в «САПЕР». Смотри рис.1.
Рис.1.
За основу возьмем установку 6 версии, но в принципе, установка любой другой ничем не отличается! Жмем дальше Next столько раз, сколько нужно, если есть желание, то можно изменить путь установки, предложенный по умолчанию, но я делать этого не советую! Установка проходит достаточно быстро, жмем FINISH!
Все, теперь вперед в бой – запускаем INTERBASE, для этого нам надо выбрать ярлычок IBCONSOLE. Смотри рис.2.
www.vr-online.ru |
© Шкрыль Андрей |
Рис.2.
Окно после запуска IBCONSOLE. Смотри рис.3.:
Рис.3.
www.vr-online.ru |
© Шкрыль Андрей |
Теперь нам надо зарегистрировать новую базу данных, для этого щелкаем на первую иконку слева . Мы увидим следующее окно (рис.4.).
Рис.4.
Так как мы будем создавать базу на своем компе, выбираем LocalServer, если хочется поэкспериментировать и создать базу на удаленном сервере, если он конечно у вас есть,
то выбирайте Remote server.
Вполе Description вводим описание нашего сервака.
Вполе Login Information – вводим логин и пароль админа базы данных, по умолчанию он будет:
User Name: SYSDBA
Password: masterkey
Жмем ок – сервер зарегестрирован.
Теперь создадим рабочую папку для программы – у меня путь к программе следующий C:\WorkIB
www.vr-online.ru |
© Шкрыль Андрей |
Далее создаем базу данных – выбираем пункт меню Database/Create Database. Появится следующее окно (рис.5.):
Рис.5.
Вполе Alias вводим произвольный псевдоним (этот псевдоним не будет псевдонимом BDE, он играет вспомогательную роль).
Указываем название файла базы данных и его месторасположение, в одной из строк списка Files.
Ввыпадающем списке Default Character Set выбираем пунки WIN1251, это чтоб нормально отображались русские буквы.
Жмем ОК, вуаля, база создана, окно IBCONSOLE приобретает следующий вид
(рис.6.):
www.vr-online.ru |
© Шкрыль Андрей |
Рис.6.
Теперь переходим к созданию таблиц. Выбираем в дереве Tables (левое окно) и
нажимаем кнопку SQL (5 слева) . Появляется окно (рис.7.):
www.vr-online.ru |
© Шкрыль Андрей |
Рис.7.
У меня окно уже с введенным запросом на создание таблицы Товары. Рассмотрим особенности этого запроса:
CREATE TABLE "TOVAR"
(
"TOVARID"INTEGER NOT NULL,
"NAME" VARCHAR(100) CHARACTER SET WIN1251 NOT NULL, "PRICE" INTEGER NOT NULL,
PRIMARY KEY ("TOVARID") );
Create table – команда создания запроса, в кавычках название таблицы, дальше в скобках указываются параметры таблицы, потом скобка закрывается и обязательно ставится точка с запятой. В скобках у нас указаны три поля. NOT NULL – означает что поле не может содержать пустых значений – если пользователь попытается сохранить значение NULL для, то произойдет ошибка на уровне СУБД, а обрабатывать вам эту ошибку в своей программе или нет, это уже ваше дело. Поле “Name” имеет текстовое значение в Interbase оно обозначается как VARCHAR и в скобках указывается
www.vr-online.ru |
© Шкрыль Андрей |
максимальное количество возможных символов, также здесь мы указываем кодировку для символов – это нужно чтобы нормально отображались русские символы.
Жмем кнопку «Высокого напряжения» - третья справа, вуаля, таблица создана. Вид окна IBConsole, после создания таблицы (рис.8.):
Рис.8.
В Interbase нет такого типа как счетчик или autoincrement, выход из этой ситуации обеспечивается созданием, так называемого генератора! Генератор – это хранящаяся в базе данных программа, выдающая при каждом обращении к ней уникальное число. Для каждого автоинкрементного поля в базе данных создается свой генератор.
Вызываем Interactive SQL, пятая кнопка справа. Пишем запрос:
CREATE GENERATOR GEN_TOVAR
Нажимаем выполнить.
При этом запрос выполнится, и окно запросов очиститься. Мы создали генератор GEN_TOVAR. Теперь нам надо установить начальное значение генератора, делается это следующим образом:
SET GENERATOR GEN_TOVAR TO 1
Нажимаем выполнить.
При этом запрос выполнится, и окно запросов очиститься.
www.vr-online.ru |
© Шкрыль Андрей |
В этом операторе начальное значение не может быть результатом запроса SELECT, поэтому если таблица не пустая, на момент создания генератора, то следующее значение определятся после выполнения следующего запроса:
SELECT MAX(TOVARID)+1 FROM TOVAR – ну это так сказать лирическое отступления, нам эта фишка не понадобиться, так как мы создаем все с нуля.
Теперь у нас есть генератор, с заданным начальным значением. Осталось только привязать генератор к конкретной таблице и конкретному полю.
Пишем запрос:
SET TERM !! ;
CREATE TRIGGER "BEF_INS_TOVAR" FOR "TOVAR"
ACTIVE BEFORE INSERT
AS
BEGIN
NEW.TOVARID=GEN_ID(GEN_TOVAR,1);
END!!
SET TERM ; !!
SET TERM ^ ;
Выполняем запрос! Вуаля наш генератор теперь введен в работу. Конструкция SET TERM задает новый разделитель операторов. Если ее не
использовать, то получится, что у тебя и после
NEW.TOVARID=GEN_ID(GEN_TOVAR,1); стоит точка с запятой и после END тоже стоит точка запятой, а INTERBASE это не нравится, почему я так и не понял, но она без конструкции SET TERM отказывается напрочь создавать триггер.
Рассмотрим поподробней, что же мы накодили:
Create Trigger – говорит что мы хотим создать триггер – правило, далее указываем название триггера и для какой таблицы он будет предназначен (FOR “TOVAR”).
Предложение ACTIVE BEFORE INSERT – указывает когда триггер должен выполняться, в данном случае, каждый раз перед созданием новой записи. Слово AS – зарезервированное, открывает тело триггера. Тело триггера всегда (даже если триггер содержит единственный оператор – как в нашем случае) должно ограничиваться парой ключевых слов BEGIN – END. В шестой строке расположен оператор, в котором новому значению (слово NEW) поля TOVARID присваивается значение, полученное от встроенной функции GEN_ID. Двумя параметрами обращения к этой функции указывается имя генератора и то значение, на которое должно увеличиться текущее значение генератора («шаг» генератора).