Fórum Duvida de automatização no banco de dados Oracle #610973
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
Curtir tópico
+ 0Posts
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.
Gostei + 0
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;
Gostei + 0
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)