День добрый:) Встречайте новенького...
Решил сделать триггер. При попытке апдейта надо что-нить проверить, и заблокировать апдейт исходя из этого условия. Цели я добился, вот только галка при этом выдаёт неприятное сообщение: Ошибка Операция прервана триггером. таблица N11053.
Собственно вопрос, как от него избавиться?
Пример триггера:
handler netrigger1 on trigger ps_lines before update [1]
action
{
var buf : record as table ps_lines;
result:=False;
GetTableBuffer(buf);
if (buf.kol=1) result := true;
else message('block');
}
rollback
{
}
Триггер
Модераторы: m0p3e, edward_K, Модераторы
-
- Местный житель
- Сообщения: 370
- Зарегистрирован: 28 сен 2006, 15:43
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Триггер
Скорее всего в коде триггера ничего с этим не поделать. Либо как-то иначе обработать ситуацию, чтоб и триггер вернул true, и изменений не произошло) Например, написать какой-то vip-интерфейс для обработки записи.
-
- Постоянный гость
- Сообщения: 76
- Зарегистрирован: 07 июн 2007, 12:32
- Откуда: Витебск
- Контактная информация:
Re: Триггер
Подобную задачу (блокирование ввода значения партий из ордера решил следущим образом
Работает успешно
Код: Выделить всё
objInterface objTrigsporder;
function DoUpd(crec:comp;cpart:comp) :boolean;
function OldParty(crec:comp):comp;
function IsAdmin:boolean;
end;
//объявление Vip-интерфейса
vipInterface vipTrigsporder implements objTrigsporder;
//======================================================
//реализация Vip-интерфейса
interface vipTrigsporder;
//------------------------------------------------------
//логическая таблица для связанной таблицы
create view as select * from sporder,x$users;
//------------------------------------------------------
//функция добавления записи в связанную таблицу
function DoUpd(crec:comp;cpart:comp):boolean;
{
if getfirst sporder where ((crec==sporder.nrec))=TsOk
{
if (cpart<>sporder.cparty) result:=True
else
result:=False;
}
}
function OldParty(crec:comp):comp;
{
if getfirst sporder where ((crec==sporder.nrec))=TsOk
{
result:=sporder.cparty;
}
else result:=0;
}
function IsAdmin:boolean;
{
if(getfirst x$users where ((UserId==atl_nrec))=TsOk)
{
if (x$users.xu$type=1) result:=True
else
result:=False;
}
}
end.
var GlobVipTrigsporder : vipTrigsporder new;
///
handler ipart46 on trigger sporder before update [99]
action
{
var buf : record as table sporder with x$position;
var str:string;
var mod,prizn:word;
GetTableBufferP(buf);
//Определяем откуда вызван триггер
str:=upcase(GetIfcCurrentFieldName);
//Если пользователь - не администратор
if(not globviptrigsporder.isadmin)
{
if globviptrigsporder.doupd(buf.nrec,buf.cparty)
{
// и партия была изменена
prizn:=0;
if(pos('PARTY',str)>0) prizn:=1;
if(pos('SPORDER',str)>0) prizn:=1;
if(pos('KATMC',str)>0) prizn:=1;
// Определяем места откуда нельзя пользователю менять партию
if prizn=1
{
// В буфер возвращаем старое значение партии
set buf.cparty:=globviptrigsporder.oldparty(buf.nrec)
}
}
}
SetTableBuffer(buf);
result := true;
}
rollback
{
}