taSopLineDelete

USE [NGB01];
GO
/****** Object:  StoredProcedure [dbo].[taSopLineDelete]    Script Date: 6/12/2025 11:28:36 AM ******/
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [dbo].[taSopLineDelete]
    @I_vSOPTYPE SMALLINT,
    @I_vSOPNUMBE CHAR(21),
    @I_vLNITMSEQ INT = 0,
    @I_vITEMNMBR CHAR(30),
    @I_vRequesterTrx SMALLINT = 0,
    @I_vRecreateDist SMALLINT = 0,
    @I_vCMPNTSEQ INT = 0,
    @I_vDeleteType SMALLINT,
    @I_vUSRDEFND1 CHAR(50) = '',
    @I_vUSRDEFND2 CHAR(50) = '',
    @I_vUSRDEFND3 CHAR(50) = '',
    @I_vUSRDEFND4 VARCHAR(8000) = '',
    @I_vUSRDEFND5 VARCHAR(8000) = '',
    @O_iErrorState INT OUTPUT,
    @oErrString VARCHAR(255) OUTPUT
AS
SET DEADLOCK_PRIORITY LOW;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @CUSTNMBR CHAR(15),
        @iStatus INT,
        @DOCDATE DATETIME,
        @BACHNUMB CHAR(15),
        @ITMTRKOP SMALLINT,
        @iError INT,
        @O_oErrorState INT,
        @iUpdtBthErrState INT,
        @iUpdDistErrState INT,
        @iCreateBatchErrString VARCHAR(255),
        @SOPHdrTbl CHAR(18),
        @DexRowID INT,
        @oExists INT,
        @CURRNIDX INT,
        @ORTDISAM NUMERIC(19, 5),
        @DISTKNAM NUMERIC(19, 5),
        @PYMTRCVD NUMERIC(19, 5),
        @FRTAMNT NUMERIC(19, 5),
        @MISCAMNT NUMERIC(19, 5),
        @TAXAMNT NUMERIC(19, 5),
        @LineCount INT,
        @ITEMTYPE SMALLINT,
        @ACCTAMNT NUMERIC(19, 5),
        @DISAVAMT NUMERIC(19, 5),
        @ORNCMAMT NUMERIC(19, 5),
        @OXTNDPRC NUMERIC(19, 5),
        @ORSUBTOT NUMERIC(19, 5),
        @ORMSCTAX NUMERIC(19, 5),
        @OREXTCST NUMERIC(19, 5),
        @OInsStatus INT,
        @iCustomState INT,
        @iCustomErrString VARCHAR(255),
        @FUNLCURR CHAR(15),
        @CURNCYID CHAR(15),
        @mylock TINYINT,
        @DexLockErrorState INT,
        @TOTALTAX NUMERIC(19, 5),
        @taSopLineDeletePostErrState INT,
        @taSopLineDeletePostErrString CHAR(255),
        @taSopHdrRecalcErrState INT,
        @taSopHdrRecalcErrString CHAR(255),
        @QTYPRBAC NUMERIC(19, 5),
        @QTYPRBOO NUMERIC(19, 5),
        @QTYPRINV NUMERIC(19, 5),
        @QTYPRORD NUMERIC(19, 5),
        @ISMCTRX INTEGER,
        @CALCKITC TINYINT,
        @KITITEM CHAR(30),
        @KITPRCLEVEL CHAR(11),
        @KITPRICMTHD TINYINT,
        @KITUOMPRICE NUMERIC(19, 5),
        @KITUOFM CHAR(9),
        @KITQUANTITY NUMERIC(19, 5),
        @DOCAMTNEG NUMERIC(19, 5),
        @ENABLEMULTIBIN SMALLINT,
        @SEROVQTY NUMERIC(19, 5),
        @LOTOVQTY NUMERIC(19, 5),
        @LOCNCODE CHAR(10),
        @ITEMNMBR CHAR(30),
        @SUBTOTAL NUMERIC(19, 5),
        @TRADEPCT NUMERIC(19, 5),
        @OTRADPCT NUMERIC(19, 5),
        @DeleteType INT,
        @ORTDISAML NUMERIC(19, 5),
        @ISTRADEAPERCENT INT,
        @TRDISPCT NUMERIC(19, 5),
        @PYMTRMID CHAR(20),
        @DUEDATE DATETIME,
        @DISCDATE DATETIME,
        @UNITPRCE NUMERIC(19, 5),
        @KITXTNDPRCE NUMERIC(19, 5),
        @FUNDECPLCUR INT,
        @EDITDECPLCUR INT,
        @USEUNITPRCE NUMERIC(19, 5),
        @XCHGRATE NUMERIC(19, 7),
        @RTCLCMTD SMALLINT,
        @ODECPLCU INT,
        @DECPLCUR INT,
        @XTNDPRCEExst NUMERIC(19, 5),
        @XTNDPRCECHG NUMERIC(19, 5),
        @DSCPCTAM NUMERIC(19, 5),
        @KITEXTDCOST NUMERIC(19, 5),
        @KITUNITCOST NUMERIC(19, 5),
        @KITITEMFUNCTDEC INT,
        @fieldupdate TINYINT,
        @NONINVEN TINYINT,
        @XTNDPRCE NUMERIC(19, 5),
        @stoprecalc TINYINT,
        @CHGAMNT NUMERIC(19, 5),
        @PRSTADCD CHAR(15),
        @SUMSERLTQTY NUMERIC(19, 5),
        @SHIPMTHD CHAR(15),
        @ADDRESS1 CHAR(60),
        @ADDRESS2 CHAR(60),
        @ADDRESS3 CHAR(60),
        @CNTCPRSN CHAR(60),
        @FAXNUMBR CHAR(21),
        @CITY CHAR(35),
        @STATE CHAR(29),
        @ZIPCODE CHAR(10),
        @COUNTRY CHAR(60),
        @PHNUMBR1 CHAR(21),
        @PHNUMBR2 CHAR(21),
        @PHNUMBR3 CHAR(21);
SELECT @DOCDATE = '',
       @CUSTNMBR = '',
       @O_oErrorState = 0,
       @O_iErrorState = 0,
       @iStatus = 0,
       @BACHNUMB = '',
       @ITMTRKOP = 0,
       @oErrString = '',
       @iUpdtBthErrState = 0,
       @iUpdDistErrState = 0,
       @iCreateBatchErrString = '',
       @SOPHdrTbl = '',
       @DexRowID = 0,
       @oExists = 0,
       @CURRNIDX = 0,
       @ORTDISAM = 0,
       @DISTKNAM = 0,
       @PYMTRCVD = 0,
       @FRTAMNT = 0,
       @MISCAMNT = 0,
       @TAXAMNT = 0,
       @LineCount = 0,
       @ITEMTYPE = 0,
       @OInsStatus = 0,
       @DISAVAMT = 0,
       @ORNCMAMT = 0,
       @OXTNDPRC = 0,
       @ORSUBTOT = 0,
       @ORMSCTAX = 0,
       @OREXTCST = 0,
       @FUNLCURR = '',
       @CURNCYID = '',
       @mylock = 0,
       @DexLockErrorState = 0,
       @TOTALTAX = 0,
       @taSopLineDeletePostErrState = 0,
       @taSopLineDeletePostErrString = '',
       @taSopHdrRecalcErrState = 0,
       @taSopHdrRecalcErrString = '',
       @QTYPRBAC = 0,
       @QTYPRBOO = 0,
       @QTYPRINV = 0,
       @QTYPRORD = 0,
       @ISMCTRX = 0,
       @CALCKITC = 0,
       @KITITEM = '',
       @KITPRCLEVEL = '',
       @KITPRICMTHD = 0,
       @KITUOMPRICE = 0,
       @KITUOFM = '',
       @KITQUANTITY = 0,
       @DOCAMTNEG = 0,
       @ENABLEMULTIBIN = 0,
       @SEROVQTY = 0,
       @LOTOVQTY = 0,
       @LOCNCODE = '',
       @ITEMNMBR = '',
       @SUBTOTAL = 0,
       @TRADEPCT = 0,
       @OTRADPCT = 0,
       @DeleteType = 0,
       @ORTDISAML = 0,
       @ISTRADEAPERCENT = 0,
       @TRDISPCT = 0,
       @PYMTRMID = '',
       @DUEDATE = '',
       @DISCDATE = '',
       @UNITPRCE = 0,
       @KITXTNDPRCE = 0,
       @FUNDECPLCUR = 2,
       @EDITDECPLCUR = 2,
       @USEUNITPRCE = 0,
       @XCHGRATE = 0,
       @RTCLCMTD = 0,
       @ODECPLCU = 0,
       @DECPLCUR = 0,
       @XTNDPRCEExst = 0,
       @XTNDPRCECHG = 0,
       @DSCPCTAM = 0,
       @KITEXTDCOST = 0,
       @KITUNITCOST = 0,
       @KITITEMFUNCTDEC = 0,
       @fieldupdate = 0,
       @NONINVEN = 0,
       @XTNDPRCE = 0,
       @stoprecalc = 0,
       @CHGAMNT = 0,
       @PRSTADCD = '',
       @SUMSERLTQTY = 0,
       @SHIPMTHD = '',
       @ADDRESS1 = '',
       @ADDRESS2 = '',
       @ADDRESS3 = '',
       @CNTCPRSN = '',
       @FAXNUMBR = '',
       @CITY = '',
       @STATE = '',
       @ZIPCODE = '',
       @COUNTRY = '',
       @PHNUMBR1 = '',
       @PHNUMBR2 = '',
       @PHNUMBR3 = '';
