| | 1 | = Напреден развој на база = |
| | 2 | |
| | 3 | == 1.Тригери и Функции == |
| | 4 | |
| | 5 | === 1.1 Автоматско пресметување на вкупниот износ на продажба (trg_recalculate_sale_total) === |
| | 6 | |
| | 7 | Цел: Автоматски ја ажурира вкупната сума на продажбата секогаш кога се додаваат, менуваат или бришат ставки, со што се обезбедува точна пресметка во базата на податоци. |
| | 8 | |
| | 9 | {{{#!sql |
| | 10 | CREATE OR REPLACE FUNCTION trg_fn_recalculate_sale_total() |
| | 11 | RETURNS TRIGGER |
| | 12 | LANGUAGE plpgsql |
| | 13 | AS $$ |
| | 14 | DECLARE |
| | 15 | v_sale_id INT; |
| | 16 | BEGIN |
| | 17 | IF TG_OP = 'DELETE' THEN |
| | 18 | v_sale_id := OLD.sale_id; |
| | 19 | ELSE |
| | 20 | v_sale_id := NEW.sale_id; |
| | 21 | END IF; |
| | 22 | |
| | 23 | UPDATE sale |
| | 24 | SET total_amount = ( |
| | 25 | SELECT COALESCE(SUM(quantity * unit_price_at_sale), 0) |
| | 26 | FROM sale_item |
| | 27 | WHERE sale_id = v_sale_id |
| | 28 | ) |
| | 29 | WHERE sale_id = v_sale_id; |
| | 30 | |
| | 31 | RETURN NULL; |
| | 32 | END; |
| | 33 | $$; |
| | 34 | |
| | 35 | CREATE TRIGGER trg_recalculate_sale_total |
| | 36 | AFTER INSERT OR UPDATE OR DELETE ON sale_item |
| | 37 | FOR EACH ROW |
| | 38 | EXECUTE FUNCTION trg_fn_recalculate_sale_total(); |
| | 39 | }}} |
| | 40 | |
| | 41 | === 1.2 Спречување на паѓање на залихата во негативна вредност (trg_prevent_negative_stock) === |
| | 42 | |
| | 43 | Што прави: Спречува која било операција да ја намали количината на залиха под нула, со што се обезбедува дека залихата никогаш нема да биде негативна. |
| | 44 | |
| | 45 | {{{#!sql |
| | 46 | CREATE OR REPLACE FUNCTION trg_fn_prevent_negative_stock() |
| | 47 | RETURNS TRIGGER |
| | 48 | LANGUAGE plpgsql |
| | 49 | AS $$ |
| | 50 | BEGIN |
| | 51 | IF NEW.quantity_on_hand < 0 THEN |
| | 52 | RAISE EXCEPTION |
| | 53 | 'Stock cannot be negative! Warehouse: %, Product: %, Quantity: %', |
| | 54 | NEW.warehouse_id, NEW.product_id, NEW.quantity_on_hand; |
| | 55 | END IF; |
| | 56 | RETURN NEW; |
| | 57 | END; |
| | 58 | $$; |
| | 59 | |
| | 60 | CREATE TRIGGER trg_prevent_negative_stock |
| | 61 | BEFORE INSERT OR UPDATE ON warehouse_stock |
| | 62 | FOR EACH ROW |
| | 63 | EXECUTE FUNCTION trg_fn_prevent_negative_stock(); |
| | 64 | }}} |
| | 65 | |
| | 66 | == 2.Тригери и Функции == |