Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли сделать триггер на UPDATE опред-ного поля 
V
    Опции темы
ksili
Дата 17.3.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Есть два приложения, работающих с одной БД (FB 2.0.3). Проблема в том, что одно из них может использовать в запросах к БД в качестве переменных только строки или целочисленные переменные. Из-за этого для хранения суммы денег наверно будет использоватья такой приём: сумма будет храниться в двух видах - SUMMA типа NUMERIC(15,2) (это сумма в рублях - так было изначально) и SUMMA_KOP типа INTEGER (это сумма в копейках). Одно из приложений будет работать с одним полем, а второе с другим. 
Задача - синхронизировать изменения этих полей. Т.е. при обновлении поля SUMMA в SUMMA_KOP должно записываться SUMMA*100, а при обновлении SUMMA_KOP  в SUMMA запишется SUMMA_KOP/100. Проблема - как определить, какое именно поле обновлятся? Т.е. как можно отличить в триггере два запроса:
Код

update T_USERS set SUMMA=105,7 where ID_USER=3

и 
Код

update T_USERS set SUMMA_KOP=10570 where ID_USER=3

Вот такой триггер before update так как надо не работает:
Код

  /* Trigger text */
  if(new.summa is null) then
    begin
        new.summa = new.summa_kop/100;
    end
  else if(new.summa_kop is null) then
    begin
        new.summa_kop = new.summa*100;
    end

т.к. new.summa и new.summa_kop смотрится в БД, а не из запроса обновления.

Это сообщение отредактировал(а) ksili - 17.3.2008, 09:26


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 17.3.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



в триггерах (при обновлении) есть контекстные переменные New и Old

Код

if (new.summa <> old.summa) then .... пришло новое значение


Добавлено через 1 минуту и 15 секунд
old.summa - это значение, которое хранится в поле на данный момент
PM MAIL   Вверх
ksili
Дата 17.3.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Да. Это то, что нужно. Теперь триггер выглядит так:
Код

  /* Trigger text */
  if(new.summa_kop <> old.summa_kop) then
    begin
        new.summa = cast((new.summa_kop) as NUMERIC(15,2))/100;
    end
  else if(new.summa <> old.summa) then
    begin
        new.summa_kop = new.summa*100;
    end

Но теперь проблема с преобразованием типов. Если присваиваю summa_kop=30, то summa получается вместо 0,3 равной нулю

Добавлено через 3 минуты и 7 секунд
а вот при summa_kop=130, получается summa=1,3 
то есть нормально

Добавлено через 4 минуты и 23 секунды
А нет, теперь всё работает. Спасибо, Akella


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0836 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.