IF (@oErrString IS NULL)
BEGIN
    SELECT @oErrString = '';
END;
EXEC @iStatus = taSopLineDeletePre @I_vSOPTYPE OUTPUT,
                                   @I_vSOPNUMBE OUTPUT,
                                   @I_vLNITMSEQ OUTPUT,
                                   @I_vITEMNMBR OUTPUT,
                                   @I_vRequesterTrx OUTPUT,
                                   @I_vRecreateDist OUTPUT,
                                   @I_vCMPNTSEQ OUTPUT,
                                   @I_vDeleteType OUTPUT,
                                   @I_vUSRDEFND1 OUTPUT,
                                   @I_vUSRDEFND2 OUTPUT,
                                   @I_vUSRDEFND3 OUTPUT,
                                   @I_vUSRDEFND4 OUTPUT,
                                   @I_vUSRDEFND5 OUTPUT,
                                   @O_iErrorState = @iCustomState OUTPUT,
                                   @oErrString = @iCustomErrString OUTPUT;
SELECT @iError = @@error;
IF ((@iStatus <> 0) OR (@iCustomState <> 0) OR (@iError <> 0))
BEGIN
    SELECT @oErrString = RTRIM(@oErrString) + ' ' + @iCustomErrString;
    SELECT @O_iErrorState = 798;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
    RETURN (@O_iErrorState);
END;
IF (
       (@I_vSOPTYPE IS NULL)
       OR (@I_vSOPNUMBE IS NULL)
       OR (@I_vLNITMSEQ IS NULL)
       OR (@I_vITEMNMBR IS NULL)
       OR (@I_vRequesterTrx IS NULL)
       OR (@I_vRecreateDist IS NULL)
       OR (@I_vCMPNTSEQ IS NULL)
       OR (@I_vDeleteType IS NULL)
   )
BEGIN
    SELECT @O_iErrorState = 407;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
IF (@I_vDeleteType = 999)
BEGIN
    SELECT @DeleteType = 999,
           @I_vDeleteType = 1;
END;
IF (@I_vDeleteType = 998)
BEGIN
    SELECT @DeleteType = 999,
           @I_vDeleteType = 2;
END;
IF (@I_vDeleteType = 997)
BEGIN
    SELECT @DeleteType = 997,
           @I_vDeleteType = 1;
END;
IF ((@I_vSOPTYPE < 1) OR (@I_vSOPTYPE > 6))
BEGIN
    SELECT @O_iErrorState = 411;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
IF ((@I_vRequesterTrx < 0) OR (@I_vRequesterTrx > 1))
BEGIN
    SELECT @O_iErrorState = 2220;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
IF ((@I_vSOPNUMBE = '') OR (@I_vITEMNMBR = ''))
BEGIN
    SELECT @O_iErrorState = 408;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
IF ((@I_vRecreateDist < 0) OR (@I_vRecreateDist > 1))
BEGIN
    SELECT @O_iErrorState = 752;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
IF ((@I_vDeleteType < 1) OR (@I_vDeleteType > 2))
BEGIN
    SELECT @O_iErrorState = 3566;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
SELECT @I_vSOPNUMBE = UPPER(@I_vSOPNUMBE),
       @I_vITEMNMBR = UPPER(@I_vITEMNMBR);
SELECT @ENABLEMULTIBIN = ENABLEMULTIBIN
FROM IV40100 (NOLOCK);
SELECT @FUNLCURR = FUNLCURR
FROM MC40000 (NOLOCK);
SELECT @CURNCYID = CURNCYID
FROM SOP10100 (NOLOCK)
WHERE SOPTYPE = @I_vSOPTYPE
      AND SOPNUMBE = @I_vSOPNUMBE;
IF ((@CURNCYID <> '') AND (@CURNCYID <> @FUNLCURR))
BEGIN
    SELECT @ISMCTRX = 1;
END;
SELECT @FUNDECPLCUR = DECPLCUR
FROM DYNAMICS..MC40200 (NOLOCK)
WHERE CURNCYID = @FUNLCURR;
IF (@ISMCTRX = 1)
BEGIN
    SELECT @EDITDECPLCUR = DECPLCUR - 1
    FROM DYNAMICS..MC40200 (NOLOCK)
    WHERE CURNCYID = @CURNCYID;
END;
ELSE
BEGIN
    SELECT @EDITDECPLCUR = @FUNDECPLCUR - 1;
END;
SELECT @LineCount = COUNT(*)
FROM SOP10200 (NOLOCK)
WHERE SOPNUMBE = @I_vSOPNUMBE
      AND SOPTYPE = @I_vSOPTYPE
      AND ITEMNMBR = @I_vITEMNMBR;
IF (
       (@LineCount > 1)
       AND
       (
           (
               (@I_vLNITMSEQ = 0)
               AND (@I_vDeleteType = 1)
           )
           OR
           (
               (
                   (@I_vLNITMSEQ = 0)
                   OR (@I_vCMPNTSEQ = 0)
               )
               AND (@I_vDeleteType = 2)
           )
       )
   )
BEGIN
    SELECT @O_iErrorState = 796;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
ELSE IF (@LineCount = 1)
BEGIN
    IF (@I_vLNITMSEQ = 0)
    BEGIN
        SELECT @I_vLNITMSEQ = LNITMSEQ
        FROM SOP10200 (NOLOCK)
        WHERE SOPNUMBE = @I_vSOPNUMBE
              AND SOPTYPE = @I_vSOPTYPE
              AND ITEMNMBR = @I_vITEMNMBR;
    END;
    IF (@I_vCMPNTSEQ = 0)
    BEGIN
        SELECT @I_vCMPNTSEQ = CMPNTSEQ
        FROM SOP10200 (NOLOCK)
        WHERE SOPNUMBE = @I_vSOPNUMBE
              AND SOPTYPE = @I_vSOPTYPE
              AND ITEMNMBR = @I_vITEMNMBR;
    END;
END;
SELECT @ITEMTYPE = ITEMTYPE,
       @ITMTRKOP = ITMTRKOP
FROM IV00101 (NOLOCK)
WHERE ITEMNMBR = @I_vITEMNMBR;
IF (NOT EXISTS
(
    SELECT ITEMNMBR
    FROM IV00101 (NOLOCK)
    WHERE ITEMNMBR = @I_vITEMNMBR
)
   )
BEGIN
    SELECT @NONINVEN = 1;
END;
SELECT @QTYPRBAC = QTYPRBAC,
       @QTYPRBOO = QTYPRBOO,
       @QTYPRINV = QTYPRINV,
       @QTYPRORD = QTYPRORD,
       @LOCNCODE = LOCNCODE
FROM SOP10200 (NOLOCK)
WHERE SOPNUMBE = @I_vSOPNUMBE
      AND SOPTYPE = @I_vSOPTYPE
      AND LNITMSEQ = @I_vLNITMSEQ
      AND ITEMNMBR = @I_vITEMNMBR;
IF (@I_vDeleteType = 2)
BEGIN
    SELECT @KITITEM = ITEMNMBR,
           @KITPRCLEVEL = PRCLEVEL,
           @KITUOFM = UOFM,
           @KITQUANTITY = QUANTITY
    FROM SOP10200 (NOLOCK)
    WHERE SOPNUMBE = @I_vSOPNUMBE
          AND SOPTYPE = @I_vSOPTYPE
          AND LNITMSEQ = @I_vLNITMSEQ
          AND CMPNTSEQ = 0;
    SELECT @KITPRICMTHD = PRICMTHD
    FROM IV00101 (NOLOCK)
    WHERE ITEMNMBR = @KITITEM;
    SELECT @KITUOMPRICE = UOMPRICE
    FROM IV00108 (NOLOCK)
    WHERE ITEMNMBR = @KITITEM
          AND CURNCYID = @CURNCYID
          AND PRCLEVEL = @KITPRCLEVEL
          AND UOFM = @KITUOFM
          AND @KITQUANTITY = FROMQTY
          AND @KITQUANTITY <= TOQTY;
    IF (@KITPRICMTHD > 2)
    BEGIN
        SELECT @CALCKITC = CALCKITC
        FROM SOP40100 (NOLOCK)
        WHERE SETUPKEY = 1;
    END;
    ELSE
    BEGIN
        SELECT @CALCKITC = 0;
    END;
END;
IF (@DeleteType NOT IN ( 997, 999 ))
BEGIN
    IF (EXISTS
    (
        SELECT 1
        FROM SOP60100 (NOLOCK)
        WHERE SOPNUMBE = @I_vSOPNUMBE
              AND SOPTYPE = @I_vSOPTYPE
              AND LNITMSEQ = @I_vLNITMSEQ
              AND CMPNTSEQ = @I_vCMPNTSEQ
    )
       )
    BEGIN
        SELECT @O_iErrorState = 2091;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
    END;
END;
SELECT @DexRowID = DEX_ROW_ID
FROM SOP10100 (NOLOCK)
WHERE SOPTYPE = @I_vSOPTYPE
      AND SOPNUMBE = @I_vSOPNUMBE;
