Duvida de automatização no banco de dados Oracle
29/05/2020
0
Não sei se o titulo está certo, mais a questão que eu preciso resolver é a seguinte.
Tenho uma tabela de cadastro de parceiros, onde existem diversas informações onde uma delas é a região desse parceiro.
E eu preciso que ao realizar ou atualizar esse cadastro o campo região seja inserido automaticamente por valores pré definidos.
3 variáveis que são: se o cliente é contribuinte ou nao, se o cliente é cliente de representante ou não, e o estado.
essas 3 variáveis definem a região do cliente.
exemplo: se ao cadastrar um cliente ele for contribuinte, não for cliente de representante e é do estado de são paulo a região dele será definida automaticamente com 'xxxxx'.
Tentei realizar isso atravês de um Trigger, não sei se fiz de forma correta, porêm o funcionamento dela é bem inconsistente.
Então queria saber se existe outras possibilidades de realizar esse procedimento, e se não houver alguem poderia me dizer qual a melhor estrutura para a trigger?
Grato.
Gustavo Paula
Posts
29/05/2020
Gustavo Paula
]CREATE OR REPLACE TRIGGER TRG_INC_UPD_REG_G BEFORE INSERT OR UPDATE ON SANKHYA_TESTE.TGFPAR REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE PRAGMA AUTONOMOUS_TRANSACTION; V_REPRESENTANTE VARCHAR2(1); V_CONTRIBUINTE VARCHAR2(1); V_ESTADO NUMBER; BEGIN SELECT AD_REPRESENTANTE INTO V_REPRESENTANTE FROM TGFPAR WHERE CODPARC =:NEW.CODPARC; SELECT CLASSIFICMS INTO V_CONTRIBUINTE FROM TGFPAR WHERE CODPARC =:NEW.CODPARC; SELECT UF.CODUF INTO V_ESTADO FROM TSICID CID, TSIUFS UF WHERE CID.UF=UF.CODUF AND CODCID IN (SELECT CODCID FROM TGFPAR WHERE CODPARC =:NEW.CODPARC); --CLIENTES NÃO CONTRIBUINTES, NÃO REPRESENTANTE, REGIAO MINAS IF (V_ESTADO = 2 AND V_CONTRIBUINTE NOT IN (''''C'''',''''I'''',''''T'''') AND V_REPRESENTANTE = ''''N'''') THEN :NEW.CODREG := 170000000; END IF; --CLIENTES CONTRIBUINTES, NÃO REPRESENTANTE, REGIAO MINAS IF (V_ESTADO = 2 AND V_CONTRIBUINTE IN (''''C'''',''''I'''',''''T'''') AND V_REPRESENTANTE = ''''N'''') THEN :NEW.CODREG := 090000000; END IF; END;
Existem mais condições não somente essas duas, mais basicamente minha ideia inicial foi essa.
Como disse não sei se é a melhor opção ou ate mesmo a melhor estrutura.
29/05/2020
Emerson Nascimento
CREATE OR REPLACE TRIGGER TRG_INC_UPD_REG_G BEFORE INSERT OR UPDATE ON SANKHYA_TESTE.TGFPAR FOR EACH ROW DECLARE V_REPRESENTANTE VARCHAR2(1); V_CONTRIBUINTE VARCHAR2(1); V_ESTADO NUMBER; BEGIN V_REPRESENTANTE := :NEW.AD_REPRESENTANTE; V_CONTRIBUINTE := :NEW.CLASSIFICMS; SELECT UF.CODUF INTO V_ESTADO FROM TSICID CID INNER JOIN TSIUFS UF ON UF.CODUF = CID.UF WHERE CID.CODCID = :NEW.CODCID; --CLIENTES REGIAO MINAS IF (V_ESTADO = 2) THEN --CLIENTES NÃO CONTRIBUINTES, NÃO REPRESENTANTE IF (V_CONTRIBUINTE NOT IN ('C','I','T')) AND (V_REPRESENTANTE = 'N') THEN :NEW.CODREG := 170000000; // AQUI É NUMÉRICO MESMO? END IF; --CLIENTES CONTRIBUINTES, NÃO REPRESENTANTE IF (V_CONTRIBUINTE IN ('C','I','T')) AND (V_REPRESENTANTE = 'N') THEN :NEW.CODREG := 090000000; END IF; END IF; END;
30/05/2020
Gustavo Paula
Lá é numérico sim. Depois de analisar um pouco melhor percebi que não existia necessidade de realizar o select na mesma tabela em que a trigger estava atuando, então fiz basicamente o mesmo que você fez, e consegui executar o procedimento com sucesso.
Muito obrigado o forum tem me ajudado a evoluir bastante.
Clique aqui para fazer login e interagir na Comunidade :)