Subject: capture error logs
Posted By: jemacc Post Date: 1/10/2007 10:23:27 AM
Hi am having some difficulty trying to capture sql errors from a trigger to a log table. Please see code below and make any recommendation

USE [shippingprod]
GO
/****** Object:  Trigger [dbo].[tri_UPSShippingLog]    Script Date: 01/10/2007 10:14:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER  TRIGGER [dbo].[tri_UPSShippingLog] ON [dbo].[UPSShippingLog]
FOR INSERT
AS
--TO DO:
--        create a public note indicating shipment took place, or do we want an activity
--        Make Decision, when we have a voided entry...
--        CARRIER_PRIO_CD = NULL        -- I don't think there is a need fo this in the new design.  Suppose the package isn't GROUND and its ovenight and the shipment fails, it would default back to ground.
declare @LineItemList as varchar(2000)
declare @VoidIndicator as Char(1)
declare @ShippingMethod as varchar(30)
declare @TrackingNumber as varchar(50)
declare @ShipDate as varchar(50)
declare @sSQL As Nvarchar(2000)
declare @UPSShippingLogID as int
declare @err as int
declare @RowsAffected as int
select @LineItemList =  LineItemList,
     @VoidIndicator =INSERTED.VoidIndicator,
     @ShippingMethod =INSERTED.ShippingMethod,
    @TrackingNumber = INSERTED.TrackingNumber,
    @ShipDate = INSERTED.ShipDate,
    @UPSShippingLogID =  INSERTED.ID
FROM INSERTED
if dbo.uf_IsValidList(@LineItemList) =0
    BEGIN
        set @sSQL = 'The Line Item List is invalid'
        GOTO PROBLEM
    END
    
IF @VoidIndicator = 'Y'
    BEGIN
        -- Remove the tracking number and other info
        set @sSQL =
            'UPDATE siebprod.dbo.S_ORDER_ITEM ' +
            'SET    X_TRACKING_NUM = NULL, '+          -- Tracking Number
            '    MUST_DLVR_BY_DT = NULL, ' +    -- Ship Date
            '    DLVRY_STATUS_CD = ''Voided'''+    -- Shipping Status, 'Voided'    -- 'Invalid address' is a valid choice from select * from S_LST_OF_VAL WHERE TYPE = 'WIN_SHIPPING_STATUS';
            ' WHERE ROW_ID IN (' +@LineItemList + ')'
    END
Else
    BEGIN
        If @LineItemList is Null
            set @LineItemList = 'NULL'
        
        If not @ShippingMethod is NULL
            set @ShippingMethod = char(39) + @ShippingMethod + char(39)
        else
            set @ShippingMethod = 'NULL'
        
        If @TrackingNumber is not NULL
            set @TrackingNumber = char(39) + @TrackingNumber + char(39)
        else
            set @TrackingNumber = 'NULL'
        IF @ShipDate is not NULL
            set @ShipDate = char(39) + @ShipDate + char(39)
        else
            set @ShipDate = 'NULL'
    
    
        -- Update the LineItems table with the data retrieved from UPS WorldShip.
        set @sSQL =
            'UPDATE  siebprod.dbo.S_ORDER_ITEM' +
            '    SET     X_TRACKING_NUM = ' + @TrackingNumber + ',' +
            '    MUST_DLVR_BY_DT = CONVERT(datetime, '+@ShipDate+'),' +
            '    DLVRY_STATUS_CD = ' + Char(39) + 'Shipped' + Char(39) + ',' +
            '    CARRIER_PRIO_CD = ' + @ShippingMethod  +
            '  WHERE ROW_ID IN ('+@LineItemList+') '
    END
exec @err = sp_executesql @sSQL
set @err = @@ERROR
    IF (@err <> 0) GOTO PROBLEM
set @err = @@error
set @RowsAffected = @@rowCount
If @err <> 0
    INSERT INTO UPSShippingLogTriggerErrors(UPSShippingLogID, ErrorNumber, SQLStatement)
    VALUES(@UPSShippingLogID,  @err, @sSQL)
        
Else
    -- Only continue to try to close the line item if the first update was successful.
    BEGIN
        -- this statement will log the resulting action of the trigger
        INSERT INTO UPSShippingLogTriggerSQL(UPSShippingLogID, SQLStatement, RowsAffected)
        VALUES (@UPSShippingLogID, @sSQL, @RowsAffected)
        -- we will need to re-open the line items when the recognized amount has not yet been set
        -- This can't be accomplished in the SQL statement above because we will still need to perform updates
        -- to the tracking number field on the line item even if the status can't be re-opened.
--        When updating a line item with a tracking number set the STATUS_CD to 'Closed'
--        When updating a line item without a tracking number set the STATUS_CD to 'New'
--        Do not allow any trigger updates on the STATUS_CD from 'Closed' to 'New'
--             for line items that has a recognized amount that has been returned from solomon    X_REGOGNIZED_AMT        
        IF @VoidIndicator = 'Y'         
                -- re-open the line item
            set @sSQL =
                    'UPDATE siebprod.dbo.S_ORDER_ITEM ' +
                     'SET    STATUS_CD = ''New'' '+           
                    '  WHERE ROW_ID IN (' +@LineItemList + ')' +
                    '  AND isnull(X_RECOGNIZED_AMT,0) = 0 '
        Else        
                -- close the line item
            set @sSQL =
                    'UPDATE siebprod.dbo.S_ORDER_ITEM ' +
                    ' SET    STATUS_CD = ''Closed'' '+           
                    '  WHERE ROW_ID IN (' +@LineItemList + ')' +
                    '  AND isnull(X_RECOGNIZED_AMT,0) = 0 '
        
        exec @err = sp_executesql @sSQL
        set @err = @@error
        set @RowsAffected = @@rowCount        
        If @err <> 0
        
            GOTO PROBLEM
        Else        
            INSERT INTO UPSShippingLogTriggerSQL(UPSShippingLogID, SQLStatement, RowsAffected)
            VALUES (@UPSShippingLogID, @sSQL, @RowsAffected)
    
    END
        
RETURN
PROBLEM:
        INSERT INTO UPSShippingLogTriggerErrors(UPSShippingLogID, ErrorNumber, SQLStatement)
                    VALUES(@UPSShippingLogID,  @err, @sSQL)



Jaime E. Maccou
Reply By: Jeff Moden Reply Date: 1/10/2007 7:17:22 PM
The fundamental problem with your trigger is that it will only handle one row of change even if a thousand have changed.  You need to convert this to set based programming.

--Jeff Moden

Go to topic 54682

Return to index page 67
Return to index page 66
Return to index page 65
Return to index page 64
Return to index page 63
Return to index page 62
Return to index page 61
Return to index page 60
Return to index page 59
Return to index page 58