IF ((@DexRowID = 0) OR (@DexRowID IS NULL))
BEGIN
    SELECT @O_iErrorState = 409;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
END;
IF (@I_vDeleteType = 1)
BEGIN
    IF (NOT EXISTS
    (
        SELECT 1
        FROM SOP10200 (NOLOCK)
        WHERE SOPNUMBE = @I_vSOPNUMBE
              AND SOPTYPE = @I_vSOPTYPE
              AND @I_vITEMNMBR = ITEMNMBR
              AND LNITMSEQ = @I_vLNITMSEQ
              AND CMPNTSEQ = 0
    )
       )
    BEGIN
        SELECT @O_iErrorState = 999;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
    END;
END;
ELSE
BEGIN
    IF (NOT EXISTS
    (
        SELECT 1
        FROM SOP10200 (NOLOCK)
        WHERE SOPNUMBE = @I_vSOPNUMBE
              AND SOPTYPE = @I_vSOPTYPE
              AND @I_vITEMNMBR = ITEMNMBR
              AND LNITMSEQ = @I_vLNITMSEQ
              AND CMPNTSEQ = @I_vCMPNTSEQ
    )
       )
    BEGIN
        SELECT @O_iErrorState = 3449;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
    END;
    IF (@ITEMTYPE = 3)
    BEGIN
        SELECT @O_iErrorState = 3456;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
    END;
END;
IF (@O_iErrorState <> 0)
    RETURN (@O_iErrorState);
IF (@I_vRequesterTrx = 0)
BEGIN
    EXEC @iStatus = eConnectOutVerify @I_vDOCTYPE = 'Sales_Transaction',
                                      @I_vINDEX1 = @I_vSOPNUMBE,
                                      @I_vINDEX2 = @I_vSOPTYPE,
                                      @I_vINDEX3 = '',
                                      @I_vINDEX4 = '',
                                      @I_vINDEX5 = '',
                                      @I_vINDEX6 = '',
                                      @I_vINDEX7 = '',
                                      @I_vINDEX8 = '',
                                      @I_vINDEX9 = '',
                                      @I_vINDEX10 = '',
                                      @I_vINDEX11 = '',
                                      @I_vINDEX12 = '',
                                      @I_vINDEX13 = '',
                                      @I_vINDEX14 = '',
                                      @I_vINDEX15 = '',
                                      @I_vDelete = 0,
                                      @O_iErrorState = @iCustomState OUTPUT;
    SELECT @iError = @@error;
    IF ((@iStatus <> 0) OR (@iCustomState <> 0) OR (@iError <> 0))
    BEGIN
        SELECT @oErrString = RTRIM(@oErrString) + ' ' + @iCustomState;
        SELECT @O_iErrorState = 3542;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
        RETURN (@O_iErrorState);
    END;
