SET TERM ^ ;

CREATE OR ALTER trigger ttboc_item_b01ud for tboc_item
active before update or delete position 0
AS
DECLARE VARIABLE QUANTIDADE NUMERIC(15,4);
DECLARE VARIABLE SALDO NUMERIC(15,4);
BEGIN

    IF (UPDATING) THEN
    BEGIN

        IF (OLD.SITUACAO = 2 AND NEW.SITUACAO = 3) THEN
        BEGIN
            EXCEPTION "..." 'ITEM: '||FN_LPAD(OLD.SEQUENCIA, 3, '0')||' DA OC '||IIF(OLD.SITUACAO = 2, 'FECHADO', IIF(OLD.SITUACAO = 3, 'ENCERRADO', ''))||'. <br> ALTERACAO DA SITUACAO NAO AUTORIZADA!';
        END

--        IF (OLD.SITUACAO = 3 AND NEW.SITUACAO = 2) THEN
--        BEGIN
--            EXCEPTION "..." 'ITEM: '||FN_LPAD(OLD.SEQUENCIA, 3, '0')||' DA OC '||IIF(OLD.SITUACAO = 2, 'FECHADO', IIF(OLD.SITUACAO = 3, 'ENCERRADO', ''))||'. <BR> ALTERACAO DA SITUACAO NAO AUTORIZADA!';
--        END

    END

    IF (DELETING) THEN
    BEGIN

        :QUANTIDADE = CAST(OLD.QUANTIDADE AS NUMERIC(15,4));
        :SALDO      = COALESCE((SELECT FIRST 1 IIF(OLD.SITUACAO = 1 OR :QUANTIDADE = A.QUANTIDADE, CAST(A.QUANTIDADE AS NUMERIC(15,4)), IIF(A.QUANTIDADE = 0, A.QUANTIDADE, CAST((:QUANTIDADE - A.QUANTIDADE) AS NUMERIC(15,4)))) FROM TBOC_ITEM_SALDO A WHERE A.OC_ITEM_CONTROLE = OLD.CONTROLE), 0);

        IF ( (OLD.SITUACAO = 2) OR (OLD.SITUACAO = 3) ) THEN
        BEGIN
            EXCEPTION "..." 'ITEM: '||FN_LPAD(OLD.SEQUENCIA, 3, '0')||' DA OC '||IIF(OLD.SITUACAO = 2, 'FECHADO', IIF(OLD.SITUACAO = 3, 'ENCERRADO', ''))||'. <BR> EXCLUSAO CANCELADA!';
        END

        IF (:SALDO <> OLD.QUANTIDADE) THEN
        BEGIN
            EXCEPTION "..." 'ITEM: '||FN_LPAD(OLD.SEQUENCIA, 3, '0')||' COM RECEBIMENTOS. <BR> EXCLUSAO CANCELADA!';
        END

    END

END
^

SET TERM ; ^