Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер, изменяющий поле таблицы / 11 сообщений из 11, страница 1 из 1
13.12.2015, 17:34
    #39126740
rogalik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
Здравствуйте. У меня есть база данных с таблицами кошелек и транзакция. В кошельке есть определенная сума, все транзакции приписываються до кошелька. Мне нужно, чтоб при додавании, удалении либо редагировании транзакции сума в кошельке менялась в зависимости от типа транзакции (Expense и Income) соответственно отнималась или додавалась к суме.
Таблицы Wallet и Transaction связаны между собой через FK. В Wallet поле Total (сума), в Transaction - Type (Expense/Income) и Fid_wallet.
Как я поняла, здесь может помочь триггер. Подскажите пожалуйста, буду очень признательна. Спасибо.
...
Рейтинг: 0 / 0
14.12.2015, 14:35
    #39127354
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
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
Иначе текущая таблица не изменяется
...
Рейтинг: 0 / 0
14.12.2015, 14:39
    #39127363
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
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
...
Рейтинг: 0 / 0
14.12.2015, 14:40
    #39127367
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
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
Иначе текущая таблица не изменяется
...
Рейтинг: 0 / 0
14.12.2015, 14:45
    #39127369
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
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
- там богато.
...
Рейтинг: 0 / 0
14.12.2015, 14:47
    #39127371
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
ЗЫ
Код: sql
1.
SELECT 'йа научусь пользоваться тегами скульра'

...
Рейтинг: 0 / 0
14.12.2015, 14:50
    #39127374
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
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 для любых расчетов какие вашей душе угодно
...
Рейтинг: 0 / 0
14.12.2015, 14:52
    #39127378
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
Perederiy,

с чем спорите, спорщик ?

всё никак на работу не берут ? сочувствую.
...
Рейтинг: 0 / 0
14.12.2015, 14:57
    #39127387
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
qwwq,

с вами конечно - вы не правы

ps
мы с вами встречались ?

PPS
я давно работаю (начиная с 1983 года)
...
Рейтинг: 0 / 0
14.12.2015, 15:11
    #39127404
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
Perederiyqwwq,

с вами конечно где ?


Perederiyps
мы с вами встречались ?

PPS
я давно работаю (начиная с 1983 года)
http://www.sql.ru/forum/1180062/razrabotchik-baz-dannyh-mysql-postgres-novosibirsk?mid=18346097#18346097

я вас там часто видел последние годы.

но если у вас всё хорошо с работой -- то и ладушки. вам остаётся обучиться форматированию кода. и не суетиться без надобности. успехов.
...
Рейтинг: 0 / 0
14.12.2015, 15:16
    #39127413
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер, изменяющий поле таблицы
qwwq,

банальная подработка на удаленке
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер, изменяющий поле таблицы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]