Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
Здравствуйте!

Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство.


PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции:

CREATE OR REPLACE FUNCTION my_function_resursi()
RETURNS TRIGGER
AS $$
BEGIN

IF NEW."План_выпуска" IS NOT NULL

THEN UPDATE "Сырьё"
SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции")
FROM "Сырьё", "Производство", "Потери", "Продукция"
WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья"
AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции";

END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;[/SQL]


код триггера:

CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство"
FOR EACH ROW EXECUTE PROCEDURE my_function_resursi();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[

К сообщению приложен файл. Размер - 13Kb
10 апр 21, 21:58    [22307089]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
AlexSereb
Здравствуйте!

Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство.


PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции:

CREATE OR REPLACE FUNCTION my_function_resursi()
RETURNS TRIGGER
AS $$
BEGIN

IF NEW."План_выпуска" IS NOT NULL

THEN UPDATE "Сырьё"
SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции")
FROM "Сырьё", "Производство", "Потери", "Продукция"
WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья"
AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции";

END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;[/SQL]


код триггера:

CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство"
FOR EACH ROW EXECUTE PROCEDURE my_function_resursi();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[


К сообщению приложен файл. Размер - 10Kb
10 апр 21, 21:58    [22307090]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
AlexSereb
Здравствуйте!

Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство.


PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции:

CREATE OR REPLACE FUNCTION my_function_resursi()
RETURNS TRIGGER
AS $$
BEGIN

IF NEW."План_выпуска" IS NOT NULL

THEN UPDATE "Сырьё"
SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции")
FROM "Сырьё", "Производство", "Потери", "Продукция"
WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья"
AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции";

END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;[/SQL]


код триггера:

CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство"
FOR EACH ROW EXECUTE PROCEDURE my_function_resursi();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[


К сообщению приложен файл. Размер - 16Kb
10 апр 21, 21:59    [22307093]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
AlexSereb
Здравствуйте!

Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство.


PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции:

CREATE OR REPLACE FUNCTION my_function_resursi()
RETURNS TRIGGER
AS $$
BEGIN

IF NEW."План_выпуска" IS NOT NULL

THEN UPDATE "Сырьё"
SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции")
FROM "Сырьё", "Производство", "Потери", "Продукция"
WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья"
AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции";

END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;[/SQL]


код триггера:

CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство"
FOR EACH ROW EXECUTE PROCEDURE my_function_resursi();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[


К сообщению приложен файл. Размер - 9Kb
10 апр 21, 21:59    [22307094]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 803
AlexSereb,

Не вижу в команде UPDATE ссылок на NEW. А ведь весь смысл триггера сделать обновление на основании значений из записи NEW.

Похожий пример можете посмотреть вот здесь. В самом конце есть два задания и ответы к ним. Второе задание про автоматическое вычисление суммы заказа очень похоже на то, что вам нужно. В решении используются переходные таблицы, поэтому требуется PostgreSQL 10 или выше.
11 апр 21, 10:35    [22307190]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет

Сообщение было отредактировано: 11 апр 21, 21:24
11 апр 21, 21:22    [22307311]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
AlexSereb
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет


К сообщению приложен файл. Размер - 67Kb
11 апр 21, 21:35    [22307315]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
AlexSereb,

Молодой человек... а вы умеет не картинки постить все таки а код который можно скопировать/отредактировать и показать исправленный?
Уважайте тех кто вам пытается помочь.

Начали же правильно почти с кода (хотя итог тоже стоило текстом запостить).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
11 апр 21, 23:41    [22307354]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 803
AlexSereb
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет

Не только в SET. Если что-то добавили в Производство, это же не значит, что нужно в Сырье поменять всё. Нужно поменять только то Сырье, которое относится к новой строке в Производстве. А на картинке я не вижу ограничений на Сырье.

И согласен с Максимом, по картинкам сложно что-то конкретное рекомендовать. Полноценный пример в psql существенно упростил бы помощь.
12 апр 21, 10:11    [22307471]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
AlexSereb
Member

Откуда:
Сообщений: 7
Павел Лузанов
AlexSereb
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет

Не только в SET. Если что-то добавили в Производство, это же не значит, что нужно в Сырье поменять всё. Нужно поменять только то Сырье, которое относится к новой строке в Производстве. А на картинке я не вижу ограничений на Сырье.

И согласен с Максимом, по картинкам сложно что-то конкретное рекомендовать. Полноценный пример в psql существенно упростил бы помощь.


BEGIN

IF NEW."План_выпуска" IS NOT NULL

THEN UPDATE "Сырьё" 
SET "Запас_сырья" = "Запас_сырья" - (NEW."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции")
FROM "Производство", "Потери", "Продукция"
WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья" 
AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции";

END IF;

RETURN NEW;
END;


Ограничение стоит в WHERE через код_сырья и код_продукции
12 апр 21, 12:19    [22307571]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 803
AlexSereb,

Исходя из предоставленной информации:
1. Попробуйте в триггере вместо UPDATE выполнить RAISE NOTICE '%', NEW; и посмотреть работает ли триггер вообще. Есть подозрение что ваш UPDATE не срабатывает.
2. Попробуйте выполнить текущий вариант UPDATE без триггера, напрямую в psql или pgadmin. Замените NEW."План_выпуска" на число, которое добавляете, и посмотрите что получается. Это то, что нужно? Если нет, добейтесь от UPDATE нужного поведения.
3. Замените RAISE NOTICE на правильно работающий UPDATE.
12 апр 21, 16:02    [22307719]     Ответить | Цитировать Сообщить модератору
 Re: Триггерная функция PostgreSQL  [new]
kira ivanov
Member

Откуда: питер
Сообщений: 166
AlexSereb,

внимательно про NEW, OLD почитайте - https://www.postgresql.org/docs/12/plpgsql-trigger.html
12 апр 21, 20:47    [22307844]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить