Использование
триггеров и хранимых процедур
Рассмотрим несколько примеров использования
триггеров и хранимых процедур для определения условия достоверности ввода данных
и начальных значений полей таблицы.
Определение значения
поля при добавлении новой записи
Рассмотрим следующий пример. Чтобы
создать для таблицы customer первичный ключ, в таблицу было добавлено поле,
содержащее код клиента. Информация в данное поле должна заноситься программно,
чтобы не нарушалась уникальность ключа. Для формирования и записи в таблицу
кода клиента при добавлении новой записи создадим хранимую процедуру GetAutoNewNum.
-
Откройте окно проекта sales.
-
Создайте в базе данных sales таблицу
Records, которая будет использоваться для хранения последних введенных значений
кода. Данная таблица содержит два поля. Первое поле предназначено для ввода
наименования таблицы, второе — для указания последнего введенного числового
кода в данную таблицу. При вызове хранимой процедуры значение второго поля
указанной таблицы увеличивается на единицу, и процедура возвращает новое значение
кода. Введите в созданную таблицу название таблицы Customer и число, указывающее
количество записей, содержащихся в ней.
-
Выберите в окне проекта таблицу
customer и нажмите кнопку Modify (Модифицировать).
-
Для определения свойств поля,
содержащего код клиента, перейдите на вкладку Fields (Поля).
-
В поле ввода Default value (Значение
по умолчанию) области Field validation (Проверка правильности ввода) задайте
вызов функции GetAutoNewNum о , введя Getautonewnum("'Customer ")
(рис. 14.4).
-
Нажмите кнопку ОК для закрытия
конструктора таблицы.
-
Теперь необходимо определить функцию
GetAutoNewNum. Откройте окно редактирования хранимой процедуры и введите следующие
команды:
FUNCTION
GetAutoNewNum
LPARAMETERS cNameAliasGANN
LOCAL nDefaultValueGANN
IF TYPE("cNameAliasGANN")="L"
= GetMessage ("Нужно
ввести имя таблицы для определения начального
значения в таблице"+ALIAS()+"!",48,"Функция
GetAutoNewNum")
RETURN
1
ENDIF
cNameAliasGANN=ALLTRIM
(UPPER (cNameAliasGANN) )
DO OpenTable WITH "SALES!RECORDS",
1
IF !SEEK{cNameAliasGANN)
APPEND BLANK
REPLACE NameOfTable WITH
cNameAliasGANN
REPLACE ColRecordsInTable
WITH 1
ELSE
REPLACE ColRecordsInTable
WITH ColRecordsInTable+1
ENDIF
nDefaultValueGANN=ColRecords!nTable
SELECT (cNameAliasGANN)
RETURN nDefaultValueGANN
Рис. 14.4. Задание
вызова хранимой процедуры
Проверка удовлетворения
введенных значений заданному условию
В данном примере определим условие
проверки достоверности ввода данных для таблицы ordsaied, содержащей информацию
о заказе. Например, при формировании накладной отпуска товара в кредит необходимо
сравнивать итоговую сумму заказываемых товаров с максимально допустимым кредитом
для данного клиента, содержащимся в таблице customer. Проверку будем осуществлять
при вводе каждой позиции заказа.
-
Откройте окно проекта sales.
-
Выберите в окне проекта таблицу
ordsaied и нажмите кнопку Modify (Модифицировать).
-
Для определения свойств таблицы
перейдите на вкладку Table (Таблица).
-
В поле ввода Rule (Условие) области
Record validation (Проверка правильности ввода записи) задайте вызов функции
checkMaxCredit о, которая сравнивает итоговую сумму заказа с максимально допустимым
кредитом клиента.
-
В поле Message (Сообщение) области
Record validation введите текст сообщения (рис. 14.5) "Вы превысили допустимую
сумму кредита клиента".
Рис. 14.5. Определение
условия достоверности данных
-
Определим функцию CheckMaxCredit
как свойство базы данных, поэтому создадим ее в виде хранимой процедуры.
Для создания хранимой процедуры
CheckMaxCredit в окне редактирования хранимых процедур, которое содержит ранее
созданные программы, введите следующий текст:
procedure
CheckMaxCredit
nCdOrder=Ordsaled.icdOrder
&& номер текущего заказа
* вычисляем сумму всех
введенных позиций заказа
SELECT SUM(Ordsaied.nQuant*Ordsaled.nUnitPrice);
FROM Ordsalem, Ordsaied;
WHERE Ordsalem.icdOrder
= Ordsaied.icdOrder;
AND Ordsaied.icdOrder=nCdOrder;
INTO ARRAY nSum
* определяем максимальный
кредит клиента из таблицы Customer
SELECT Customer
SEEK Ordsalem.icdCustomer
* если запись о данном
покупателе в таблице Customer есть, возвращаем
* результат сравнения
суммы заказа с максимальным кредитом
IF FOUND( )
RETURN nSum(l) < CUSTOMER.yCreditLimit
ELSE
RETURN .F.
ENDIF
RETURN
Действия, выполняемые
при добавлении новых записей
Триггеры позволяют не только проверять
условие достоверности ввода данных на уровне записей, но и выполнять требуемые
действия при добавлении, удалении и изменении записей. Рассмотрим один из примеров
использования триггера insert.
В некоторых случаях полезно иметь
таблицу, в которой содержится список новых покупателей, которые обратились в
вашу фирму за последний месяц. Данная таблица очищается в начале каждого месяца
и может использоваться для рассылки рекламной информации новым покупателям.
Для хранения списка новых покупателей используется таблица Newcustomer.
В данном примере определим триггер
insert для таблицы customer:
-
Откройте окно проекта sales.
-
Выберите таблицу customer, содержащую
список товаров, и нажмите кнопку Modify (Модифицировать).
-
Для определения свойств таблицы
перейдите на вкладку Table (Таблица) конструктора таблиц.
-
В поле ввода Insert trigger (Триггер
добавления) задайте вызов функции AddNewCustomer о, которая добавляет новую
запись в таблицу Newcustomer.
-
Для добавления новой хранимой
процедуры AddNewCustomer откройте окно редактирования хранимых процедур и
добавьте в него следующий текст:
procedure
AddNewCustomer
nCurCdCustomer= icdCustomer
SELECT NewCustomer
APPEND BLANK
REPLACE icdCustomer WITH
nCurCdCustomer
SELECT NewCustomer
RETURN .T.