Jak sumowac poprawnie?

0

Mam taki trigger ktory dziala ok przy dodawaniu elementow do koszyka, lecz jest problem gdy usuwam lub update'uje zmniejszajac kwote, czy da się jakoś to przerobić, żeby działalo pod dodanie,delete,edytowanie?

CREATE FUNCTION sum_total() RETURNS TRIGGER
AS $$
BEGIN
    UPDATE payment
    SET price = price + (SELECT SUM(price) from basket WHERE service_id = new.service_id)
    WHERE service_id = new.service_id;
    RETURN NULL;
END; $$ LANGUAGE plpgsql;

1

za każym razem sumuj całość koszyka a nie dodawaj do sumy

0

@Miang próbowalem bez price +, no i przy delete suma się w ogóle nie zmienia

0

liczyłeś before delete czy after?

0

@Miang after

1

ale w przypadku delete to chyba ta funkcja wygląda inaczej? old zamiast new i tak dalej?

0

@Miang: wlasnie dlatego rozkminiam czy da się takie cos ogarnac w jednym triggerze, zamiast wszystko pisac osobno

1

IF (TG_OP = 'DELETE') THEN

0

@Miang A co z tym moze byc nie tak? Rzuca mi "ERROR: record "new" has no field "basket_id", ale gdy manualnie odpalam query tylko ze zamiast new.basket_id to wrzucam id basket'a to zwraca normalnie cene. Tylko w triggerze mi nie chce zadzialac a uzywam go na AFTER INSERT OR DELETE OR UPDATE ON

    IF (TG_OP = 'INSERT') THEN
        UPDATE payment
        SET price =  (SELECT SUM(price) from (
                                                select price from basket
                                                union all
                                                select price from basket2
                                                where basket_id = new.basket_id
                                            ) as d)
        WHERE basket_id = new.basket_id;
2
	IF TG_OP IN ('DELETE', 'UPDATE') THEN
		stare := OLD.price;
	END IF;
	
	IF TG_OP IN ('INSERT', 'UPDATE') THEN
		nowe := NEW.price;
	END IF;

	UPDATE payment SET price = price + nowe - stare WHERE basket_id = new.basket_id;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.