SET TERM ^ ;

CREATE OR ALTER trigger ttbmodelo_b0u2 for tbmodelo
active before update position 0
AS
DECLARE VARIABLE GRUPO_FAMILIA INTEGER;
DECLARE VARIABLE MEDIDA_GRUPO VARCHAR(10);
DECLARE VARIABLE GRUPO_GRADE INTEGER;
DECLARE VARIABLE GRUPO_TIPO_PROD INTEGER;
BEGIN
    GRUPO_FAMILIA   = (SELECT FIRST 1 T.FAMILIA_ID FROM TBGRUPO_PRODUTO T WHERE T.MODELO_CODIGO = OLD.CODIGO);
    MEDIDA_GRUPO    = (SELECT FIRST 1 T.UNIDADEMEDIDA_SIGLA FROM TBGRUPO_PRODUTO T WHERE T.MODELO_CODIGO = OLD.CODIGO);
    GRUPO_GRADE     = (SELECT FIRST 1 T.GRADE_ID FROM TBGRUPO_PRODUTO T WHERE T.MODELO_CODIGO = OLD.CODIGO);
    GRUPO_TIPO_PROD = (SELECT FIRST 1 T.TIPOPRODUTO_ID FROM TBGRUPO_PRODUTO T WHERE T.MODELO_CODIGO = OLD.CODIGO);
    IF(NEW.GRUPO_PRODUTO_ID > 0) THEN
    BEGIN
        IF(NEW.FAMILIA_CODIGO IS DISTINCT FROM OLD.FAMILIA_CODIGO AND NEW.FAMILIA_CODIGO IS DISTINCT FROM :GRUPO_FAMILIA) THEN
        BEGIN
            EXCEPTION "..." 'FAMILIA COMERCIAL NAO CORRESPONDE A FAMILIA DO GRUPO VINCULADO, OPERACAO CANCELADA';
        END

        IF(NEW.UNIDADEMEDIDA_SIGLA IS DISTINCT FROM OLD.UNIDADEMEDIDA_SIGLA AND NEW.UNIDADEMEDIDA_SIGLA IS DISTINCT FROM :MEDIDA_GRUPO) THEN
        BEGIN
            EXCEPTION "..." 'UNIDADE DE MEDIDA NAO CORRESPONDE A UNIDADE DE MEDIDA DO GRUPO VINCULADO, OPERACAO CANCELADA';
        END

        IF(NEW.TIPOPRODUTO_CODIGO IS DISTINCT FROM OLD.TIPOPRODUTO_CODIGO AND NEW.TIPOPRODUTO_CODIGO IS DISTINCT FROM :GRUPO_TIPO_PROD) THEN
        BEGIN
            EXCEPTION "..." 'TIPO DO PRODUTO NAO CORRESPONDE AO TIPO DE PRODUTO DO GRUPO VINCULADO, OPERACAO CANCELADA';
        END

        IF(NEW.GRADE_CODIGO IS DISTINCT FROM OLD.GRADE_CODIGO) THEN
        BEGIN
            UPDATE OR INSERT INTO TBGRUPO_PRODUTO (ID, GRADE_ID, MODELO_CODIGO)
            VALUES (NEW.GRUPO_PRODUTO_ID, NEW.GRADE_CODIGO, NEW.CODIGO)
            MATCHING (ID, MODELO_CODIGO);
        END
    END
END
^

SET TERM ; ^

