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