Рассмотрим несколько примеров использования триггеров и хранимых процедур для определения условия достоверности ввода данных и начальных значений полей таблицы.
Определение значения поля при добавлении новой записи
Рассмотрим следующий пример. Чтобы создать для таблицы customer первичный ключ, в таблицу было добавлено поле, содержащее код клиента. Информация в данное поле должна заноситься программно, чтобы не нарушалась уникальность ключа. Для формирования и записи в таблицу кода клиента при добавлении новой записи создадим хранимую процедуру 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=ColRecordsInTable
SELECT (cNameAliasGANN)
RETURN nDefaultValueGANN
Рис. 14.4. Задание вызова хранимой процедуры
Проверка удовлетворения введенных значений заданному условию
В данном примере определим условие проверки достоверности ввода данных для таблицы ordsaied, содержащей информацию о заказе. Например, при формировании накладной отпуска товара в кредит необходимо сравнивать итоговую сумму заказываемых товаров с максимально допустимым кредитом для данного клиента, содержащимся в таблице customer. Проверку будем осуществлять при вводе каждой позиции заказа.
Рис. 14.5. Определение условия достоверности данных
Для создания хранимой процедуры checkMaxCredit в окне редактирования хранимых процедур, которое содержит ранее созданные программы. введите следующий текст:
procedure CheckMaxCredit
nCdOrder=Ordsaled.icdOrder ыь номер текущего заказа
* вычисляем сумму всех введенных позиций заказа
SELECT SUM(Ordsaled.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:
procedure AddNewCustomer
nCurCdCustomer=icdCustomer
SELECT NewCustomer
APPEND BLANK
REPLACE icdCustomer WITH nCurCdCustomer
SELECT NewCustomer
RETURN .T.