Конференция "Базы" » как создать триггер [D7, IB6.x]
 
  • dolmat (12.02.09 10:16) [0]
    есть таблица SCETCIKI вида
    лс пок.нач пок.кон. кол-во ID_usl_k
    в ней несколько записей со ссылкой на один ID_usl_k из другой таблицы kvp_us
    как сделать триггер

    CREATE TRIGGER UPD_SCETCIK1 FOR SCETCIKI
    ACTIVE AFTER UPDATE POSITION 1
    AS

    begin
     update kvp_us set kvp_us.KOLVO=sum(SCETCIKI.KOLVO) where kvp_us.NPP=SCETCIKI.ID_US_K;
    end
  • Сергей М. © (12.02.09 10:26) [1]

    > как сделать триггер


    Что значит "как" ?
  • Johnmen © (12.02.09 10:27) [2]
    1. Учить азы SQL. Акцентировать внимание на агрегатных функциях.
    2. Сходить на www.ibase.ru
  • Сергей М. © (12.02.09 10:34) [3]

    > Johnmen ©   (12.02.09 10:27) [2]


    Тут и агрегаты вряд ли не нужны, достаточно вычесть old.KOLVO и прибавить new.KOLVO)
  • Johnmen © (12.02.09 10:41) [4]

    > Сергей М. ©   (12.02.09 10:34) [3]

    М.б. даже ничего ни вычитать ни прибавлять.
    Но м.б. и агрегат...

    Тьфу! Не хочу гадать.

    Автору - задавать конкретные вопросы после выполнения [2]
  • dolmat (12.02.09 12:37) [5]
    Прото выставляю на одобрям

    CREATE TRIGGER UPD_SCETCIK1 FOR SCETCIKI
    ACTIVE AFTER UPDATE POSITION 1
    AS
    DECLARE VARIABLE kolkn FLOAT;
    begin
    SELECT sum(kolvo) from SCETCIKI where (ID_US_K=old.ID_US_K)
    into :kolkn;
    if (:kolkn>0) then
     begin
     update kvp_us set KOLVO=:kolkn where NPP=old.ID_US_K;
     end
    end
  • Сергей М. © (12.02.09 12:44) [6]

    > dolmat   (12.02.09 12:37) [5]


    А почему не нужно обновлять аккумулятор в поле KOLVO, если kolkn<=0 ?

    И собссно зачем всякий раз заново перерасчитывать sum(kolvo), если вполне достаточно скорректировать kvp_us.KOLVO на величину new.SCETCIKI.kolvo - old.SCETCIKI.kolvo ?
  • dolmat (12.02.09 13:01) [7]
    Сергей М. ©   (12.02.09 12:44) [6]

    мм.да наверное перемудрил
  • Sergey13 © (12.02.09 13:09) [8]
    > [5] dolmat   (12.02.09 12:37)

    Почему только Update? Insert и Delete тоже влияют на результат.
  • Сергей М. © (12.02.09 13:27) [9]

    > dolmat   (12.02.09 13:01) [7]


    И опять же - нет никакого резона апдейтить аккумулятор, если new.SCETCIKI.kolvo = old.SCETCIKI.kolvo

    Мало ли по каким причинам сработал триггер ! Например, обновлены какие-то другие поля таблицы, а поле SCETCIKI.kolvo при этом не претерпело изменений
  • dolmat (12.02.09 13:29) [10]

    > Sergey13 ©   (12.02.09 13:09) [8]

    влияют на результат но не в этой ситуации т.к. без insert c начальным показанием не вносится ID_связи
  • Sergey13 © (12.02.09 13:41) [11]
    > [10] dolmat   (12.02.09 13:29)
    > влияют на результат но не в этой ситуации

    ИМХО, тригер должен правильно работать при ВСЕХ возможных ситуациях.
    То что сейчас обычно что-то не вносится в твоем приложении не говорит о том что это никогда не будет вноситься никем другим.
    Тем более, что там писать то три строчки.
 
Конференция "Базы" » как создать триггер [D7, IB6.x]
Есть новые Нет новых   [134477   +40][b:0][p:0]