
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
13.12.2015, 17:34
|
|||
|---|---|---|---|
|
|||
Триггер, изменяющий поле таблицы |
|||
|
#18+
Здравствуйте. У меня есть база данных с таблицами кошелек и транзакция. В кошельке есть определенная сума, все транзакции приписываються до кошелька. Мне нужно, чтоб при додавании, удалении либо редагировании транзакции сума в кошельке менялась в зависимости от типа транзакции (Expense и Income) соответственно отнималась или додавалась к суме. Таблицы Wallet и Transaction связаны между собой через FK. В Wallet поле Total (сума), в Transaction - Type (Expense/Income) и Fid_wallet. Как я поняла, здесь может помочь триггер. Подскажите пожалуйста, буду очень признательна. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:35
|
|||
|---|---|---|---|
|
|||
Триггер, изменяющий поле таблицы |
|||
|
#18+
rogalik, пример подобного триггера CREATE TRIGGER contragent_platel BEFORE INSERT OR UPDATE ON contragent FOR EACH ROW EXECUTE PROCEDURE trigger_contragent_platel(); CREATE OR REPLACE FUNCTION trigger_contragent_platel() RETURNS trigger AS $BODY$begin if (new.inn is null or rtrim(ltrim(new.inn))='') then new.platel='f'; else if translate(rtrim(ltrim(new.inn)),'1234567890', '') = '' then new.platel='t'; else new.platel='f'; end if; end if; return new; end;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION trigger_contragent_platel() OWNER TO postgres; Ключевое слово - BEFORE INSERT OR UPDATE Иначе текущая таблица не изменяется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:39
|
|||
|---|---|---|---|
|
|||
Триггер, изменяющий поле таблицы |
|||
|
#18+
rogalik, пример триггера меняющего другие таблицы CREATE TRIGGER tr04oplata AFTER INSERT OR UPDATE ON oplata FOR EACH ROW EXECUTE PROCEDURE trigger_oplata03(); CREATE OR REPLACE FUNCTION trigger_oplata03() RETURNS trigger AS $BODY$declare rec record; recperiod record; rec2 record; rec3 record; rec32 record; rec31 record; rec4 record; rec5 record; begin for rec5 in SELECT "gruppapotrebteplo"."kod", "gruppapotrebteplo"."naim" FROM "public"."contragentteplofirma" "contragentteplofirma" INNER JOIN "public"."gruppapotrebteplo" "gruppapotrebteplo" ON "gruppapotrebteplo"."gruppapotrebteplo_id" = "contragentteplofirma"."gruppapotrebteplo_id" WHERE contragentteplofirma.contragentteplofirma_id=new.contragentteplofirma_id limit 1 loop end loop; if rec5.kod is null then end if; for rec in select god,mesyz from period where period_id=new.period_id loop end loop; for recperiod in select god,mesyz from period where period_id=new.period_id loop end loop; for rec4 in select period_id from period,systema where period.god=rec.god and period.mesyz=rec.mesyz and period.systema_id=systema.systema_id and systema.kodsystema=48 loop end loop; for rec in select kod from txo where txo_id=new.txo_id loop end loop; for rec3 in select a.txo_id,a.debet_id,a.kredit_id,a.vidoplata_id,a.tipoplata_id,c.kod,a.txoprovodka_id from txoprovodka a,txo b,period,analitika5 c where a.analitika5_id=c.analitika5_id and period.mesyz=recperiod.mesyz and period.god=recperiod.god and b.period_id=period.period_id and b.kod=21 and a.txo_id=b.txo_id loop end loop; for rec32 in select a.txo_id,a.debet_id,a.kredit_id,a.vidoplata_id,a.tipoplata_id,b.kod,a.txoprovodka_id from txoprovodka a,txo b,period where period.mesyz=recperiod.mesyz and period.god=recperiod.god and b.period_id=period.period_id and b.kod=23 and a.txo_id=b.txo_id limit 1 loop end loop; new.summapdv:=round(new.summa/6,2); if new.teplo!= true then new.priznak2:=0; new.priznak3:=0; new.contragentteplofirma_id=null; end if; if (new.contragentteplofirma_id is not null) then end if; if (rtrim(ltrim(rec5.kod))='400') then else end if; if (new.contragentteplofirma_id is not null and rtrim(ltrim(rec5.kod))='400' ) then if exists (select * from oplataabon where oplata_id=new.oplata_id) then if exists (select * from txoprovodka a,kredit b, planshetov c where c.subshet=311 and c.planshetov_id= b.planshetov_id and a.kredit_id = b.kredit_id and a.txo_id=new.txo_id) then update oplataabon set summa=round(new.summa*0.02,2) where oplata_id=new.oplata_id and txo_id=new.txo_id and new.txo_id=rec3.txo_id and rec3.kod=2; update oplataabon set summa=round(new.summa*0.02,2) where oplata_id=new.oplata_id and txo_id=new.txo_id and new.txo_id=rec3.txo_id and rec3.kod=1; else /* с сентября 2011 снято по указанию Киндзерской и Лены */ /* if exists (select * from txoprovodka a,kredit b, planshetov c where (rtrim(ltrim(c.subshet::text))='301' or rtrim(ltrim(c.subshet::text))='631' or (rtrim(ltrim(c.subshet::text))='685' and rtrim(ltrim(c.analitika))='3' ) ) and c.planshetov_id= b.planshetov_id and a.kredit_id = b.kredit_id and a.txo_id=new.txo_id) then */ if exists (select * from txoprovodka a,kredit b, planshetov c where (rtrim(ltrim(c.subshet::text))='301') and c.planshetov_id= b.planshetov_id and a.kredit_id = b.kredit_id and a.txo_id=new.txo_id) then update oplataabon set summa=round(new.summa*0.02,2) where oplata_id=new.oplata_id; end if; end if; else if exists (select * from txoprovodka a,kredit b, planshetov c where c.subshet=311 and c.planshetov_id = b.planshetov_id and a.kredit_id = b.kredit_id and a.txo_id=new.txo_id) then for rec3 in select a.txo_id,a.debet_id,a.kredit_id,a.vidoplata_id,a.tipoplata_id,c.kod,a.txoprovodka_id from txoprovodka a,txo b,period,analitika5 c where a.analitika5_id=c.analitika5_id and period.mesyz=recperiod.mesyz and period.god=recperiod.god and b.period_id=period.period_id and b.kod=21 and a.txo_id=b.txo_id loop if rec3.kod=1 then insert into oplataabon (txoprovodka_id,period_id,auto,txo_id,debet_id,kredit_id,vidoplata_id,tipoplata_id,oplata_id,contragentteplofirma_id,summa) values(rec3.txoprovodka_id,rec4.period_id,true,rec3.txo_id,rec3.debet_id,rec3.kredit_id,rec3.vidoplata_id,rec3.tipoplata_id,new.oplata_id,new.contragentteplofirma_id,round(new.summa*0.02,2)) ; else insert into oplataabon (txoprovodka_id,period_id,auto,txo_id,debet_id,kredit_id,vidoplata_id,tipoplata_id,oplata_id,contragentteplofirma_id,summa) values(rec3.txoprovodka_id,rec4.period_id,true,rec3.txo_id,rec3.debet_id,rec3.kredit_id,rec3.vidoplata_id,rec3.tipoplata_id,new.oplata_id,new.contragentteplofirma_id,round(new.summa*0.02,2)) ; end if; end loop; else if exists (select * from txoprovodka a,kredit b, planshetov c where (c.subshet=301 ) and c.planshetov_id= b.planshetov_id and a.kredit_id = b.kredit_id and a.txo_id=new.txo_id) then if (rec.kod=7 or rec.kod=8) then else insert into oplataabon (txoprovodka_id,period_id,auto,txo_id,debet_id,kredit_id,vidoplata_id,tipoplata_id,oplata_id,contragentteplofirma_id,summa) values(rec32.txoprovodka_id,rec4.period_id,true,rec32.txo_id,rec32.debet_id,rec32.kredit_id,rec32.vidoplata_id,rec32.tipoplata_id,new.oplata_id,new.contragentteplofirma_id,round(new.summa*0.02,2)) ; end if; end if; end if; end if; else delete from oplataabon where oplata_id=new.oplata_id; end if; return new; end;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION trigger_oplata03() OWNER TO postgres; ключевое слово - AFTER INSERT OR UPDATE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:40
|
|||
|---|---|---|---|
|
|||
Триггер, изменяющий поле таблицы |
|||
|
#18+
Perederiyrogalik, пример триггера на текущую таблицу CREATE TRIGGER contragent_platel BEFORE INSERT OR UPDATE ON contragent FOR EACH ROW EXECUTE PROCEDURE trigger_contragent_platel(); CREATE OR REPLACE FUNCTION trigger_contragent_platel() RETURNS trigger AS $BODY$begin if (new.inn is null or rtrim(ltrim(new.inn))='') then new.platel='f'; else if translate(rtrim(ltrim(new.inn)),'1234567890', '') = '' then new.platel='t'; else new.platel='f'; end if; end if; return new; end;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION trigger_contragent_platel() OWNER TO postgres; Ключевое слово - BEFORE INSERT OR UPDATE Иначе текущая таблица не изменяется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:45
|
|||
|---|---|---|---|
Триггер, изменяющий поле таблицы |
|||
|
#18+
Perederiy, TS-у нужен инкрементальный расчет остатков (кошёлки) по изменениям транзакций (покупок, поступлений). Т.ч. вы мимо тазика. если мне не изменяет склероз, в RTFM по триггерам на plpgsql оидн из триггеров в примерах всегда (ещё с 7.3) был из этой оперы. http://www.postgresql.org/docs/current/static/plpgsql-trigger.html см например RTFMExample 40-6. A PL/pgSQL Trigger Procedure For Maintaining A Summary Table - там богато. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:47
|
|||
|---|---|---|---|
Триггер, изменяющий поле таблицы |
|||
|
#18+
ЗЫ Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:50
|
|||
|---|---|---|---|
|
|||
Триггер, изменяющий поле таблицы |
|||
|
#18+
qwwqPerederiy, TS-у нужен инкрементальный расчет остатков (кошёлки) по изменениям транзакций (покупок, поступлений). Т.ч. вы мимо тазика. если мне не изменяет склероз, в RTFM по триггерам на plpgsql оидн из триггеров в примерах всегда (ещё с 7.3) был из этой оперы. http://www.postgresql.org/docs/current/static/plpgsql-trigger.html см например RTFMExample 40-6. A PL/pgSQL Trigger Procedure For Maintaining A Summary Table - там богато. ну так используйте возможности plpgsql для любых расчетов какие вашей душе угодно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:52
|
|||
|---|---|---|---|
Триггер, изменяющий поле таблицы |
|||
|
#18+
Perederiy, с чем спорите, спорщик ? всё никак на работу не берут ? сочувствую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 14:57
|
|||
|---|---|---|---|
|
|||
Триггер, изменяющий поле таблицы |
|||
|
#18+
qwwq, с вами конечно - вы не правы ps мы с вами встречались ? PPS я давно работаю (начиная с 1983 года) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.12.2015, 15:11
|
|||
|---|---|---|---|
Триггер, изменяющий поле таблицы |
|||
|
#18+
Perederiyqwwq, с вами конечно где ? Perederiyps мы с вами встречались ? PPS я давно работаю (начиная с 1983 года) http://www.sql.ru/forum/1180062/razrabotchik-baz-dannyh-mysql-postgres-novosibirsk?mid=18346097#18346097 я вас там часто видел последние годы. но если у вас всё хорошо с работой -- то и ладушки. вам остаётся обучиться форматированию кода. и не суетиться без надобности. успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&tablet=1&tid=1997573]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 421ms |

| 0 / 0 |
