SET TERM ^ ;

CREATE OR ALTER trigger ttboc_item_saldo_b0u_02 for tboc_item_saldo
active before update position 0
AS
DECLARE VARIABLE OC INTEGER;
DECLARE VARIABLE PRODUTO VARCHAR(110);
DECLARE VARIABLE TOL     Numeric(10,2); DECLARE VARIABLE SALDO   Numeric(15,5);
DECLARE VARIABLE SALDO01 Numeric(15,5); DECLARE VARIABLE SALDO02 Numeric(15,5);
DECLARE VARIABLE SALDO03 Numeric(15,5); DECLARE VARIABLE SALDO04 Numeric(15,5);
DECLARE VARIABLE SALDO05 Numeric(15,5); DECLARE VARIABLE SALDO06 Numeric(15,5);
DECLARE VARIABLE SALDO07 Numeric(15,5); DECLARE VARIABLE SALDO08 Numeric(15,5);
DECLARE VARIABLE SALDO09 Numeric(15,5); DECLARE VARIABLE SALDO10 Numeric(15,5);
DECLARE VARIABLE SALDO11 Numeric(15,5); DECLARE VARIABLE SALDO12 Numeric(15,5);
DECLARE VARIABLE SALDO13 Numeric(15,5); DECLARE VARIABLE SALDO14 Numeric(15,5);
DECLARE VARIABLE SALDO15 Numeric(15,5); DECLARE VARIABLE SALDO16 Numeric(15,5);
DECLARE VARIABLE SALDO17 Numeric(15,5); DECLARE VARIABLE SALDO18 Numeric(15,5);
DECLARE VARIABLE SALDO19 Numeric(15,5); DECLARE VARIABLE SALDO20 Numeric(15,5);

