Рассмотрим несколько
примеров использования триггеров и хранимых процедур для определения условия
достоверности ввода данных и начальных значений полей таблицы.
Определение значения поля при добавлении новой записи
Рассмотрим следующий
пример. Чтобы создать для таблицы 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.