Использование триггеров и хранимых процедур
Рассмотрим несколько примеров использования триггеров и хранимых процедур для определения условия достоверности ввода данных и начальных значений полей таблицы.
Определение значения поля при добавлении новой записи
Рассмотрим следующий пример. Чтобы создать для таблицы customer первичный ключ, в таблицу было добавлено поле, содержащее код клиента. Информация в данное поле должна заноситься программно, чтобы не нарушалась уникальность ключа. Для формирования и записи в таблицу кода клиента при добавлении новой записи создадим хранимую процедуру GetAutoNewNum.
- Откройте окно проекта sales.
- Создайте в базе данных sales таблицу Records, которая будет использоваться для хранения последних введенных значений кода. Данная таблица содержит два поля. Первое поле предназначено для ввода наименования таблицы, второе – для указания последнего введенного числового кода в данную таблицу. При вызове хранимой процедуры значение второго поля указанной таблицы увеличивается на единицу, и процедура возвращает новое значение кода. Введите в созданную таблицу название таблицы Customer и число, указывающее количество записей, содержащихся в ней.
- Выберите в окне проекта таблицу Customer и нажмите кнопку Modify (Модифицировать).
- Для определения свойств поля, содержащего код клиента, перейдите на вкладку Fields (Поля).
- В поле ввода Default value (Значение по умолчанию) области Field validation (Проверка правильности ввода) задайте вызов функции GetAutoNewNum(), введя Getautonewttum ("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=ColRecordsInTable SELECT (cNameAliasGANN) RETURN nDefaultValueGANN
Рис. 14.4. Задание вызова хранимой процедуры