Ошибка 1054 с триггером после обновления таблицы в MySQL - PullRequest
0 голосов
/ 15 января 2019

У меня есть 3 таблицы:

master_parts_list

id int(11) not null auto increment
part_number varchar(30) unique
description varchar(255)
price decimal(10,2)
weight decimal(10,2)
active tinyint(1)
quantity_on_hand decimal(10,2)
quantity_allocated decimal(10,2)
quantity_on_order decimal(10,2)
old_part_number varchar(30)

sales_orders

id int(11) not null primary key auto increment
quote_number int(11) unique
order_number int(11) unique
invoice_number int(11) unique
status varchar(255)
customer_number int(11)
customer_po_number char(30)
...and 15 others...

sales_order_parts

id int(11) not null primary key auto increment
order_id int(11)
part_id int(5)
order_quantity int(5)
ship_quantity int(5)
unit_price decimal(10,2)
note varchar(255)

Я хотел обновить поля quantity_on_hand quantity_allocated количество_заказ

Что я хочу, чтобы результат был: Когда запись добавляется в таблицу sales_order_parts, (создавая новую позицию для заказа на продажу) добавьте order_quantity в поле amount_allocated в master_part_list. Когда запись изменена или удалена для sales_order_parts для order_quantity, обновите поле amount_allocated. Когда запись представляет собой накладные, как указано значением в поле invoice_number, вычитайте ship_quantity из amount_on_hand. Основы управления запасами.

Мне написали триггер для вставки на sales_order_parts создать триггер alloc_addition_insert

create trigger allocated_addition_insert
after insert on sales_order_parts
for each row
update master_part_list
set master_part_list.quantity_allocated=
    (select sum(order_quantity)
from
    sales_orders
        inner join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
where sales_orders.invoice_number is null and sales_order_parts.part_id = master_part_list.id
group by part_id)

Это работает, после каждой новой записи, код запускается и обновляет кол-во кол-во количественных элементов по количеству по нулевому счету invoice_number (то есть еще не выставлен счет).

Я работаю над триггером UPDATE для sales_orders

delimiter $$
create trigger allocated_order_on_hand_update
after update on sales_orders
for each row begin
    update master_part_list
    set master_part_list.quantity_on_hand=master_part_list.quantity_on_hand-(select sum(ship_quantity)
    from
    sales_orders
        join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
    where sales_orders.invoice_number = new.sales_orders.invoice_number
    and sales_orders.invoice_number is not null
    group by part_id);

    update master_part_list
    set master_part_list.quantity_allocated=(select sum(order_quantity)
    from
    sales_orders
        inner join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
    where sales_orders.invoice_number is null and sales_order_parts.part_id = master_part_list.id
    group by part_id);
end$$

Второе обновление запускается, когда invoice_number имеет значение NULL, но при попытке обновить и сохранить счет-фактуру, который устанавливает номер счета-фактуры в поле invoice_number, он не работает, если invoice_number не равен NULL. Как правило, когда заказ получает счет-фактуру, вычтите сумму ship_quantity из amount_on_hand в master_part_list, но только части для этого конкретного заказа на продажу. Я получаю ошибку:

# 1054 - 'Неизвестный столбец' new.sales_orders.invoice_number 'в' предложении where "

Есть идеи?

1 Ответ

0 голосов
/ 17 января 2019

После некоторой работы я разобрался.
Вот код для триггера для вставки на sales_order_parts. Он суммирует значение всех полей открытых ордеров order_quantity, сгруппированных по частям, и устанавливает значение в поле amount_allocated в master_parts_list. Он оставляет все котировки и уже выставленные счета заказы.

create trigger allocated_addition_insert
after insert on sales_order_parts
for each row
update master_part_list
set master_part_list.quantity_allocated=
    (select sum(order_quantity)
from
    sales_orders
        inner join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
where sales_orders.invoice_number is null 
and sales_order_parts.part_id = master_part_list.id 
and sales_orders.status <> "Quote" 
group by part_id);

Это обновление значения измененного количества в sales_order_parts Вот код для триггера до обновления на sales_order_parts.

create trigger allocated_minus_update
before update on sales_order_parts
for each row
    update master_part_list set master_part_list.quantity_allocated = master_part_list.quantity_allocated - old.order_quantity
    where master_part_list.id = old.part_id;

Вот код для триггера после обновления на sales_order_parts.

create trigger allocated_add_update
after update on sales_order_parts
for each row
    update master_part_list set master_part_list.quantity_allocated = master_part_list.quantity_allocated + new.order_quantity
    where master_part_list.id = new.part_id;

Вот код для обновления на sales_orders.

delimiter $$
create trigger allocated_order_on_hand_update
after update on sales_orders
for each row begin
    update master_part_list
    set master_part_list.quantity_on_hand = master_part_list.quantity_on_hand -
    coalesce((select sum(ship_quantity)
    from
    sales_order_parts
            inner join
    sales_orders on sales_orders.id = sales_order_parts.order_id
    where sales_orders.invoice_number = new.invoice_number
    and sales_order_parts.part_id = master_part_list.id
    and new.invoice_number > 0
    group by sales_order_parts.part_id),0);

    update master_part_list
    set master_part_list.quantity_allocated=
    (select sum(order_quantity)
    from
    sales_orders
        inner join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
    where sales_orders.invoice_number is null 
    and sales_order_parts.part_id = master_part_list.id 
    and sales_orders.status <> "Quote" 
    group by part_id);
end$$
delimiter ;

Эти триггерные скрипты хорошо работают для меня, но любые предложения или комментарии приветствуются. Спасибо.

...