END;
WHILE (1 = 1)
BEGIN
    SELECT @SOPHdrTbl = RTRIM(DB_NAME()) + '.dbo.SOP10100';
    SELECT @DexRowID = DEX_ROW_ID
    FROM SOP10100 (NOLOCK)
    WHERE SOPTYPE = @I_vSOPTYPE
          AND SOPNUMBE = @I_vSOPNUMBE;
    IF (NOT EXISTS
    (
        SELECT 1
        FROM tempdb..DEX_LOCK (NOLOCK)
        WHERE table_path_name = @SOPHdrTbl
              AND row_id = @DexRowID
              AND session_id = @@spid
    )
       )
    BEGIN
        SELECT @mylock = 1;
        IF (
               (@QTYPRBAC > 0)
               OR (@QTYPRBOO > 0)
               OR (@QTYPRINV > 0)
               OR (@QTYPRORD > 0)
           )
        BEGIN
            SELECT @O_iErrorState = 2254;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        EXEC DYNAMICS..taDEXLOCKS @I_vOperation = 1,
                                  @I_vtable_path_name = @SOPHdrTbl,
                                  @I_vrow_id = @DexRowID,
                                  @O_oExists = @oExists OUTPUT,
                                  @O_oInsertStatus = @OInsStatus OUTPUT,
                                  @O_iErrorState = @DexLockErrorState OUTPUT;
        SELECT @iError = @@error;
        IF ((@OInsStatus <> 1) OR (@DexLockErrorState <> 0) OR (@iError <> 0))
        BEGIN
            IF (@DexLockErrorState <> 0)
            BEGIN
                SELECT @oErrString = RTRIM(@oErrString) + ' ' + @DexLockErrorState;
            END;
            SELECT @O_iErrorState = 7017;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
    END;
    IF ((@ITEMTYPE = 3) OR ((@I_vDeleteType = 2) AND (@CALCKITC = 1)))
    BEGIN
        SELECT @CUSTNMBR = b.CUSTNMBR,
               @OXTNDPRC = a.OXTNDPRC,
               @OREXTCST = a.OREXTCST,
               @ORTDISAML = a.ORTDISAM,
               @ORSUBTOT = b.ORSUBTOT,
               @XCHGRATE = b.XCHGRATE,
               @RTCLCMTD = b.RTCLCMTD,
               @ODECPLCU = a.ODECPLCU,
               @DECPLCUR = a.DECPLCUR,
               @XTNDPRCEExst = a.XTNDPRCE
        FROM SOP10200 a (NOLOCK),
             SOP10100 b (NOLOCK)
        WHERE a.SOPTYPE = @I_vSOPTYPE
              AND a.SOPNUMBE = @I_vSOPNUMBE
              AND a.LNITMSEQ = @I_vLNITMSEQ
              AND a.CMPNTSEQ = 0
              AND a.SOPTYPE = b.SOPTYPE
              AND a.SOPNUMBE = b.SOPNUMBE;
        IF (@NONINVEN = 0)
        BEGIN
            IF (@ISMCTRX = 1)
            BEGIN
                SELECT @KITITEMFUNCTDEC = DECPLCUR - 1
                FROM IV00105 (NOLOCK)
                WHERE ITEMNMBR = @KITITEM
                      AND CURNCYID = @FUNLCURR;
            END;
            ELSE
            BEGIN
                SELECT @KITITEMFUNCTDEC = DECPLCUR - 1
                FROM IV00105 (NOLOCK)
                WHERE ITEMNMBR = @KITITEM
                      AND
                      (
                          CURNCYID = ''
                          OR CURNCYID = @FUNLCURR
                      );
            END;
        END;
    END;
    ELSE
    BEGIN
        SELECT @CUSTNMBR = b.CUSTNMBR,
               @OXTNDPRC = a.OXTNDPRC,
               @OREXTCST = a.OREXTCST,
               @ORTDISAML = a.ORTDISAM,
               @ORSUBTOT = b.ORSUBTOT,
               @XTNDPRCEExst = a.XTNDPRCE
        FROM SOP10200 a (NOLOCK),
             SOP10100 b (NOLOCK)
        WHERE a.SOPTYPE = @I_vSOPTYPE
              AND a.SOPNUMBE = @I_vSOPNUMBE
              AND a.LNITMSEQ = @I_vLNITMSEQ
              AND a.CMPNTSEQ = @I_vCMPNTSEQ
              AND a.SOPTYPE = b.SOPTYPE
              AND a.SOPNUMBE = b.SOPNUMBE;
    END;
    IF (@I_vSOPTYPE = 5)
    BEGIN
        UPDATE a
        SET a.QTYBKORD = a.QTYBKORD - (b.QTYTORDR * b.QTYBSUOM) - (b.QTYTOINV * b.QTYBSUOM)
        FROM IV00102 a (UPDLOCK),
             SOP10200 b (NOLOCK),
             IV00101 c (NOLOCK)
        WHERE a.ITEMNMBR = b.ITEMNMBR
              AND a.LOCNCODE = b.LOCNCODE
              AND b.ITEMNMBR = c.ITEMNMBR
              AND b.SOPTYPE = @I_vSOPTYPE
              AND b.SOPNUMBE = @I_vSOPNUMBE
              AND b.LNITMSEQ = @I_vLNITMSEQ
              AND b.CMPNTSEQ = @I_vCMPNTSEQ;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 4766;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        UPDATE a
        SET a.QTYBKORD = a.QTYBKORD - (b.QTYTORDR * b.QTYBSUOM) - (b.QTYTOINV * b.QTYBSUOM)
        FROM IV00102 a (UPDLOCK),
             SOP10200 b (NOLOCK),
             IV00101 c (NOLOCK)
        WHERE a.ITEMNMBR = b.ITEMNMBR
              AND a.LOCNCODE = ''
              AND b.ITEMNMBR = c.ITEMNMBR
              AND b.SOPTYPE = @I_vSOPTYPE
              AND b.SOPNUMBE = @I_vSOPNUMBE
              AND b.LNITMSEQ = @I_vLNITMSEQ
              AND b.CMPNTSEQ = @I_vCMPNTSEQ;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 7219;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
    END;
    IF (@I_vSOPTYPE IN ( 2, 3, 6 ))
    BEGIN
        IF (@I_vDeleteType = 2)
        BEGIN
            UPDATE a
            SET a.ATYALLOC = a.ATYALLOC - (b.ATYALLOC * b.QTYBSUOM),
                a.QTYBKORD = a.QTYBKORD - (b.QTYTBAOR * b.QTYBSUOM)
            FROM IV00102 a (UPDLOCK),
                 SOP10200 b (NOLOCK),
                 IV00101 c (NOLOCK)
            WHERE a.ITEMNMBR = b.ITEMNMBR
                  AND a.LOCNCODE = b.LOCNCODE
                  AND b.ITEMNMBR = c.ITEMNMBR
                  AND b.SOPTYPE = @I_vSOPTYPE
                  AND b.SOPNUMBE = @I_vSOPNUMBE
                  AND b.LNITMSEQ = @I_vLNITMSEQ
                  AND b.CMPNTSEQ = @I_vCMPNTSEQ
                  AND
                  (
                      c.ITEMTYPE = 1
                      OR c.ITEMTYPE = 2
                  );
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 7195;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            UPDATE a
            SET a.ATYALLOC = a.ATYALLOC - (b.ATYALLOC * b.QTYBSUOM),
                a.QTYBKORD = a.QTYBKORD - (b.QTYTBAOR * b.QTYBSUOM)
            FROM IV00102 a (UPDLOCK),
                 SOP10200 b (NOLOCK),
                 IV00101 c (NOLOCK)
            WHERE a.ITEMNMBR = b.ITEMNMBR
                  AND a.LOCNCODE = ''
                  AND b.ITEMNMBR = c.ITEMNMBR
                  AND b.SOPTYPE = @I_vSOPTYPE
                  AND b.SOPNUMBE = @I_vSOPNUMBE
                  AND b.LNITMSEQ = @I_vLNITMSEQ
                  AND b.CMPNTSEQ = @I_vCMPNTSEQ
                  AND
                  (
                      c.ITEMTYPE = 1
                      OR c.ITEMTYPE = 2
                  );
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 7196;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            IF ((@ITMTRKOP = 1) AND (@ENABLEMULTIBIN = 1))
            BEGIN
                UPDATE a
                SET a.ATYALLOC = a.ATYALLOC - b.QUANTITY
                FROM IV00112 a (UPDLOCK),
                     SOP10203 b (NOLOCK)
                WHERE a.ITEMNMBR = b.ITEMNMBR
                      AND a.LOCNCODE = b.LOCNCODE
                      AND a.BIN = b.BIN
                      AND a.QTYTYPE = b.QTYTYPE
                      AND b.SOPTYPE = @I_vSOPTYPE
                      AND b.SOPNUMBE = @I_vSOPNUMBE
                      AND b.LNITMSEQ = @I_vLNITMSEQ
                      AND b.CMPNTSEQ = @I_vCMPNTSEQ;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 7197;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            IF ((@ITMTRKOP IN ( 2, 3 )) AND (@ENABLEMULTIBIN = 1))
            BEGIN
                UPDATE a
                SET a.ATYALLOC = a.ATYALLOC - b.SERLTQTY
                FROM IV00112 a (UPDLOCK),
                     SOP10201 b (NOLOCK)
                WHERE a.ITEMNMBR = b.ITEMNMBR
                      AND a.BIN = b.BIN
                      AND a.QTYTYPE = b.QTYTYPE
                      AND b.SOPTYPE = @I_vSOPTYPE
                      AND b.SOPNUMBE = @I_vSOPNUMBE
                      AND b.LNITMSEQ = @I_vLNITMSEQ
                      AND a.LOCNCODE = @LOCNCODE;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 9312;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
        END;
        ELSE
        BEGIN
            UPDATE a
            SET a.ATYALLOC = a.ATYALLOC - (b.ATYALLOC * b.QTYBSUOM),
                a.QTYBKORD = a.QTYBKORD - (b.QTYTBAOR * b.QTYBSUOM)
            FROM IV00102 a (UPDLOCK),
                 SOP10200 b (NOLOCK),
                 IV00101 c (NOLOCK)
            WHERE a.ITEMNMBR = b.ITEMNMBR
                  AND a.LOCNCODE = b.LOCNCODE
                  AND b.ITEMNMBR = c.ITEMNMBR
                  AND b.SOPTYPE = @I_vSOPTYPE
                  AND b.SOPNUMBE = @I_vSOPNUMBE
                  AND b.LNITMSEQ = @I_vLNITMSEQ
                  AND
                  (
                      c.ITEMTYPE = 1
                      OR c.ITEMTYPE = 2
                  );
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 413;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            UPDATE a
            SET a.ATYALLOC = a.ATYALLOC - (b.ATYALLOC * b.QTYBSUOM),
                a.QTYBKORD = a.QTYBKORD - (b.QTYTBAOR * b.QTYBSUOM)
            FROM IV00102 a (UPDLOCK),
                 SOP10200 b (NOLOCK),
                 IV00101 c (NOLOCK)
            WHERE a.ITEMNMBR = b.ITEMNMBR
                  AND a.LOCNCODE = ''
                  AND b.ITEMNMBR = c.ITEMNMBR
                  AND b.SOPTYPE = @I_vSOPTYPE
                  AND b.SOPNUMBE = @I_vSOPNUMBE
                  AND b.LNITMSEQ = @I_vLNITMSEQ
                  AND
                  (
                      c.ITEMTYPE = 1
                      OR c.ITEMTYPE = 2
                  );
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 414;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            IF ((@ITMTRKOP = 1) AND (@ENABLEMULTIBIN = 1))
            BEGIN
                UPDATE a
                SET a.ATYALLOC = a.ATYALLOC - b.QUANTITY
                FROM IV00112 a (UPDLOCK),
                     SOP10203 b (NOLOCK)
                WHERE a.ITEMNMBR = b.ITEMNMBR
                      AND a.LOCNCODE = b.LOCNCODE
                      AND a.BIN = b.BIN
                      AND a.QTYTYPE = b.QTYTYPE
                      AND b.SOPTYPE = @I_vSOPTYPE
                      AND b.SOPNUMBE = @I_vSOPNUMBE
                      AND b.LNITMSEQ = @I_vLNITMSEQ;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 5991;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            IF (
                   (@ITMTRKOP IN ( 2, 3 ))
                   AND (@ENABLEMULTIBIN = 1)
                   AND (@DeleteType <> 999)
               )
            BEGIN
                UPDATE a
                SET a.ATYALLOC = a.ATYALLOC - b.SERLTQTY
                FROM IV00112 a (UPDLOCK),
                     SOP10201 b (NOLOCK)
                WHERE a.ITEMNMBR = b.ITEMNMBR
                      AND a.BIN = b.BIN
                      AND a.QTYTYPE = b.QTYTYPE
                      AND b.SOPTYPE = @I_vSOPTYPE
                      AND b.SOPNUMBE = @I_vSOPNUMBE
                      AND b.LNITMSEQ = @I_vLNITMSEQ
                      AND a.LOCNCODE = @LOCNCODE;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 9311;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
        END;
        IF ((@ITMTRKOP = 2) AND (@DeleteType <> 999))
        BEGIN
            UPDATE IV00200
            SET SERLNSLD = 0
            FROM IV00200 (UPDLOCK)
            WHERE ITEMNMBR = @I_vITEMNMBR
                  AND SERLNMBR IN
                      (
                          SELECT SERLTNUM
                          FROM SOP10201 (NOLOCK)
                          WHERE SOPTYPE = @I_vSOPTYPE
                                AND SOPNUMBE = @I_vSOPNUMBE
                                AND LNITMSEQ = @I_vLNITMSEQ
                      );
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 422;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            IF EXISTS
            (
                SELECT 1
                FROM SOP10201 (NOLOCK)
                WHERE SOPTYPE = @I_vSOPTYPE
                      AND SOPNUMBE = @I_vSOPNUMBE
                      AND LNITMSEQ = @I_vLNITMSEQ
                      AND OVRSERLT = 1
            )
            BEGIN
                DELETE IV00200
                WHERE SERLNMBR IN
                      (
                          SELECT SERLTNUM
                          FROM SOP10201 (NOLOCK)
                          WHERE SOPTYPE = @I_vSOPTYPE
                                AND SOPNUMBE = @I_vSOPNUMBE
                                AND LNITMSEQ = @I_vLNITMSEQ
                                AND OVRSERLT = 1
                      );
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 6511;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
                SELECT @SEROVQTY = 0;
                SELECT @SEROVQTY = SUM(SERLTQTY)
                FROM SOP10201
                WHERE SOPTYPE = @I_vSOPTYPE
                      AND SOPNUMBE = @I_vSOPNUMBE
                      AND LNITMSEQ = @I_vLNITMSEQ
                      AND OVRSERLT = 1;
                UPDATE IV00102
                SET QTYONHND = QTYONHND - @SEROVQTY
                FROM IV00102 (UPDLOCK)
                WHERE ITEMNMBR = @I_vITEMNMBR
                      AND LOCNCODE = @LOCNCODE;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 6512;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
                UPDATE IV00102
                SET QTYONHND = QTYONHND - @SEROVQTY
                FROM IV00102 (UPDLOCK)
                WHERE ITEMNMBR = @I_vITEMNMBR
                      AND LOCNCODE = '';
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 6513;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
        END;
        IF ((@ITMTRKOP = 3) AND (@DeleteType <> 999))
        BEGIN
            UPDATE a
            SET a.ATYALLOC = a.ATYALLOC - c.SERLTQTY,
                a.LTNUMSLD = 0
            FROM IV00300 a (UPDLOCK),
                 SOP10201 b (NOLOCK),
            (
                SELECT a.ITEMNMBR,
                       a.LOCNCODE,
                       a.QTYTYPE,
                       a.DATERECD,
                       a.DTSEQNUM,
                       SUM(b.SERLTQTY) AS 'SERLTQTY'
                FROM IV00300 a (NOLOCK),
                     SOP10201 b (NOLOCK)
                WHERE b.SOPTYPE = @I_vSOPTYPE
                      AND b.SOPNUMBE = @I_vSOPNUMBE
                      AND b.LNITMSEQ = @I_vLNITMSEQ
                      AND a.DATERECD = b.DATERECD
                      AND a.DTSEQNUM = b.DTSEQNUM
                      AND a.LOTNUMBR = b.SERLTNUM
                      AND a.LOCNCODE = @LOCNCODE
                      AND a.ITEMNMBR = b.ITEMNMBR
                      AND a.QTYTYPE = b.QTYTYPE
                GROUP BY a.ITEMNMBR,
                         a.LOCNCODE,
                         a.QTYTYPE,
                         a.DATERECD,
                         a.DTSEQNUM
            ) c
            WHERE b.SOPTYPE = @I_vSOPTYPE
                  AND b.SOPNUMBE = @I_vSOPNUMBE
                  AND b.LNITMSEQ = @I_vLNITMSEQ
                  AND a.DATERECD = b.DATERECD
                  AND a.DTSEQNUM = b.DTSEQNUM
                  AND a.LOTNUMBR = b.SERLTNUM
                  AND a.LOCNCODE = @LOCNCODE
                  AND a.ITEMNMBR = b.ITEMNMBR
                  AND a.QTYTYPE = b.QTYTYPE
                  AND c.ITEMNMBR = a.ITEMNMBR
                  AND c.LOCNCODE = a.LOCNCODE
                  AND c.QTYTYPE = a.QTYTYPE
                  AND c.DATERECD = a.DATERECD
                  AND c.DTSEQNUM = a.DTSEQNUM;
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 423;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            IF EXISTS
            (
                SELECT 1
                FROM SOP10201 (NOLOCK)
                WHERE SOPTYPE = @I_vSOPTYPE
                      AND SOPNUMBE = @I_vSOPNUMBE
                      AND LNITMSEQ = @I_vLNITMSEQ
                      AND OVRSERLT = 1
            )
            BEGIN
                DELETE IV00300
                WHERE LOTNUMBR IN
                      (
                          SELECT SERLTNUM
                          FROM SOP10201 (NOLOCK)
                          WHERE SOPTYPE = @I_vSOPTYPE
                                AND SOPNUMBE = @I_vSOPNUMBE
                                AND LNITMSEQ = @I_vLNITMSEQ
                                AND OVRSERLT = 1
                      );
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 6514;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
                SELECT @LOTOVQTY = 0;
                SELECT @LOTOVQTY = SUM(SERLTQTY)
                FROM SOP10201
                WHERE SOPTYPE = @I_vSOPTYPE
                      AND SOPNUMBE = @I_vSOPNUMBE
                      AND LNITMSEQ = @I_vLNITMSEQ
                      AND OVRSERLT = 1;
                UPDATE IV00102
                SET QTYONHND = QTYONHND - @LOTOVQTY
                FROM IV00102 (UPDLOCK)
                WHERE ITEMNMBR = @ITEMNMBR
                      AND LOCNCODE = @LOCNCODE;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 6515;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
                UPDATE IV00102
                SET QTYONHND = QTYONHND - @LOTOVQTY
                FROM IV00102 (UPDLOCK)
                WHERE ITEMNMBR = @ITEMNMBR
                      AND LOCNCODE = '';
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 6516;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
        END;
        IF (
               (@ITEMTYPE = 3)
               AND (@DeleteType <> 999)
               AND
               (
                   SELECT COUNT(a.ITEMNMBR)
                   FROM SOP10200 a (NOLOCK)
                       JOIN IV00101 b (NOLOCK)
                           ON a.ITEMNMBR = b.ITEMNMBR
                   WHERE a.SOPNUMBE = @I_vSOPNUMBE
                         AND a.SOPTYPE = @I_vSOPTYPE
                         AND a.LNITMSEQ = @I_vLNITMSEQ
                         AND a.CMPNTSEQ <> 0
                         AND b.ITMTRKOP = 2
               ) > 0
           )
        BEGIN
            DECLARE @KitSerSOPNUMBE CHAR(21),
                    @KitSerSOPTYPE SMALLINT,
                    @KitSerLNITMSEQ INT,
                    @KitSerCMPNTSEQ INT,
                    @KitSerITEMNMBR CHAR(30),
                    @KitSerLOCNCODE CHAR(10);
            DECLARE Kit_Ser CURSOR FOR(
            SELECT a.SOPNUMBE,
                   a.SOPTYPE,
                   a.LNITMSEQ,
                   a.CMPNTSEQ,
                   a.ITEMNMBR,
                   a.LOCNCODE
            FROM SOP10200 a (NOLOCK)
                JOIN IV00101 b (NOLOCK)
                    ON a.ITEMNMBR = b.ITEMNMBR
            WHERE a.SOPNUMBE = @I_vSOPNUMBE
                  AND a.SOPTYPE = @I_vSOPTYPE
                  AND a.LNITMSEQ = @I_vLNITMSEQ
                  AND a.CMPNTSEQ <> 0
                  AND b.ITMTRKOP = 2);
            OPEN Kit_Ser;
            FETCH NEXT FROM Kit_Ser
            INTO @KitSerSOPNUMBE,
                 @KitSerSOPTYPE,
                 @KitSerLNITMSEQ,
                 @KitSerCMPNTSEQ,
                 @KitSerITEMNMBR,
                 @KitSerLOCNCODE;
            WHILE @@FETCH_STATUS = 0
            BEGIN
                UPDATE IV00200
                SET SERLNSLD = 0
                FROM IV00200 (UPDLOCK)
                WHERE ITEMNMBR = @KitSerITEMNMBR
                      AND SERLNMBR IN
                          (
                              SELECT SERLTNUM
                              FROM SOP10201 (NOLOCK)
                              WHERE SOPTYPE = @KitSerSOPTYPE
                                    AND SOPNUMBE = @KitSerSOPNUMBE
                                    AND LNITMSEQ = @KitSerLNITMSEQ
                                    AND CMPNTSEQ = @KitSerCMPNTSEQ
                          );
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 11858;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
                IF EXISTS
                (
                    SELECT 1
                    FROM SOP10201 (NOLOCK)
                    WHERE SOPTYPE = @KitSerSOPTYPE
                          AND SOPNUMBE = @KitSerSOPNUMBE
                          AND LNITMSEQ = @KitSerLNITMSEQ
                          AND CMPNTSEQ = @KitSerCMPNTSEQ
                          AND OVRSERLT = 1
                )
                BEGIN
                    DELETE IV00200
                    WHERE SERLNMBR IN
                          (
                              SELECT SERLTNUM
                              FROM SOP10201 (NOLOCK)
                              WHERE SOPTYPE = @KitSerSOPTYPE
                                    AND SOPNUMBE = @KitSerSOPNUMBE
                                    AND LNITMSEQ = @KitSerLNITMSEQ
                                    AND CMPNTSEQ = @KitSerCMPNTSEQ
                                    AND OVRSERLT = 1
                          );
                    IF (@@error <> 0)
                    BEGIN
                        SELECT @O_iErrorState = 11859;
                        EXEC @iStatus = taUpdateString @O_iErrorState,
                                                       @oErrString,
                                                       @oErrString OUTPUT,
                                                       @O_oErrorState OUTPUT;
                        BREAK;
                    END;
                    SELECT @SEROVQTY = 0;
                    SELECT @SEROVQTY = SUM(SERLTQTY)
                    FROM SOP10201
                    WHERE SOPTYPE = @KitSerSOPTYPE
                          AND SOPNUMBE = @KitSerSOPNUMBE
                          AND LNITMSEQ = @KitSerLNITMSEQ
                          AND CMPNTSEQ = @KitSerCMPNTSEQ
                          AND OVRSERLT = 1;
                    UPDATE IV00102
                    SET QTYONHND = QTYONHND - @SEROVQTY
                    FROM IV00102 (UPDLOCK)
                    WHERE ITEMNMBR = @KitSerITEMNMBR
                          AND LOCNCODE = @KitSerLOCNCODE;
                    IF (@@error <> 0)
                    BEGIN
                        SELECT @O_iErrorState = 11860;
                        EXEC @iStatus = taUpdateString @O_iErrorState,
                                                       @oErrString,
                                                       @oErrString OUTPUT,
                                                       @O_oErrorState OUTPUT;
                        BREAK;
                    END;
                    UPDATE IV00102
                    SET QTYONHND = QTYONHND - @SEROVQTY
                    FROM IV00102 (UPDLOCK)
                    WHERE ITEMNMBR = @KitSerITEMNMBR
                          AND LOCNCODE = '';
                    IF (@@error <> 0)
                    BEGIN
                        SELECT @O_iErrorState = 11861;
                        EXEC @iStatus = taUpdateString @O_iErrorState,
                                                       @oErrString,
                                                       @oErrString OUTPUT,
                                                       @O_oErrorState OUTPUT;
                        BREAK;
                    END;
                END;
                FETCH NEXT FROM Kit_Ser
                INTO @KitSerSOPNUMBE,
                     @KitSerSOPTYPE,
                     @KitSerLNITMSEQ,
                     @KitSerCMPNTSEQ,
                     @KitSerITEMNMBR,
                     @KitSerLOCNCODE;
            END;
            CLOSE Kit_Ser;
            DEALLOCATE Kit_Ser;
        END;
        IF (
               (@ITEMTYPE = 3)
               AND (@DeleteType <> 999)
               AND
               (
                   SELECT COUNT(a.ITEMNMBR)
                   FROM SOP10200 a (NOLOCK)
                       JOIN IV00101 b (NOLOCK)
                           ON a.ITEMNMBR = b.ITEMNMBR
                   WHERE a.SOPNUMBE = @I_vSOPNUMBE
                         AND a.SOPTYPE = @I_vSOPTYPE
                         AND a.LNITMSEQ = @I_vLNITMSEQ
                         AND a.CMPNTSEQ <> 0
                         AND b.ITMTRKOP = 3
               ) > 0
           )
        BEGIN
            DECLARE @KitLotSOPNUMBE CHAR(21),
                    @KitLotSOPTYPE SMALLINT,
                    @KitLotLNITMSEQ INT,
                    @KitLotCMPNTSEQ INT,
                    @KitLotITEMNMBR CHAR(30),
                    @KitLotLOCNCODE CHAR(10);
            DECLARE Kit_Lot CURSOR FOR(
            SELECT a.SOPNUMBE,
                   a.SOPTYPE,
                   a.LNITMSEQ,
                   a.CMPNTSEQ,
                   a.ITEMNMBR,
                   a.LOCNCODE
            FROM SOP10200 a (NOLOCK)
                JOIN IV00101 b (NOLOCK)
                    ON a.ITEMNMBR = b.ITEMNMBR
            WHERE a.SOPNUMBE = @I_vSOPNUMBE
                  AND a.SOPTYPE = @I_vSOPTYPE
                  AND a.LNITMSEQ = @I_vLNITMSEQ
                  AND a.CMPNTSEQ <> 0
                  AND b.ITMTRKOP = 3);
            OPEN Kit_Lot;
            FETCH NEXT FROM Kit_Lot
            INTO @KitLotSOPNUMBE,
                 @KitLotSOPTYPE,
                 @KitLotLNITMSEQ,
                 @KitLotCMPNTSEQ,
                 @KitLotITEMNMBR,
                 @KitLotLOCNCODE;
            WHILE @@FETCH_STATUS = 0
            BEGIN
                UPDATE a
                SET a.ATYALLOC = a.ATYALLOC - c.SERLTQTY,
                    a.LTNUMSLD = 0
                FROM IV00300 a (UPDLOCK),
                     SOP10201 b (NOLOCK),
                (
                    SELECT a.ITEMNMBR,
                           a.LOCNCODE,
                           a.QTYTYPE,
                           a.DATERECD,
                           a.DTSEQNUM,
                           SUM(b.SERLTQTY) AS 'SERLTQTY'
                    FROM IV00300 a (NOLOCK),
                         SOP10201 b (NOLOCK)
                    WHERE b.SOPTYPE = @KitLotSOPTYPE
                          AND b.SOPNUMBE = @KitLotSOPNUMBE
                          AND b.LNITMSEQ = @KitLotLNITMSEQ
                          AND b.CMPNTSEQ = @KitLotCMPNTSEQ
                          AND a.DATERECD = b.DATERECD
                          AND a.DTSEQNUM = b.DTSEQNUM
                          AND a.LOTNUMBR = b.SERLTNUM
                          AND a.LOCNCODE = @KitSerLOCNCODE
                          AND a.ITEMNMBR = b.ITEMNMBR
                          AND a.QTYTYPE = b.QTYTYPE
                    GROUP BY a.ITEMNMBR,
                             a.LOCNCODE,
                             a.QTYTYPE,
                             a.DATERECD,
                             a.DTSEQNUM
                ) c
                WHERE b.SOPTYPE = @KitLotSOPTYPE
                      AND b.SOPNUMBE = @KitLotSOPNUMBE
                      AND b.LNITMSEQ = @KitLotLNITMSEQ
                      AND b.CMPNTSEQ = @KitLotCMPNTSEQ
                      AND a.DATERECD = b.DATERECD
                      AND a.DTSEQNUM = b.DTSEQNUM
                      AND a.LOTNUMBR = b.SERLTNUM
                      AND a.LOCNCODE = @KitSerLOCNCODE
                      AND a.ITEMNMBR = b.ITEMNMBR
                      AND a.QTYTYPE = b.QTYTYPE
                      AND c.ITEMNMBR = a.ITEMNMBR
                      AND c.LOCNCODE = a.LOCNCODE
                      AND c.QTYTYPE = a.QTYTYPE
                      AND c.DATERECD = a.DATERECD
                      AND c.DTSEQNUM = a.DTSEQNUM;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 11862;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
                IF EXISTS
                (
                    SELECT 1
                    FROM SOP10201 (NOLOCK)
                    WHERE SOPTYPE = @KitLotSOPTYPE
                          AND SOPNUMBE = @KitLotSOPNUMBE
                          AND LNITMSEQ = @KitLotLNITMSEQ
                          AND CMPNTSEQ = @KitLotCMPNTSEQ
                          AND OVRSERLT = 1
                )
                BEGIN
                    DELETE IV00300
                    WHERE LOTNUMBR IN
                          (
                              SELECT SERLTNUM
                              FROM SOP10201 (NOLOCK)
                              WHERE SOPTYPE = @KitLotSOPTYPE
                                    AND SOPNUMBE = @KitLotSOPNUMBE
                                    AND LNITMSEQ = @KitLotLNITMSEQ
                                    AND CMPNTSEQ = @KitLotCMPNTSEQ
                                    AND OVRSERLT = 1
                          );
                    IF (@@error <> 0)
                    BEGIN
                        SELECT @O_iErrorState = 11863;
                        EXEC @iStatus = taUpdateString @O_iErrorState,
                                                       @oErrString,
                                                       @oErrString OUTPUT,
                                                       @O_oErrorState OUTPUT;
                        BREAK;
                    END;
                    SELECT @LOTOVQTY = 0;
                    SELECT @LOTOVQTY = SUM(SERLTQTY)
                    FROM SOP10201
                    WHERE SOPTYPE = @KitLotSOPTYPE
                          AND SOPNUMBE = @KitLotSOPNUMBE
                          AND LNITMSEQ = @KitLotLNITMSEQ
                          AND CMPNTSEQ = @KitLotCMPNTSEQ
                          AND OVRSERLT = 1;
                    UPDATE IV00102
                    SET QTYONHND = QTYONHND - @LOTOVQTY
                    FROM IV00102 (UPDLOCK)
                    WHERE ITEMNMBR = @KitLotITEMNMBR
                          AND LOCNCODE = @KitSerLOCNCODE;
                    IF (@@error <> 0)
                    BEGIN
                        SELECT @O_iErrorState = 11864;
                        EXEC @iStatus = taUpdateString @O_iErrorState,
                                                       @oErrString,
                                                       @oErrString OUTPUT,
                                                       @O_oErrorState OUTPUT;
                        BREAK;
                    END;
                    UPDATE IV00102
                    SET QTYONHND = QTYONHND - @LOTOVQTY
                    FROM IV00102 (UPDLOCK)
                    WHERE ITEMNMBR = @KitLotITEMNMBR
                          AND LOCNCODE = '';
                    IF (@@error <> 0)
                    BEGIN
                        SELECT @O_iErrorState = 11865;
                        EXEC @iStatus = taUpdateString @O_iErrorState,
                                                       @oErrString,
                                                       @oErrString OUTPUT,
                                                       @O_oErrorState OUTPUT;
                        BREAK;
                    END;
                END;
                FETCH NEXT FROM Kit_Lot
                INTO @KitLotSOPNUMBE,
                     @KitLotSOPTYPE,
                     @KitLotLNITMSEQ,
                     @KitLotCMPNTSEQ,
                     @KitLotITEMNMBR,
                     @KitLotLOCNCODE;
            END;
            CLOSE Kit_Lot;
            DEALLOCATE Kit_Lot;
        END;
    END;
    IF (@I_vDeleteType = 1)
    BEGIN
        DELETE SOP10105
        WHERE SOPTYPE = @I_vSOPTYPE
              AND SOPNUMBE = @I_vSOPNUMBE
              AND LNITMSEQ = @I_vLNITMSEQ;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 420;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        DELETE SOP10202
        WHERE SOPTYPE = @I_vSOPTYPE
              AND SOPNUMBE = @I_vSOPNUMBE
              AND LNITMSEQ = @I_vLNITMSEQ;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 751;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        DELETE SOP10200
        WHERE SOPTYPE = @I_vSOPTYPE
              AND SOPNUMBE = @I_vSOPNUMBE
              AND LNITMSEQ = @I_vLNITMSEQ;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 419;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        IF (@ENABLEMULTIBIN = 1)
        BEGIN
            DELETE SOP10203
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ;
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 5999;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
        END;
        IF (@DeleteType <> 999)
        BEGIN
            DELETE SOP10201
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ;
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 421;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
        END;
    END;
    ELSE
    BEGIN
        DELETE SOP10200
        WHERE SOPTYPE = @I_vSOPTYPE
              AND SOPNUMBE = @I_vSOPNUMBE
              AND LNITMSEQ = @I_vLNITMSEQ
              AND CMPNTSEQ = @I_vCMPNTSEQ;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 3454;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        IF (@ENABLEMULTIBIN = 1)
        BEGIN
            DELETE SOP10203
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ
                  AND CMPNTSEQ = @I_vCMPNTSEQ;
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 3563;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
        END;
        IF (@DeleteType <> 999)
        BEGIN
            DELETE SOP10201
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ
                  AND CMPNTSEQ = @I_vCMPNTSEQ;
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 3455;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
        END;
    END;
    IF (@I_vSOPTYPE IN ( 1, 2, 3, 6 ))
    BEGIN
        IF ((@I_vDeleteType = 2) AND (@CALCKITC = 1) AND (@mylock = 1))
        BEGIN
            SELECT @KITEXTDCOST = ROUND(SUM(EXTDCOST), @FUNDECPLCUR - 1)
            FROM SOP10200 (NOLOCK)
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ
                  AND CMPNTSEQ > 0;
            SELECT @KITQUANTITY = QUANTITY
            FROM SOP10200 (NOLOCK)
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ
                  AND CMPNTSEQ = 0;
            IF (@KITQUANTITY = 0)
            BEGIN
                SELECT @KITUNITCOST = 0;
            END;
            ELSE
            BEGIN
                SELECT @KITUNITCOST = ABS(ISNULL(ROUND(SUM(UNITCOST * QUANTITY) / @KITQUANTITY, @KITITEMFUNCTDEC), 0))
                FROM SOP10200 (NOLOCK)
                WHERE SOPTYPE = @I_vSOPTYPE
                      AND SOPNUMBE = @I_vSOPNUMBE
                      AND LNITMSEQ = @I_vLNITMSEQ
                      AND CMPNTSEQ <> 0;
            END;
            IF (@KITPRICMTHD IN ( 3, 4, 5, 6 ))
            BEGIN
                SELECT @fieldupdate = 1;
                SELECT @KITUOMPRICE = UOMPRICE / 100
                FROM IV00108 (NOLOCK)
                WHERE ITEMNMBR = @KITITEM
                      AND CURNCYID = @FUNLCURR
                      AND PRCLEVEL = @KITPRCLEVEL
                      AND UOFM = @KITUOFM
                      AND FROMQTY <= @KITQUANTITY
                      AND TOQTY >= @KITQUANTITY;
                IF (@KITPRICMTHD = 3)
                BEGIN
                    SELECT @UNITPRCE
                        = ROUND(
                                   ROUND((SUM(b.CURRCOST * a.QUANTITY) / @KITQUANTITY), @KITITEMFUNCTDEC)
                                   * ISNULL(ROUND(1 + @KITUOMPRICE, @KITITEMFUNCTDEC), 0),
                                   @KITITEMFUNCTDEC
                               )
                    FROM SOP10200 a,
                         IV00101 b,
                         IV40202 c
                    WHERE a.ITEMNMBR = b.ITEMNMBR
                          AND a.LNITMSEQ = @I_vLNITMSEQ
                          AND a.SOPTYPE = @I_vSOPTYPE
                          AND a.SOPNUMBE = @I_vSOPNUMBE
                          AND a.CMPNTSEQ > 0
                          AND c.UOMSCHDL = b.UOMSCHDL
                          AND c.UOFM = a.UOFM;
                END;
                ELSE
                BEGIN
                    IF (@KITPRICMTHD = 4)
                    BEGIN
                        SELECT @UNITPRCE
                            = ROUND(
                                       ROUND((SUM(b.STNDCOST * a.QUANTITY) / @KITQUANTITY), @KITITEMFUNCTDEC)
                                       * ISNULL(ROUND(1 + @KITUOMPRICE, @KITITEMFUNCTDEC), 0),
                                       @KITITEMFUNCTDEC
                                   )
                        FROM SOP10200 a,
                             IV00101 b,
                             IV40202 c
                        WHERE a.ITEMNMBR = b.ITEMNMBR
                              AND a.LNITMSEQ = @I_vLNITMSEQ
                              AND a.SOPTYPE = @I_vSOPTYPE
                              AND a.SOPNUMBE = @I_vSOPNUMBE
                              AND a.CMPNTSEQ > 0
                              AND c.UOMSCHDL = b.UOMSCHDL
                              AND c.UOFM = a.UOFM;
                    END;
                    ELSE
                    BEGIN
                        IF (@KITPRICMTHD = 5)
                        BEGIN
                            SELECT @UNITPRCE
                                = ROUND(
                                           ROUND((SUM(b.CURRCOST * a.QUANTITY) / @KITQUANTITY), @KITITEMFUNCTDEC)
                                           / ISNULL(ROUND(1 - @KITUOMPRICE, @KITITEMFUNCTDEC), 0),
                                           @KITITEMFUNCTDEC
                                       )
                            FROM SOP10200 a,
                                 IV00101 b,
                                 IV40202 c
                            WHERE a.ITEMNMBR = b.ITEMNMBR
                                  AND a.LNITMSEQ = @I_vLNITMSEQ
                                  AND a.SOPTYPE = @I_vSOPTYPE
                                  AND a.SOPNUMBE = @I_vSOPNUMBE
                                  AND a.CMPNTSEQ > 0
                                  AND c.UOMSCHDL = b.UOMSCHDL
                                  AND c.UOFM = a.UOFM;
                        END;
                        ELSE
                        BEGIN
                            IF (@KITPRICMTHD = 6)
                            BEGIN
                                SELECT @UNITPRCE
                                    = ROUND(
                                               ROUND((SUM(b.STNDCOST * a.QUANTITY) / @KITQUANTITY), @KITITEMFUNCTDEC)
                                               / ISNULL(ROUND(1 - @KITUOMPRICE, @KITITEMFUNCTDEC), 0),
                                               @KITITEMFUNCTDEC
                                           )
                                FROM SOP10200 a,
                                     IV00101 b,
                                     IV40202 c
                                WHERE a.ITEMNMBR = b.ITEMNMBR
                                      AND a.LNITMSEQ = @I_vLNITMSEQ
                                      AND a.SOPTYPE = @I_vSOPTYPE
                                      AND a.SOPNUMBE = @I_vSOPNUMBE
                                      AND a.CMPNTSEQ > 0
                                      AND c.UOMSCHDL = b.UOMSCHDL
                                      AND c.UOFM = a.UOFM;
                            END;
                        END;
                    END;
                    IF (@UNITPRCE IS NULL)
                    BEGIN
                        SELECT @UNITPRCE = 0;
                    END;
                END;
                IF (@ISMCTRX = 1)
                BEGIN
                    IF (@RTCLCMTD = 0)
                    BEGIN
                        SELECT @USEUNITPRCE
                            = ROUND(ROUND(@UNITPRCE / @XCHGRATE, (@ODECPLCU - 1)) * @XCHGRATE, (@DECPLCUR - 1));
                    END;
                    ELSE
                    BEGIN
                        SELECT @USEUNITPRCE
                            = ROUND(ROUND(@UNITPRCE * @XCHGRATE, (@ODECPLCU - 1)) / @XCHGRATE, (@DECPLCUR - 1));
                    END;
                END;
                SELECT @KITXTNDPRCE = ISNULL(ROUND(QUANTITY * (@USEUNITPRCE - MRKDNAMT), @FUNDECPLCUR), 0)
                FROM SOP10200 (NOLOCK)
                WHERE SOPTYPE = @I_vSOPTYPE
                      AND SOPNUMBE = @I_vSOPNUMBE
                      AND LNITMSEQ = @I_vLNITMSEQ
                      AND CMPNTSEQ = 0;
                SELECT @XTNDPRCECHG = @XTNDPRCEExst - @KITXTNDPRCE,
                       @stoprecalc = 1;
                UPDATE RM00103
                SET ONORDAMT = ONORDAMT - @XTNDPRCECHG
                FROM RM00103 (UPDLOCK)
                WHERE CUSTNMBR = @CUSTNMBR;
                IF (@@error <> 0)
                BEGIN
                    SELECT @O_iErrorState = 3447;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            SELECT @XTNDPRCE = ISNULL(ROUND(QUANTITY * (@USEUNITPRCE - MRKDNAMT), @FUNDECPLCUR), 0)
            FROM SOP10200 (NOLOCK)
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ
                  AND CMPNTSEQ = 0;
            UPDATE SOP10200
            SET UNITCOST = CASE
                               WHEN @fieldupdate = 1 THEN
                                   @KITUNITCOST
                               ELSE
                                   0
                           END,
                ORUNTCST = CASE
                               WHEN @fieldupdate = 1
                                    AND @ISMCTRX = 1 THEN
                                   0
                               ELSE
                                   @KITUNITCOST
                           END,
                EXTDCOST = CASE
                               WHEN @fieldupdate = 1 THEN
                                   @KITEXTDCOST
                               ELSE
                                   0
                           END,
                OREXTCST = CASE
                               WHEN @fieldupdate = 1
                                    AND @ISMCTRX = 1 THEN
                                   0
                               ELSE
                                   @KITEXTDCOST
                           END,
                UNITPRCE = CASE
                               WHEN @fieldupdate = 1 THEN
                                   @UNITPRCE
                               ELSE
                                   UNITPRCE
                           END,
                ORUNTPRC = CASE
                               WHEN @fieldupdate = 1
                                    AND @ISMCTRX = 1 THEN
                                   0
                               ELSE
                                   ORUNTPRC
                           END,
                XTNDPRCE = CASE
                               WHEN @fieldupdate = 1 THEN
                                   @XTNDPRCE
                               ELSE
                                   XTNDPRCE
                           END,
                OXTNDPRC = CASE
                               WHEN @fieldupdate = 1
                                    AND @ISMCTRX = 1 THEN
                                   0
                               ELSE
                                   OXTNDPRC
                           END,
                REMPRICE = CASE
                               WHEN @fieldupdate = 1 THEN
                                   @XTNDPRCE
                               ELSE
                                   REMPRICE
                           END,
                OREPRICE = CASE
                               WHEN @fieldupdate = 1 THEN
                                   @XTNDPRCE
                               ELSE
                                   OREPRICE
                           END
            WHERE SOPTYPE = @I_vSOPTYPE
                  AND SOPNUMBE = @I_vSOPNUMBE
                  AND LNITMSEQ = @I_vLNITMSEQ
                  AND CMPNTSEQ = 0;
            IF (@@error <> 0)
            BEGIN
                SELECT @O_iErrorState = 3450;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrString,
                                               @oErrString OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
        END;
    END;
    IF (@mylock = 1)
    BEGIN
        SELECT @ORTDISAM = ORTDISAM,
               @TRDISPCT = TRDISPCT,
               @PYMTRMID = PYMTRMID,
               @DUEDATE = DUEDATE,
               @DISCDATE = DISCDATE,
               @DSCPCTAM = DSCPCTAM / 100,
               @CHGAMNT = SUBTOTAL,
               @PRSTADCD = PRSTADCD,
               @ADDRESS1 = ADDRESS1,
               @ADDRESS2 = ADDRESS2,
               @ADDRESS3 = ADDRESS3,
               @CNTCPRSN = CNTCPRSN,
               @FAXNUMBR = FAXNUMBR,
               @CITY = CITY,
               @STATE = STATE,
               @ZIPCODE = ZIPCODE,
               @COUNTRY = COUNTRY,
               @PHNUMBR1 = PHNUMBR1,
               @PHNUMBR2 = PHNUMBR2,
               @PHNUMBR3 = PHONE3,
               @SHIPMTHD = SHIPMTHD
        FROM SOP10100 (NOLOCK)
        WHERE SOPTYPE = @I_vSOPTYPE
              AND SOPNUMBE = @I_vSOPNUMBE;
        IF (@TRDISPCT > 0)
        BEGIN
            SELECT @TRDISPCT = @TRDISPCT / 100.00,
                   @ORTDISAM = NULL;
        END;
        IF (@TRDISPCT = 0)
        BEGIN
            SELECT @ORTDISAM = @ORTDISAM,
                   @TRDISPCT = NULL;
        END;
        UPDATE SOP10100
        SET Flags = Flags | 8
        WHERE SOPTYPE = @I_vSOPTYPE
              AND SOPNUMBE = @I_vSOPNUMBE;
        IF (@@error <> 0)
        BEGIN
            SELECT @O_iErrorState = 5340;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
        EXEC @iStatus = taSopHdrRecalc @I_vSOPTYPE = @I_vSOPTYPE,
                                       @I_vSOPNUMBE = @I_vSOPNUMBE,
                                       @I_vSHIPMTHD = @SHIPMTHD,
                                       @I_vPYMTRMID = @PYMTRMID,
                                       @I_vPRSTADCD = @PRSTADCD,
                                       @I_vADDRESS1 = @ADDRESS1,
                                       @I_vADDRESS2 = @ADDRESS2,
                                       @I_vADDRESS3 = @ADDRESS3,
                                       @I_vCNTCPRSN = @CNTCPRSN,
                                       @I_vFAXNUMBR = @FAXNUMBR,
                                       @I_vCITY = @CITY,
                                       @I_vSTATE = @STATE,
                                       @I_vZIPCODE = @ZIPCODE,
                                       @I_vCOUNTRY = @COUNTRY,
                                       @I_vPHNUMBR1 = @PHNUMBR1,
                                       @I_vPHNUMBR2 = @PHNUMBR2,
                                       @I_vPHNUMBR3 = @PHNUMBR3,
                                       @I_vDUEDATE = @DUEDATE,
                                       @I_vDISCDATE = @DISCDATE,
                                       @I_vTRDISAMT = @ORTDISAM,
                                       @I_vTRADEPCT = @TRDISPCT,
                                       @I_vRECREATEDIST = @I_vRecreateDist,
                                       @I_vRECREATECOMM = 1,
                                       @I_vRECREATETAXES = 1,
                                       @I_vRECALCBTCHTOT = @stoprecalc,
                                       @I_vDSCPCTAM = @DSCPCTAM,
                                       @I_vCHGAMNT = @CHGAMNT,
                                       @O_iErrorState = @taSopHdrRecalcErrState OUTPUT,
                                       @oErrString = @taSopHdrRecalcErrString OUTPUT;
        SELECT @iError = @@error;
        IF ((@iStatus <> 0) OR (@taSopHdrRecalcErrState <> 0) OR (@iError <> 0))
        BEGIN
            SELECT @oErrString = RTRIM(@oErrString) + ' ' + @taSopHdrRecalcErrString;
            SELECT @O_iErrorState = 2263;
            EXEC @iStatus = taUpdateString @O_iErrorState,
                                           @oErrString,
                                           @oErrString OUTPUT,
                                           @O_oErrorState OUTPUT;
            BREAK;
        END;
    END;
    BREAK;
