CREATE OR ALTER TRIGGER TTBGRUPO_PRODUTO_B02U FOR TBGRUPO_PRODUTO
ACTIVE BEFORE UPDATE POSITION 3
AS
DECLARE VARIABLE PRODUTO_ID INTEGER;
--DECLARE VARIABLE HISTORICO VARCHAR(5000);
--DECLARE VARIABLE HISTORICO2 VARCHAR(5000);
BEGIN

  --  :HISTORICO = '';

    /* ALTERA OS PRODUTOS VINCULADOS AO GRUPO */
    IF (OLD.FAMILIA_ID <> NEW.FAMILIA_ID) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.FAMILIA_CODIGO = NEW.FAMILIA_ID,
                P.FAMILIA_ALTERNATIVA = NEW.FAMILIA_ID
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' FAM:'||OLD.FAMILIA_ID||'->'||NEW.FAMILIA_ID;
    END

    IF (OLD.DESCRICAO <> NEW.DESCRICAO) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.DESCRICAO = NEW.DESCRICAO||' '||COALESCE((SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = P.COR_CODIGO),'') 
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;
        -- :HISTORICO = :HISTORICO||' DESC:'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
    END

    IF (OLD.TIPOPRODUTO_ID <> NEW.TIPOPRODUTO_ID) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.TIPOPRODUTO_CODIGO = NEW.TIPOPRODUTO_ID
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' TIPO DE PRODUTO:'||OLD.TIPOPRODUTO_ID||'->'||NEW.TIPOPRODUTO_ID;
    END

    IF (OLD.LOCALIZACAO_ID <> NEW.LOCALIZACAO_ID) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.LOCALIZACAO_CODIGO = NEW.LOCALIZACAO_ID
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

      --  :HISTORICO = :HISTORICO||' LOCALIZACAO:'||OLD.LOCALIZACAO_ID||'->'||NEW.LOCALIZACAO_ID;
    END

    IF (OLD.GRADE_ID <> NEW.GRADE_ID) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.GRADE_CODIGO = NEW.GRADE_ID
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' GRADE:'||OLD.GRADE_ID||'->'||NEW.GRADE_ID;
    END

    IF (OLD.UNIDADEMEDIDA_SIGLA <> NEW.UNIDADEMEDIDA_SIGLA) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.UNIDADEMEDIDA_SIGLA = NEW.UNIDADEMEDIDA_SIGLA
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' UM:'||OLD.UNIDADEMEDIDA_SIGLA||'->'||NEW.UNIDADEMEDIDA_SIGLA;
    END

    IF (OLD.NCM_CODIGO <> NEW.NCM_CODIGO) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.NCM_CODIGO = NEW.NCM_CODIGO
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

      --  :HISTORICO = :HISTORICO||' NCM:'||OLD.NCM_CODIGO||'->'||NEW.NCM_CODIGO;
    END

    IF (OLD.HABILITA_COMPRA <> NEW.HABILITA_COMPRA) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.HABILITA_COMPRA = NEW.HABILITA_COMPRA
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

      --  :HISTORICO = :HISTORICO||' HAB. COMPRA:'||OLD.HABILITA_COMPRA||'->'||NEW.HABILITA_COMPRA;
    END

    IF (OLD.HABILITA_VENDA <> NEW.HABILITA_VENDA) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.HABILITA_VENDA = NEW.HABILITA_VENDA
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' HAB.VENDA:'||OLD.HABILITA_VENDA||'->'||NEW.HABILITA_VENDA;
    END

    IF (OLD.TOLERANCIA <> NEW.TOLERANCIA) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.TOLERANCIA = NEW.TOLERANCIA
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

     --   :HISTORICO = :HISTORICO||' % TOLERANCIA:'||FN_FORMAT_NUMBER2(OLD.TOLERANCIA, 2)||'%'||'->'||FN_FORMAT_NUMBER2(NEW.TOLERANCIA, 2)||'%';
    END

    IF (OLD.SEGURANCA <> NEW.SEGURANCA) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.SEGURANCA = NEW.SEGURANCA
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

      --  :HISTORICO = :HISTORICO||'% SEGURANCA:'||FN_FORMAT_NUMBER2(OLD.SEGURANCA, 4)||'%'||'->'||FN_FORMAT_NUMBER2(NEW.SEGURANCA, 4)||'%';
    END

    IF (OLD.DESCRICAO_ETIQUETA <> NEW.DESCRICAO_ETIQUETA) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.DESCRICAO_ETIQUETA = NEW.DESCRICAO_ETIQUETA
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

      --  :HISTORICO = :HISTORICO||' DESC. ETIQUETA:'||OLD.DESCRICAO_ETIQUETA||'->'||NEW.DESCRICAO_ETIQUETA;
    END

    IF (OLD.INVENTARIO <> NEW.INVENTARIO) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.INVENTARIO = NEW.INVENTARIO
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' INVENTARIO:'||OLD.INVENTARIO||'->'||NEW.INVENTARIO;
    END

    IF (OLD.PROGRAMAR_SEM_ESTOQUE <> NEW.PROGRAMAR_SEM_ESTOQUE) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.PROGRAMAR_SEM_ESTOQUE = NEW.PROGRAMAR_SEM_ESTOQUE
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

     --   :HISTORICO = :HISTORICO||' PROG. SEM ESTOQUE:'||OLD.PROGRAMAR_SEM_ESTOQUE||'->'||NEW.PROGRAMAR_SEM_ESTOQUE;
    END

    IF (OLD.GERAR_OC <> NEW.GERAR_OC) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.GERAR_OC = NEW.GERAR_OC
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

       -- :HISTORICO = :HISTORICO||' GERAR OC:'||OLD.GERAR_OC||'->'||NEW.GERAR_OC;
    END

    IF (OLD.FEEF <>  NEW.FEEF) THEN
    BEGIN
        UPDATE TBPRODUTO P
            SET P.FEEF = NEW.FEEF
            WHERE P.GRUPO_PRODUTO_ID = OLD.ID;

      --  :HISTORICO = :HISTORICO||' FEEF:'||OLD.FEEF||'->'||NEW.FEEF;
    END


   -- :HISTORICO = 'PRODUTO ALTERADO VIA VINCULO COM GRUPO DE PRODUTO. GRUPO DE PRODUTO: '||FN_LPAD(OLD.ID, 6, '0')||' - '||NEW.DESCRICAO||:HISTORICO;

    /* Verifica os produtos vinculados ao grupo */
    FOR
        SELECT
            P.CODIGO
        FROM TBPRODUTO P
        WHERE P.GRUPO_PRODUTO_ID = OLD.ID
    INTO
        :PRODUTO_ID
    DO
    BEGIN
        
       -- :HISTORICO2 = '';

        IF (OLD.CUSTOUNITARIO_MEDIO <> NEW.CUSTOUNITARIO_MEDIO) THEN
        BEGIN
            UPDATE TBPRODUTO_CONTABIL C
                SET C.CUSTOUNITARIO_MEDIO = NEW.CUSTOUNITARIO_MEDIO
                WHERE C.PRODUTO_CODIGO = :PRODUTO_ID;
    
        --    :HISTORICO2 = :HISTORICO2||' CUSTO MEDIO:'||FN_FORMAT_NUMBER2(OLD.CUSTOUNITARIO_MEDIO, 5)||'->'||FN_FORMAT_NUMBER2(NEW.CUSTOUNITARIO_MEDIO, 5);
        END

        /*********************************************************************************/

        IF (OLD.CUBAGEM_ALTURA <> NEW.CUBAGEM_ALTURA) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.CUBAGEM_ALTURA = NEW.CUBAGEM_ALTURA
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
          --  :HISTORICO2 = :HISTORICO2||' CUBAGEM ALTURA:'||FN_FORMAT_NUMBER2(OLD.CUBAGEM_ALTURA, 4)||'mm'||'->'||FN_FORMAT_NUMBER2(NEW.CUBAGEM_ALTURA, 4)||'mm';
        END
    
        IF (OLD.CUBAGEM_LARGURA <> NEW.CUBAGEM_LARGURA) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.CUBAGEM_LARGURA = NEW.CUBAGEM_LARGURA
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
          --  :HISTORICO2 = :HISTORICO2||' CUBAGEM LARGURA:'||FN_FORMAT_NUMBER2(OLD.CUBAGEM_LARGURA, 4)||'MM'||'->'||FN_FORMAT_NUMBER2(NEW.CUBAGEM_LARGURA, 4)||'MM';
        END
    
        IF (OLD.CUBAGEM_COMPRIMENTO <> NEW.CUBAGEM_COMPRIMENTO) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.CUBAGEM_COMPRIMENTO = NEW.CUBAGEM_COMPRIMENTO
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
         --   :HISTORICO2 = :HISTORICO2||' CUBAGEM COMPRIMENTO:'||FN_FORMAT_NUMBER2(OLD.CUBAGEM_COMPRIMENTO, 4)||'MM'||'->'||FN_FORMAT_NUMBER2(NEW.CUBAGEM_COMPRIMENTO, 4)||'MM';
        END
    
        IF (OLD.CONTROLE_BENEFICIAMENTO <> NEW.CONTROLE_BENEFICIAMENTO) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.CONTROLE_BENEFICIAMENTO = NEW.CONTROLE_BENEFICIAMENTO
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
          --  :HISTORICO2 = :HISTORICO2||' BENEFICIAMENTO:'||OLD.CONTROLE_BENEFICIAMENTO||'->'||NEW.CONTROLE_BENEFICIAMENTO;
        END

        IF (OLD.RENDIMENTO <> NEW.RENDIMENTO) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.RENDIMENTO = NEW.RENDIMENTO
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
          --  :HISTORICO2 = :HISTORICO2||' RENDIMENTO:'||FN_FORMAT_NUMBER2(OLD.RENDIMENTO, 4)||'->'||FN_FORMAT_NUMBER2(NEW.RENDIMENTO, 4);
        END
    
        IF (OLD.LARGURA <> NEW.LARGURA) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.LARGURA = NEW.LARGURA
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
           -- :HISTORICO2 = :HISTORICO2||' LARGURA:'||FN_FORMAT_NUMBER2(OLD.LARGURA, 4)||'->'||FN_FORMAT_NUMBER2(NEW.LARGURA, 4);
        END
        
        IF (OLD.COMPOSICAO <> NEW.COMPOSICAO) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.COMPOSICAO = NEW.COMPOSICAO
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
           -- :HISTORICO2 = :HISTORICO2||' COMPOSICAO:'||OLD.COMPOSICAO||'->'||NEW.COMPOSICAO;
        END

        IF (OLD.PESOLIQUIDO <> NEW.PESOLIQUIDO) THEN
        BEGIN
            UPDATE TBPRODUTO_FICHA F
                SET F.PESOLIQUIDO = NEW.PESOLIQUIDO
                WHERE F.PRODUTO_CODIGO = :PRODUTO_ID;
    
          --  :HISTORICO2 = :HISTORICO2||' PESO:'||FN_FORMAT_NUMBER2(OLD.PESOLIQUIDO, 5)||'g'||'->'||FN_FORMAT_NUMBER2(NEW.PESOLIQUIDO, 5)||'g';
        END


        /* SALVA UM HISTORICO NAS TABELAS QUE CONTEM PRODUTOS VINCULADOS AO GRUPO. OBS.: O HISTORICO DOS VALORES QUE FORAM ALTERADOS É PELAS PROPRIAS TRIGGERS DAS TABELAS */
      --  :HISTORICO2 = 'PRODUTO ALTERADO VIA VINCULO COM GRUPO DE PRODUTO. GRUPO DE PRODUTO: '||FN_LPAD(OLD.ID, 6, '0')||' - '||NEW.DESCRICAO||:HISTORICO2;

     --   EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO', :PRODUTO_ID, FN_ELIPSE(:HISTORICO, 500));
     --   EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO', :PRODUTO_ID, FN_ELIPSE(:HISTORICO2, 500));
     --   EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_CONTABIL', :PRODUTO_ID, FN_ELIPSE(:HISTORICO2, 500));
     --   EXECUTE PROCEDURE SPI_HISTORICO('TBPRODUTO_FICHA', :PRODUTO_ID, FN_ELIPSE(:HISTORICO2, 500));
    END

END;