Я пытаюсь автоматизировать нашу систему обновления статуса заказа. Вот поток, который у нас есть:
- ордера поступают в нашу систему как один ордер (через файл FTP) и разделяются на 2 или более ордеров (вставляются в SplitOrdersHeader_tb)
- результирующие множественные заказы отправляются из таблиц SplitOrders (заголовок и подробности) в систему ERP
- Система ERP выдает подтверждения заказов для каждого заказа (вставляется в OrderConfirmationHeader_tb и таблицу подробностей)
- необходимо обновление оригинал статус одного заказа после всех полученных подтверждений разделения заказа
Вот таблицы:
CREATE TABLE SplitOrdersHeader_tb(
OriginalCustomerPONumber varchar(20),
NewCustomerPONumber varchar(20),
Company varchar(2),
CustomerNumber varchar(10),
OrderProcessed bit DEFAULT 0,
OrderMoved bit DEFAULT 0,
OrderConfirmationReceived bit DEFAULT 0
)
CREATE TABLE OrderConfirmationHeader_tb(
MasterOrderNumber varchar(20),
CustomerPONumber varchar(20),
Company varchar(2),
CustomerNumber varchar(10)
)
CREATE TABLE UpdateOtherSystem_tb(
OriginalCustomerPONumber varchar(20)
)
I У меня есть триггер на OrderConfirmationHeader_tb, который обновляет статус каждого заказа на разделение после загрузки подтверждений заказа:
CREATE TRIGGER dbo.INSERT_Update_SplitOrderConfirmations_tg
ON dbo.OrderConfirmationHeader_tb
AFTER INSERT
AS
SET NOCOUNT ON
BEGIN
UPDATE SOH
SET SOH.OrderConfirmationReceived = 1,
SOH.MasterOrderNumber = LTRIM(RTRIM(I.MasterOrderNumber))
FROM OrderSplitting.SplitOrdersHeader_tb SOH
INNER JOIN inserted I ON SOH.CustomerNumber = I.Customer
AND SOH.NewCustomerPONumber = I.Reference
AND SOH.Company = I.Company
AND SOH.OrderProcessed = 1
AND SOH.OrderMoved = 1
END
Я хочу создать триггер UPDATE на SplitOrdersHeader_tb, который будет: - подсчитать количество разделенных заказов из исходного CustomerPONumber - суммировать количество значений OrderConfirmationReceived - если COUNT = SUM, тогда вставьте новую запись в UpdateOtherSystem_tb, при условии, что MasterOrderNumber еще не существует в UpdateOtherSystem_tb
У меня есть, но это кажется слишком неуклюжим:
CREATE TRIGGER OrderSplitting.UPDATE_Update_WCO_Status_tg
ON OrderSplitting.SplitOrdersHeader_tb
AFTER UPDATE AS
SET NOCOUNT ON
BEGIN
DECLARE @NEW_CUSTOMER_PO_NUMBER varchar(255),
@ORIGINAL_CUSTOMER_PO_NUMBER varchar(255),
@COUNT_OF_ORDER_HEADERS int,
@TOTAL_CONFIRMED_ORDERS int
SELECT @NEW_CUSTOMER_PO_NUMBER = NewCustomerPONumber
FROM inserted
SELECT @ORIGINAL_CUSTOMER_PO_NUMBER = OriginalCustomerPONumber,
@COUNT_OF_ORDER_HEADERS = COUNT(*),
@TOTAL_CONFIRMED_ORDERS = SUM(CAST(OrderConfirmationReceived as int))
FROM OrderSplitting.SplitOrdersHeader_tb
WHERE OriginalCustomerPONumber IN (SELECT OriginalCustomerPONumber
FROM OrderSplitting.SplitOrdersHeader_tb
WHERE NewCustomerPONumber = @NEW_CUSTOMER_PO_NUMBER)
GROUP BY OriginalCustomerPONumber
IF @COUNT_OF_ORDER_HEADERS = @TOTAL_CONFIRMED_ORDERS
BEGIN
BEGIN TRY
INSERT INTO OrderSplitting.UpdateOtherSystem_tb(OriginalCustomerPONumber)
VALUES(@ORIGINAL_CUSTOMER_PO_NUMBER)
END TRY
BEGIN CATCH
DECLARE @ERROR_MESSAGE varchar(MAX)
SET @ERROR_MESSAGE = ERROR_MESSAGE()
EXEC msdb..sp_send_dbmail
@recipients = <app_support>,
@subject = 'Update Trigger Error',
@body = @ERROR_MESSAGE
END CATCH
END
END