END;
IF (@mylock = 1)
BEGIN
    EXEC @iStatus = DYNAMICS..taDEXLOCKS @I_vOperation = 3,
                                         @I_vtable_path_name = @SOPHdrTbl,
                                         @I_vrow_id = @DexRowID,
                                         @O_oExists = @oExists OUTPUT,
                                         @O_oInsertStatus = @OInsStatus OUTPUT,
                                         @O_iErrorState = @DexLockErrorState OUTPUT;
    SELECT @iError = @@error;
    IF ((@iStatus <> 0) OR (@DexLockErrorState <> 0) OR (@iError <> 0))
    BEGIN
        IF (@DexLockErrorState <> 0)
        BEGIN
            SELECT @oErrString = RTRIM(@oErrString) + ' ' + @DexLockErrorState;
        END;
        SELECT @O_iErrorState = 2223;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
        RETURN (@O_iErrorState);
    END;
END;
EXEC @iStatus = taSopLineDeletePost @I_vSOPTYPE,
                                    @I_vSOPNUMBE,
                                    @I_vLNITMSEQ,
                                    @I_vITEMNMBR,
                                    @I_vRequesterTrx,
                                    @I_vRecreateDist,
                                    @I_vCMPNTSEQ,
                                    @I_vDeleteType,
                                    @I_vUSRDEFND1,
                                    @I_vUSRDEFND2,
                                    @I_vUSRDEFND3,
                                    @I_vUSRDEFND4,
                                    @I_vUSRDEFND5,
                                    @O_iErrorState = @taSopLineDeletePostErrState OUTPUT,
                                    @oErrString = @taSopLineDeletePostErrString OUTPUT;
