После некоторой работы я понял это.
Вот код для триггера для вставки на 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 ;
Эти триггерные скрипты хорошо работают для меня, но любые предложения или комментарии приветствуются. Благодаря.
Можно сгруппироваться этим:
cast(floor(cast(AutoShipItems.NextOrderDate as float)) as datetime)
Я поместил это в скалярную пользовательскую функцию для помощи:
create function [dbo].[xfn_TrimTimeFromDateTime]
(
@date as datetime
)
returns datetime with schemabinding as
begin
--- Convert to a float, and get the integer that represents it.
--- And then convert back to datetime.
return cast(floor(cast(@date as float)) as datetime)
end
Который Вы затем назвали бы как это:
GROUP BY
AutoShipItems.CustomerID,
dbo.xfn_TrimTimeFromDateTime(AutoShipItems.NextOrderDate),
Customer.FirstName, Customer.LastName, Customer.EmailAddress
Обратите внимание, что Вам, возможно, придется изменить значения в ИЗБРАННОМ пункте, так как Вы группируетесь чем-то другим теперь.
См. эту ссылку для трех различных версий функции только для даты. Вот тот, который я закончил тем, что использовал:
CREATE FUNCTION [dbo].[fn_GetDateOnly] ( @pInputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
END
Что относительно этого:
select convert(datetime, convert(varchar(10), getdate(), 112))
Если это все примерно группируется, можно преобразовать выражение даты и времени в интервал также.
Простой CAST(datetime AS int)
на самом деле округляет дату и время на ближайшую дату, а не отбрасывает часть времени. Отсюда,
CAST(datetime - 0.5 AS int)
Иначе:
CAST(CAST(datetime AS float) AS int)
(В отличие от datetimes, плавания являются усеченными, когда брошено к интервалу),
Я предпочитаю первого, поскольку это короче. Не уверенный, который лучше с точки зрения производительности, все же. Однако, проблема может, вероятно, только возникнуть на действительно больших массивах данных.
Можно также просто использовать простой SQL, преобразовывают функцию. Последний аргумент позволяет Вам обеспечить pre-deifined форматы даты, некоторые из которых удаляют время. Вот пересмотренный запрос.
SELECT AutoShipItems.CustomerID, convert(nvarchar(10), AutoShipItems.NextOrderDate, 110) as NextOrderDate ,Customer.FirstName,Customer.LastName,
Customer.EmailAddress
FROM AutoShipItems INNER JOIN
Customer ON AutoShipItems.CustomerID =Customer.CustomerID
WHERE (AutoShipItems.NextOrderDate <= GETDATE())
GROUP BY AutoShipItems.CustomerID, convert(nvarchar(10), AutoShipItems.NextOrderDate, 110) , Customer.FirstName, Customer.LastName,
Customer.EmailAddress
ORDER BY AutoShipItems.NextOrderDate