Как узнать в триггере, какие поля были модифицированны?

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Как узнать в триггере, какие поля были модифицированны?

Сообщение Max_Ural »

Стоит задача написать триггер, который будет делать определенные действия, только если модифицированы два конкретных поля таблицы.
Нашел функцию GetTableBuffer, но не могу понять, как получить буфер таблицы до изменения и после.
Gera
топ-софт
Сообщения: 97
Зарегистрирован: Пн, 24/09/2007 17:53
Имя Фамилия: Юрий Герман
Откуда: ТопСофт
Контактная информация:

Сообщение Gera »

Вот пример. Если что непонятно, спрашивайте.

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

!------------------------------------------------------------------------------
! Пример получения значения до и после изменения
!------------------------------------------------------------------------------

Handler with replace UpdateBeforeOborot on Trigger Oborot before update
Action
{
  var BufNew : record as table Oborot;
  Message('Before Update GetTableBuffer=' + string(GetTableBuffer(BufNew))
          + ' BufNew.SumOb=' + string(BufNew.SumOb));

  var BufOld : record as table Oborot;
  BufOld.NRec := BufNew.NRec;

  Message('Before Update GetAnyTableRecord=' +
          string(GetAnyTableRecord(coOborot, BufOld, tiOborot11)) +
          ' BufOld.SumOb=' + string(BufOld.SumOb));

  Result := true;
}
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Немного не понял
Изменил таблицу и поле на те, которые меня интересуют
Получился код

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

Handler with replace UpdateBeforeSpSopr on Trigger SpSopr before update
Action
{
  var BufNew : record as table SpSopr;
  Message('Before Update GetTableBuffer=' + string(GetTableBuffer(BufNew))
          + ' BufNew.kol=' + string(BufNew.kol));

  var BufOld : record as table SpSopr;
  BufOld.NRec := BufNew.NRec;

  Message('After Update GetAnyTableRecord=' +
          string(GetAnyTableRecord(coSpSopr, BufOld, tiSpSopr01)) +
          ' BufOld.kol=' + string(BufOld.kol));

  Result := true;
}
Меня смущает два момента:
1. Оба message'a показывают мне старое значение
2. Появляется не два сообщения, как я ожидал, а четыре
Подскажите пожалуйста, что я не так делаю

Причем сейчас попробовал поменять значение в строке с 5 на 3, перешел на другую.
Вернулся к начальной и опять поменял значение с 3 на 1.
При этом во всех сообщениях триггера вывелось число 5
Gera
топ-софт
Сообщения: 97
Зарегистрирован: Пн, 24/09/2007 17:53
Имя Фамилия: Юрий Герман
Откуда: ТопСофт
Контактная информация:

Сообщение Gera »

Мой пример пробовали собрать и проверить?
Версия Атлантиса? Платформа?

По поводу четырех сообщений - очевидно происходят два обновления записи, вот триггер и срабатывает дважды.
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Виноват, Ваш пример собрал, все работает корректно.
Атлантис 5.4, Pervasive

И опять же моя вина - взял поле, которое не изменяется при редактировании из спецификации накладной, а только из расширенной информации.

Триггер отработал корректно
Спасибо за помощь
Ответить