OLD.sum(...) ->record "old" has no field "sum"

Hallo,

ich habe folgende Frage:

Ist es möglich, bei Update eines Datensatzes (neuer Lagerbestand eines Artikels) zu prüfen, ob die Summe der Bestände einer Artikelgruppe (mehrere Artikel) 0 geworde ist?

Dazu bräuchte die Argumente:

OLD.sum(lagerbestand) <> NEW.sum(lagerbestand) and NEW.sum(lagerbestand) = 0

Ich bekomme dabei aber die Meldung: record “old” has no field “sum”

Kann ich das irgendwie umgehen?

Schon mal Danke für die Antwort!

Mster

Du kannst einen Trigger schreiben, der das prüft, ja.

Einfach eine Funktion, die das prüft, und als Trigger aufrufen. Was genau hast Du bisher versucht? OLD enthält den Record, der geupdatet wird, NEW die neuen Daten. Du willst aber offensichtlich über mehrere Zeilen (Artikelgruppe) eine Summe bilden, oder?


Andreas

ich hab ja schon einen trigger geschrieben. der sieht folgendermassen aus und wirft mir eben den fehler record “old” has no field “sum”:

DECLARE
t_artikel_gruppe_id int8;
t_artikel_gruppe_lagerbestand float8;
BEGIN
select artikel_gruppe_id, sum(artikel_lagerbestand) into t_artikel_gruppe_id, t_gruppe_artikel_lagerbestand
from artikel
where artikel_gruppe_id = 1
and OLD.sum(artikel_lagerbestand) <> NEW.sum(artikel_lagerbestand)
and NEW.sum(artikel_lagerbestand) = 0
group by artikel_gruppe_id;

IF t_artikel_gruppe_lagerbestand = 0 THEN
insert into …
Return NEW;
END IF;

Return NULL;

END;

Schnellschuß als Beispiel:

create or replace function _foo() returns trigger as $$
declare _menge int;
begin
        select into _menge sum(menge) from foo where artikel_gruppe = OLD.artikel_gruppe;
        if _menge = 0 then
                raise info '0 erreicht';
        end if;
        return NEW;
end;
$$ language plpgsql;

create trigger _foo_trigger after update on foo for each row execute procedure _foo();

Und die Anwendung:

test=# \i foo.sql
CREATE FUNCTION
CREATE TRIGGER
test=*# select * from foo;
 id | artikel_id | artikel_gruppe | menge
----+------------+----------------+-------
  1 |          1 |              1 |    10
  2 |          2 |              1 |     5
  3 |          3 |              2 |     5
(3 rows)

test=*# update foo set menge = menge -10 where id = 1;
UPDATE 1
test=*# update foo set menge = menge -5 where id = 2;
INFO:  0 erreicht
UPDATE 1
test=*#

Andreas

Du kannst IMHO nicht mit Aggregatfunktionen (wie sum()) innerhalb einer Rowvariablen arbeiten, das macht auch logisch gesehen nicht wirklich Sinn. Schreib es nach meinem Beispiel um, okay?


Andreas

Spitze! Habs hinbekommen. Danke für die schnelle Hilfe!

Gruß
Markus