SELECT @iError = @@error;
IF (
       (@iStatus <> 0)
       OR (@taSopLineDeletePostErrState <> 0)
       OR (@iError <> 0)
   )
BEGIN
    SELECT @oErrString = RTRIM(@oErrString) + ' ' + @taSopLineDeletePostErrString;
    SELECT @O_iErrorState = 785;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
    RETURN (@O_iErrorState);
END;
IF (@I_vRequesterTrx = 0)
BEGIN
    EXEC @iStatus = eConnectOutVerify @I_vDOCTYPE = 'Sales_Transaction',
                                      @I_vINDEX1 = @I_vSOPNUMBE,
                                      @I_vINDEX2 = @I_vSOPTYPE,
                                      @I_vINDEX3 = '',
                                      @I_vINDEX4 = '',
                                      @I_vINDEX5 = '',
                                      @I_vINDEX6 = '',
                                      @I_vINDEX7 = '',
                                      @I_vINDEX8 = '',
                                      @I_vINDEX9 = '',
                                      @I_vINDEX10 = '',
                                      @I_vINDEX11 = '',
                                      @I_vINDEX12 = '',
                                      @I_vINDEX13 = '',
                                      @I_vINDEX14 = '',
                                      @I_vINDEX15 = '',
                                      @I_vDelete = 1,
                                      @O_iErrorState = @iCustomState OUTPUT;
    SELECT @iError = @@error;
    IF ((@iStatus <> 0) OR (@iCustomState <> 0) OR (@iError <> 0))
    BEGIN
        SELECT @oErrString = RTRIM(@oErrString) + ' ' + @iCustomState;
        SELECT @O_iErrorState = 2783;
        EXEC @iStatus = taUpdateString @O_iErrorState,
                                       @oErrString,
                                       @oErrString OUTPUT,
                                       @O_oErrorState OUTPUT;
        RETURN (@O_iErrorState);
    END;
END;
RETURN (@O_iErrorState);

RealWorldCode gives developers practical, real‑world solutions with clean, working code — no fluff, no theory, just answers.
Links
Home
Knowledge Areas
Sitemap
Contact
Et cetera
Privacy Policy
Terms and Conditions
Cookie Preferences