MSSQL2016 Триггер UPDATE для вставки записи в другую таблицу на основе суммы битового столбца - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь автоматизировать нашу систему обновления статуса заказа. Вот поток, который у нас есть:

  1. ордера поступают в нашу систему как один ордер (через файл FTP) и разделяются на 2 или более ордеров (вставляются в SplitOrdersHeader_tb)
  2. результирующие множественные заказы отправляются из таблиц SplitOrders (заголовок и подробности) в систему ERP
  3. Система ERP выдает подтверждения заказов для каждого заказа (вставляется в OrderConfirmationHeader_tb и таблицу подробностей)
  4. необходимо обновление оригинал статус одного заказа после всех полученных подтверждений разделения заказа

Вот таблицы:

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

1 Ответ

0 голосов
/ 02 марта 2020

Я думаю, что у меня что-то есть, но хотелось бы получить дополнительный отзыв, пожалуйста:

CREATE TRIGGER OrderSplitting.UPDATE_Update_WCO_Status_tg
    ON OrderSplitting.SplitOrdersHeader_tb
    AFTER UPDATE AS

    SET NOCOUNT ON

    BEGIN TRY
        INSERT INTO OrderSplitting.UpdateOtherSystem_tb(OriginalCustomerPONumber)
            SELECT SOH.OriginalCustomerPONumber
            FROM OrderSplitting.SplitOrdersHeader_tb SOH
                INNER JOIN inserted I ON SOH.OriginalCustomerPONumber = I.OriginalCustomerPONumber
                LEFT OUTER JOIN OrderSplitting.UpdateOtherSystem_tb UOS ON SOH.OriginalCustomerPONumber = UOS.OriginalCustomerPONumber
            WHERE UOS.OriginalCustomerPONumber IS NULL
            GROUP BY SOH.OriginalCustomerPONumber
            HAVING COUNT(SOH.OriginalCustomerPONumber) = SUM(CAST(SOH.OrderConfirmationReceived as int))
    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
...