Usuário com melhor resposta
Trigger - formatos Diferentes! - Evento Inserting

Pergunta
-
Boa Tarde!
Estou querendo que quando uma trigger "copiar" um valor string para outro schema, ele seja no convertido para outro formato.
Ex.: no schema A o formato da conta é 123456 e no schema B tem que ser gravado no formato 1.2.3.4.5.6
Esse é um exemplo do mundo real em que o campo CODCONTA receber uma string do tipo 135669888 ele seja inserido como 1.3.5.66.98.88
...
CREATE OR REPLACE TRIGGER CTPLA2_CCONTA
AFTER DELETE OR INSERT OR UPDATE
OF CODIGO_CONTA, CLASSIFICACAO
ON WESLEY.CTPLA2
REFERENCING OLD AS V
NEW AS N
FOR EACH ROW
WHEN( N.SITUACAO = "A" OR N.SITUACAO = "I")
BEGIN
IF INSERTING THEN
INSERT INTO RM.CCONTA (CODCOLIGADA, CODCONTA, REDUZIDO,
DESCRICAO, ANALITICA, RATEIO, NATUREZA, CONTA8200, INATIVA,
DATAINATIVA, USUARIOINCLU, DATAINCLU, USUARIOALTER, DATAALTER)
VALUES (CODCOLIGADA = 1, ???????????);
...
Tem como fazer essas condicionais/conversões dentro das funções da trigger?
Obrigado pela Atenção!
Respostas
-
uma alternativa seria criar um campo com formula para receber a formatacao e deixar o campo numerico como indice ( que tem melhor performance ) veja esse exemplo:
Create Function Ufn_RetMascara ( @Campo numeric(10))
Returns Varchar(25)
Begin
Declare @String_Campo Varchar(25)
Select @String_Campo = convert(varchar(25),@Campo)
Select @String_Campo = Left(@String_Campo,1) + '.' + Substring(@String_Campo,2,1) + '.' + Substring(@String_Campo,3,1) + '.' +
Substring(@String_Campo,4,2) + '.' + Substring(@String_Campo,6,2) + '.' + Substring(@String_Campo,8,2)
Return @String_Campo
EndCreate Table Exemplo (
Campo numeric(10, 0) NULL ,
mascara AS (dbo.Ufn_RetMascara(campo)))qualquer coisa retorne.
-
cara seria +- assim
INSERT INTO RM.CCONTA (CODCOLIGADA, CODCONTA)
Select CODCOLIGADA , masc_contab(CODCONTA)
em triggers nao use insert passando values, use as tabelas internas para fazer insert. e melhor pois os inserts sao processados em log nao um a um,.
abs/
Todas as Respostas
-
Wesley.Net,
Neste caso, você deverá copiar caracter por caracter e concatenar com o ponto, mas para fazer isso talvez seja necessário criar um loop utilizando o While e dentro de loop utilizar a função SubString.
Não vejo com bons olhos este tipo de procedimento ser executado dentro do trigger, poderá gerar um nível de lentidão elevado, mas dá para fazer, é questão de analisar bem.
-
-
-
uma alternativa seria criar um campo com formula para receber a formatacao e deixar o campo numerico como indice ( que tem melhor performance ) veja esse exemplo:
Create Function Ufn_RetMascara ( @Campo numeric(10))
Returns Varchar(25)
Begin
Declare @String_Campo Varchar(25)
Select @String_Campo = convert(varchar(25),@Campo)
Select @String_Campo = Left(@String_Campo,1) + '.' + Substring(@String_Campo,2,1) + '.' + Substring(@String_Campo,3,1) + '.' +
Substring(@String_Campo,4,2) + '.' + Substring(@String_Campo,6,2) + '.' + Substring(@String_Campo,8,2)
Return @String_Campo
EndCreate Table Exemplo (
Campo numeric(10, 0) NULL ,
mascara AS (dbo.Ufn_RetMascara(campo)))qualquer coisa retorne.
-
Marcello Cola, Bom Dia!
Vc. deu uma boa
Descume-me o incomodo, mas eu poderia chamar a função de dentro da trigger, especificamente dontro do insert, já que não posso mudar a estrutura da tabela?
ex.: CREATE OR REPLACE TRIGGER CTPLA2_CCONTA
AFTER DELETE OR INSERT OR UPDATE
OF CODIGO_CONTA, CLASSIFICACAO
ON WESLEY.CTPLA2
REFERENCING OLD AS V
NEW AS N
FOR EACH ROW
WHEN( N.SITUACAO = "A" OR N.SITUACAO = "I")
BEGIN
IF INSERTING THEN
INSERT INTO RM.CCONTA (CODCOLIGADA, CODCONTA)
VALUES (CODCOLIGADA = 1, masc_contab(:N.CODCONTA)
);
END IF;
...
Muito Obrigado!
Obrigado a Todos! -
cara seria +- assim
INSERT INTO RM.CCONTA (CODCOLIGADA, CODCONTA)
Select CODCOLIGADA , masc_contab(CODCONTA)
em triggers nao use insert passando values, use as tabelas internas para fazer insert. e melhor pois os inserts sao processados em log nao um a um,.
abs/