Триггер

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Триггер

Сообщение Robis »

День добрый:) Встречайте новенького...

Решил сделать триггер. При попытке апдейта надо что-нить проверить, и заблокировать апдейт исходя из этого условия. Цели я добился, вот только галка при этом выдаёт неприятное сообщение: Ошибка Операция прервана триггером. таблица 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
{
}
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: Триггер

Сообщение Vik »

Скорее всего в коде триггера ничего с этим не поделать. Либо как-то иначе обработать ситуацию, чтоб и триггер вернул true, и изменений не произошло) Например, написать какой-то vip-интерфейс для обработки записи.
Dmitry_Sol
Постоянный гость
Сообщения: 76
Зарегистрирован: 07 июн 2007, 12:32
Откуда: Витебск
Контактная информация:

Re: Триггер

Сообщение Dmitry_Sol »

Подобную задачу (блокирование ввода значения партий из ордера решил следущим образом

Код: Выделить всё

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
{
}

Работает успешно :-)
Ответить