none
Trigger - formatos Diferentes! - Evento Inserting RRS feed

  • 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!

    quarta-feira, 24 de janeiro de 2007 18:36

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
     End

     Create Table Exemplo (
     Campo numeric(10, 0) NULL ,
     mascara AS (dbo.Ufn_RetMascara(campo)))

    qualquer coisa retorne.

    quinta-feira, 25 de janeiro de 2007 08:58
  • 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/

     

    quinta-feira, 25 de janeiro de 2007 10:50

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.

    quarta-feira, 24 de janeiro de 2007 18:43
  • Wesley

    Se vc tiver uma máscara bem definida até que fica fácil, se não tiver vc pode ter muita dor de cabeça!

     

    Abraços

    quarta-feira, 24 de janeiro de 2007 19:14
  • Galera, existem vários predicados condicionais que tenho que implemtar nessa trigger. Acho melhor tratar isso tudo por arquivo texto (gera num sistema e importa no outro) via .net mesmo é mais simples.
    O que vocês acham?
    quarta-feira, 24 de janeiro de 2007 20:01
  • 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
     End

     Create Table Exemplo (
     Campo numeric(10, 0) NULL ,
     mascara AS (dbo.Ufn_RetMascara(campo)))

    qualquer coisa retorne.

    quinta-feira, 25 de janeiro de 2007 08:58
  • 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!


    quinta-feira, 25 de janeiro de 2007 10:42
  • 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/

     

    quinta-feira, 25 de janeiro de 2007 10:50