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