DECLARE VARIABLE T01 VARCHAR(10);
DECLARE VARIABLE T02 VARCHAR(10);
DECLARE VARIABLE T03 VARCHAR(10);
DECLARE VARIABLE T04 VARCHAR(10);
DECLARE VARIABLE T05 VARCHAR(10);
DECLARE VARIABLE T06 VARCHAR(10);
DECLARE VARIABLE T07 VARCHAR(10);
DECLARE VARIABLE T08 VARCHAR(10);
DECLARE VARIABLE T09 VARCHAR(10);
DECLARE VARIABLE T10 VARCHAR(10);
DECLARE VARIABLE T11 VARCHAR(10);
DECLARE VARIABLE T12 VARCHAR(10);
DECLARE VARIABLE T13 VARCHAR(10);
DECLARE VARIABLE T14 VARCHAR(10);
DECLARE VARIABLE T15 VARCHAR(10);
DECLARE VARIABLE T16 VARCHAR(10);
DECLARE VARIABLE T17 VARCHAR(10);
DECLARE VARIABLE T18 VARCHAR(10);
DECLARE VARIABLE T19 VARCHAR(10);
DECLARE VARIABLE T20 VARCHAR(10);
Begin

  if (NEW.QUANTIDADE < OLD.QUANTIDADE or
      NEW.T01 < OLD.T01 or NEW.T02 < OLD.T02 or
      NEW.T03 < OLD.T03 or NEW.T04 < OLD.T04 or
      NEW.T05 < OLD.T05 or NEW.T06 < OLD.T06 or
      NEW.T07 < OLD.T07 or NEW.T08 < OLD.T08 or
      NEW.T09 < OLD.T09 or NEW.T10 < OLD.T10 or
      NEW.T11 < OLD.T11 or NEW.T12 < OLD.T12 or
      NEW.T13 < OLD.T13 or NEW.T14 < OLD.T14 or
      NEW.T15 < OLD.T15 or NEW.T16 < OLD.T16 or
      NEW.T17 < OLD.T17 or NEW.T18 < OLD.T18 or
      NEW.T19 < OLD.T19 or NEW.T20 < OLD.T20) Then
      Begin

        For
        SELECT
            O.OC,
            O.PRODUTO_CODIGO||'-'||P.DESCRICAO,
            IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA),
        
            CAST((CAST(O.QUANTIDADE AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),CAST(P.TOLERANCIA AS DOUBLE PRECISION))/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T01 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T02 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T03 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T04 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T05 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T06 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T07 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T08 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T09 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T10 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T11 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T12 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T13 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T14 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T15 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T16 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T17 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T18 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T19 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
            CAST((CAST(O.T20 AS DOUBLE PRECISION)*(CAST((IIF(COALESCE(P.TOLERANCIA,-2)=-2,COALESCE(F.TOLERANCIA,0),P.TOLERANCIA)/100) AS NUMERIC(10,5)))) AS NUMERIC(15,5)),
             G.T01,G.T02,G.T03,G.T04,G.T05,
             G.T06,G.T07,G.T08,G.T09,G.T10,
             G.T11,G.T12,G.T13,G.T14,G.T15,
             G.T16,G.T17,G.T18,G.T19,G.T20

        FROM TBOC_ITEM O, TBFAMILIA F, TBPRODUTO P LEFT JOIN TBGRADE G ON G.CODIGO = P.GRADE_CODIGO
        
        WHERE O.OC = NEW.OC
          AND O.CONTROLE = old.OC_ITEM_CONTROLE
          AND O.PRODUTO_CODIGO = P.CODIGO
          AND P.FAMILIA_CODIGO = F.CODIGO
        
        Into :OC,:PRODUTO,:TOL,:SALDO,
             :SALDO01,:SALDO02,:SALDO03,:SALDO04,
             :SALDO05,:SALDO06,:SALDO07,:SALDO08,
             :SALDO09,:SALDO10,:SALDO11,:SALDO12,
             :SALDO13,:SALDO14,:SALDO15,:SALDO16,
             :SALDO17,:SALDO18,:SALDO19,:SALDO20,
             :T01,:T02,:T03,:T04,:T05,
             :T06,:T07,:T08,:T09,:T10,
             :T11,:T12,:T13,:T14,:T15,
             :T16,:T17,:T18,:T19,:T20

        Do
        begin
        
          if (:TOL >= 0) Then
              Begin
        
              if (NEW.QUANTIDADE < :SALDO*-1 or (OLD.QUANTIDADE < 0 AND OLD.QUANTIDADE IS DISTINCT FROM NEW.QUANTIDADE)) then
                                                              Exception  "..." 'SALDO DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.QUANTIDADE||'    TOLERANCIA: '||:TOL||'%    OC: '     ||:OC||'  PROD.: '||:PRODUTO;
        
              if (NEW.T01 < :SALDO01*-1 or (OLD.T01 < 0 AND OLD.T01 IS DISTINCT FROM NEW.T01)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T01||'    TOLERANCIA: '||:TOL||'%   '||:T01||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T02 < :SALDO02*-1 or (OLD.T02 < 0 AND OLD.T02 IS DISTINCT FROM NEW.T02)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T02||'    TOLERANCIA: '||:TOL||'%   '||:T02||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T03 < :SALDO03*-1 or (OLD.T03 < 0 AND OLD.T03 IS DISTINCT FROM NEW.T03)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T03||'    TOLERANCIA: '||:TOL||'%   '||:T03||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T04 < :SALDO04*-1 or (OLD.T04 < 0 AND OLD.T04 IS DISTINCT FROM NEW.T04)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T04||'    TOLERANCIA: '||:TOL||'%   '||:T04||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T05 < :SALDO05*-1 or (OLD.T05 < 0 AND OLD.T05 IS DISTINCT FROM NEW.T05)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T05||'    TOLERANCIA: '||:TOL||'%   '||:T05||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T06 < :SALDO06*-1 or (OLD.T06 < 0 AND OLD.T06 IS DISTINCT FROM NEW.T06)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T06||'    TOLERANCIA: '||:TOL||'%   '||:T06||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T07 < :SALDO07*-1 or (OLD.T07 < 0 AND OLD.T07 IS DISTINCT FROM NEW.T07)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T07||'    TOLERANCIA: '||:TOL||'%   '||:T07||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T08 < :SALDO08*-1 or (OLD.T08 < 0 AND OLD.T08 IS DISTINCT FROM NEW.T08)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T08||'    TOLERANCIA: '||:TOL||'%   '||:T08||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T09 < :SALDO09*-1 or (OLD.T09 < 0 AND OLD.T09 IS DISTINCT FROM NEW.T09)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T09||'    TOLERANCIA: '||:TOL||'%   '||:T09||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T10 < :SALDO10*-1 or (OLD.T10 < 0 AND OLD.T10 IS DISTINCT FROM NEW.T10)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T10||'    TOLERANCIA: '||:TOL||'%   '||:T10||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T11 < :SALDO11*-1 or (OLD.T11 < 0 AND OLD.T11 IS DISTINCT FROM NEW.T11)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T11||'    TOLERANCIA: '||:TOL||'%   '||:T11||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T12 < :SALDO12*-1 or (OLD.T12 < 0 AND OLD.T12 IS DISTINCT FROM NEW.T12)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T12||'    TOLERANCIA: '||:TOL||'%   '||:T12||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T13 < :SALDO13*-1 or (OLD.T13 < 0 AND OLD.T13 IS DISTINCT FROM NEW.T13)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T13||'    TOLERANCIA: '||:TOL||'%   '||:T13||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T14 < :SALDO14*-1 or (OLD.T14 < 0 AND OLD.T14 IS DISTINCT FROM NEW.T14)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T14||'    TOLERANCIA: '||:TOL||'%   '||:T14||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T15 < :SALDO15*-1 or (OLD.T15 < 0 AND OLD.T15 IS DISTINCT FROM NEW.T15)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T15||'    TOLERANCIA: '||:TOL||'%   '||:T15||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T16 < :SALDO16*-1 or (OLD.T16 < 0 AND OLD.T16 IS DISTINCT FROM NEW.T16)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T16||'    TOLERANCIA: '||:TOL||'%   '||:T16||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T17 < :SALDO17*-1 or (OLD.T17 < 0 AND OLD.T17 IS DISTINCT FROM NEW.T17)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T17||'    TOLERANCIA: '||:TOL||'%   '||:T17||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T18 < :SALDO18*-1 or (OLD.T18 < 0 AND OLD.T18 IS DISTINCT FROM NEW.T18)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T18||'    TOLERANCIA: '||:TOL||'%   '||:T18||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T19 < :SALDO19*-1 or (OLD.T19 < 0 AND OLD.T19 IS DISTINCT FROM NEW.T19)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T19||'    TOLERANCIA: '||:TOL||'%   '||:T19||' OC: '||:OC||'  PROD.: '||:PRODUTO;
              if (NEW.T20 < :SALDO20*-1 or (OLD.T20 < 0 AND OLD.T20 IS DISTINCT FROM NEW.T20)) then  Exception  "..." 'SALDO NA GRADE DO ITEM NA OC ABAIXO DO DISPONIVEL+TOLERANCIA. QUANTIDADE DISPONIVEL: '||OLD.T20||'    TOLERANCIA: '||:TOL||'%   '||:T20||' OC: '||:OC||'  PROD.: '||:PRODUTO;

             End
        
        End

end

End
^

SET TERM ; ^

