<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Trigger update'ujacy pole typu DATE]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=231</link>
		<description><![CDATA[Najświeższe odpowiedzi w Trigger update'ujacy pole typu DATE.]]></description>
		<lastBuildDate>Tue, 16 Jun 2009 11:20:46 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=991#p991</link>
			<description><![CDATA[Wydajnościowo pewnie szybciej bedzie wołać beposrednio update'a.
Co do trybu opaque to zostal zastąpiony typem trigger.

pz]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 16 Jun 2009 11:20:46 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=991#p991</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=990#p990</link>
			<description><![CDATA[Sorki, że tak długo nie napisałem. 
Podane wyżej rozwiązanie DZIAŁA. :):)

Bardzo dziękuję za pomoc.

całość funkcji wygląda teraz tak:

[code]create function splata_trigger() returns opaque AS' 
declare
BEGIN 
 if(old.ilosc_pozyczki = new.splata_pozyczki ) and (old.ilosc_pozyczki != old.splata_pozyczki) then
   update pozyczki set data_splaty = (select current_date) WHERE splata_pozyczki = NEW.splata_pozyczki;
  return NEW;
 else
  return NULL;
 end if;
 
END;
' language 'plpgsql';[/code]

Aha Postgres przy 'kompilacji' zmienia typ zwracany przez tą funkcję z opaque na trigger co nie jest żadnym problemem;)

Zastanawiam się czy lepiej nie napisać funkcji do update'u, która przy okazji sprawdzałaby ten warunek spłaty i działaby zamiast tego triggera:)
POZDRAWIAM i jeszcze raz DZIĘKI!]]></description>
			<author><![CDATA[dummy@example.com (krzysko)]]></author>
			<pubDate>Tue, 16 Jun 2009 06:19:41 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=990#p990</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=989#p989</link>
			<description><![CDATA[Ok. Sprawdzę to i dam znać co z tego wyszło:)]]></description>
			<author><![CDATA[dummy@example.com (krzysko)]]></author>
			<pubDate>Mon, 15 Jun 2009 05:46:35 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=989#p989</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=978#p978</link>
			<description><![CDATA[Mógłbyś dodać do warunku w if'ie sprawdzenie czy
[code]
old.ilosc_pozyczki <> old.splata_pozyczki
[/code]
(tylko nie pamiętam czy operator 'różne od' to <> czy != :).)
To powinno zadziałać. Chyba że nie zrozumiałem do końca logiki działania tego triggera.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Thu, 11 Jun 2009 18:03:16 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=978#p978</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=977#p977</link>
			<description><![CDATA[Słuszna uwaga :) a czy masz jakis pomysł jak to rozwiązać?]]></description>
			<author><![CDATA[dummy@example.com (krzysko)]]></author>
			<pubDate>Thu, 11 Jun 2009 17:29:45 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=977#p977</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=976#p976</link>
			<description><![CDATA[Wydaje mi sie ze sie zapetla. Jak zrobisz update rowny ilosc_pozyczki to trigger robi znowu update, ktory znowu uruchamia trigger  a w nim warunek 
[code]
old.ilosc_pozyczki = new.splata_pozyczki
[/code]
jest spelniony i tak w kolko - petla.
Czy sie mylę?]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Thu, 11 Jun 2009 13:02:34 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=976#p976</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=974#p974</link>
			<description><![CDATA[Sorki, że nie napisałem, a więc tak:
- jeśli robię update mniejszy niż ilosc_pozyczki to jest ok wiersz jest updateowany
- jeśli robię update równy ilosc_pozyczki taki jak ten:
[code]
UPDATE pozyczki SET splata_pozyczki = 400 where id_pozyczki = 1;
[/code]
to zaczyna chwilowo mulić i wyrzuca sporo takich samych komunikatów jak ten:

[code]wyrażenie SQL "update pozyczki set data_splaty = (select current_date)"
PL/pgSQL function "splata_trigger" line 7 at SQL statement[/code]]]></description>
			<author><![CDATA[dummy@example.com (krzysko)]]></author>
			<pubDate>Thu, 11 Jun 2009 12:32:31 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=974#p974</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=965#p965</link>
			<description><![CDATA[Co znaczy nie działa? Jakiś komunikat błędu czy robi nie to co trzeba?]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Wed, 10 Jun 2009 13:29:18 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=965#p965</guid>
		</item>
		<item>
			<title><![CDATA[Trigger update'ujacy pole typu DATE]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=964#p964</link>
			<description><![CDATA[Witam wszystkich serdecznie.
W myśl: "Żadne pytanie nie jest zbyt proste dla tego działu." proszę o pomoc w poniższym problemie:
Chciałbym stworzyć wyzwalacz, który po spełnieniu pewnego warunku zaktualizuje wiersz wstawiając nową datę. 

Mam następująca tabelę POZYCZKI:
[code]
 Column                 |     Type         |                               Modifiers                              
-----------------------+----------------+---------------------------------------------------------------------
 id_pozyczki            | integer          | not null PRIMARY KEY
 id_kontrahent         | integer          | not null
 data_pozyczki        | date              | not null
 ilosc_pozyczki        | numeric(6,2)   | not null
 splata_pozyczki      | numeric(6,2)  | default 0
 kierunek_pozyczki  | character(1)   | 
 data_splaty             | date              | [/code]

wypełniam ją insertem:

[code]insert into pozyczki (id_kontrahent, data_pozyczki, ilosc_pozyczki, kierunek_pozyczki) values (1, 2009-06-10, 400, 1);[/code]

następnie robie update:
[code]update pozyczki set splata_pozczyki = 400 where id_pozyczki = 1;[/code]

Chciałbym, żeby po każdym update'cie było sprawdzanie czy pola ilosc_pozyczki i splata_pozyczki są równe i jeśli tak to automatycznie wypełnia się pole data_splaty aktualną datą.
poniżej wkleje moje "próby":

[code]-- trigger uruchamiajacy  funkcje...
create trigger trig_splata 
after update on kasa_pozyczki
for each row 
execute procedure splata_trigger();[/code]

[code]-- funkcja..
create function splata_trigger() returns opaque AS' 
declare
--  aktualna_data date:= current_date;
BEGIN 
 if(old.ilosc_pozyczki = new.splata_pozyczki ) then
  --  NEW.data_splaty = now();
   update kasa_pozyczki set data_splaty = (select current_date);-- WHERE splata_pozyczki = NEW.splata_pozyczki;
  return NEW;
 else
  return NULL;
 end if;
 
END;
' language 'plpgsql';[/code]

I niestety to nie działa :/ pl/pgsql dopiero zaczynam proszę o wyrozumiałość;)
Bardzo proszę o pomoc. Z góry dziękuję]]></description>
			<author><![CDATA[dummy@example.com (krzysko)]]></author>
			<pubDate>Wed, 10 Jun 2009 12:09:14 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=964#p964</guid>
		</item>
	</channel>
</rss>
