Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггерная функция PostgreSQL / 12 сообщений из 12, страница 1 из 1
10.04.2021, 21:58
    #40061388
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
Здравствуйте!

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


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();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[
...
Рейтинг: 0 / 0
10.04.2021, 21:58
    #40061389
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
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();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[
...
Рейтинг: 0 / 0
10.04.2021, 21:59
    #40061390
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
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();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[
...
Рейтинг: 0 / 0
10.04.2021, 21:59
    #40061391
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
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();


Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется.
Таблицы картинками прикрепил. Помогите пож-ста.[
...
Рейтинг: 0 / 0
11.04.2021, 10:35
    #40061426
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
AlexSereb,

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

Похожий пример можете посмотреть вот здесь . В самом конце есть два задания и ответы к ним. Второе задание про автоматическое вычисление суммы заказа очень похоже на то, что вам нужно. В решении используются переходные таблицы, поэтому требуется PostgreSQL 10 или выше.
...
Рейтинг: 0 / 0
11.04.2021, 21:22
    #40061505
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет
...
Рейтинг: 0 / 0
11.04.2021, 21:35
    #40061508
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
AlexSereb
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет
...
Рейтинг: 0 / 0
11.04.2021, 23:41
    #40061529
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
AlexSereb,

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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
12.04.2021, 10:11
    #40061602
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
AlexSereb
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет

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

И согласен с Максимом, по картинкам сложно что-то конкретное рекомендовать. Полноценный пример в psql существенно упростил бы помощь.
...
Рейтинг: 0 / 0
12.04.2021, 12:19
    #40061665
AlexSereb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
Павел Лузанов
AlexSereb
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет

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

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


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN

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

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

END IF;

RETURN NEW;
END;



Ограничение стоит в WHERE через код_сырья и код_продукции
...
Рейтинг: 0 / 0
12.04.2021, 16:02
    #40061757
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
AlexSereb,

Исходя из предоставленной информации:
1. Попробуйте в триггере вместо UPDATE выполнить RAISE NOTICE '%', NEW; и посмотреть работает ли триггер вообще. Есть подозрение что ваш UPDATE не срабатывает.
2. Попробуйте выполнить текущий вариант UPDATE без триггера, напрямую в psql или pgadmin. Замените NEW."План_выпуска" на число, которое добавляете, и посмотрите что получается. Это то, что нужно? Если нет, добейтесь от UPDATE нужного поведения.
3. Замените RAISE NOTICE на правильно работающий UPDATE.
...
Рейтинг: 0 / 0
12.04.2021, 20:47
    #40061831
kira ivanov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггерная функция PostgreSQL
AlexSereb,

внимательно про NEW, OLD почитайте - https://www.postgresql.org/docs/12/plpgsql-trigger.html
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггерная функция PostgreSQL / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]