Skip to end of metadata
Go to start of metadata

WARNING!!! USE AT OWN RISK!!! DANGEROUS PROC!!



CREATE PROCEDURE dbo._as_DeleteByAuditNumber
    @cAuditNumber NVARCHAR(100)
AS
BEGIN
    SET NOCOUNT, XACT_ABORT ON;

    --------------------------------------------------
    -- 1) Ensure log table exists
    IF OBJECT_ID('dbo._as_DeleteLog','U') IS NULL
    BEGIN
        CREATE TABLE dbo._as_DeleteLog
        (
            LogID          INT IDENTITY PRIMARY KEY,
            cAuditNumber   NVARCHAR(100)    NOT NULL,
            PostGL         NVARCHAR(MAX)    NULL,
            PostAR         NVARCHAR(MAX)    NULL,
            PostAP         NVARCHAR(MAX)    NULL,
            ErrorOccurred  BIT              NOT NULL DEFAULT(0),
            ErrorMessage   NVARCHAR(MAX)    NULL,
            CreatedDate    DATETIME         NOT NULL DEFAULT(GETDATE())
        );
    END

    --------------------------------------------------
    -- 2) Start transaction
    BEGIN TRAN;
    BEGIN TRY

        --------------------------------------------------
        -- 3) Blocking checks
        IF EXISTS (
            SELECT 1
            FROM dbo.PostAR
            WHERE cAuditNumber = @cAuditNumber
              AND InvNumKey > 0
        )
            THROW 50001, 'Cannot delete: matching PostAR records have InvNumKey > 0.', 1;

        IF EXISTS (
            SELECT 1
            FROM dbo.PostAP
            WHERE cAuditNumber = @cAuditNumber
              AND InvNumKey > 0
        )
            THROW 50002, 'Cannot delete: matching PostAP records have InvNumKey > 0.', 1;

        IF EXISTS (
            SELECT 1
            FROM dbo.PostST
            WHERE cAuditNumber = @cAuditNumber
        )
            THROW 50003, 'Cannot delete: audit number exists in PostST.', 1;

        --------------------------------------------------
        -- 4) Capture JSON of to-be-deleted rows
        DECLARE
            @jsonGL NVARCHAR(MAX),
            @jsonAR NVARCHAR(MAX),
            @jsonAP NVARCHAR(MAX);

        SELECT @jsonGL = (
            SELECT *
            FROM dbo.PostGL
            WHERE cAuditNumber = @cAuditNumber
            FOR JSON AUTO, INCLUDE_NULL_VALUES
        );

        SELECT @jsonAR = (
            SELECT *
            FROM dbo.PostAR
            WHERE cAuditNumber = @cAuditNumber
            FOR JSON AUTO, INCLUDE_NULL_VALUES
        );

        SELECT @jsonAP = (
            SELECT *
            FROM dbo.PostAP
            WHERE cAuditNumber = @cAuditNumber
            FOR JSON AUTO, INCLUDE_NULL_VALUES
        );

        --------------------------------------------------
        -- 5) Perform deletes
        DELETE FROM dbo.PostGL
         WHERE cAuditNumber = @cAuditNumber;

        DELETE FROM dbo.PostAR
         WHERE cAuditNumber = @cAuditNumber;

        DELETE FROM dbo.PostAP
         WHERE cAuditNumber = @cAuditNumber;

        --------------------------------------------------
        -- 6) Log successful deletion
        INSERT INTO dbo._as_DeleteLog
            (cAuditNumber, PostGL, PostAR, PostAP, ErrorOccurred)
        VALUES
            (@cAuditNumber, @jsonGL, @jsonAR, @jsonAP, 0);

        COMMIT TRAN;
    END TRY
    BEGIN CATCH
        --------------------------------------------------
        -- 7) Rollback and log error
        IF XACT_STATE() <> 0
            ROLLBACK TRAN;

        DECLARE
            @ErrMsg NVARCHAR(MAX) = ERROR_MESSAGE();

        INSERT INTO dbo._as_DeleteLog
            (cAuditNumber, ErrorOccurred, ErrorMessage)
        VALUES
            (@cAuditNumber, 1, @ErrMsg);

        -- Re-raise so caller sees the error
        THROW;
    END CATCH
END
GO


  • No labels