none
Criar uma trigger RRS feed

  • Pergunta

  • Olá pessoal,

    Preciso criar uma trigger no sistema TOTVS (RM).

    Para isso fiz um SQL para tentar ilustrar o que preciso fazer.

    A Trigger deverá ser executada após salvar o registro na tabela FLANCOMPL.

    Segue o SQL:

    SELECT A.IDMOV, A.CODTMV, CURSO_NUCLEUS = B.TBCURSOS,
    C.IDLAN, C.CODCCUSTO,
    D.IDREMESSA, CURSO_FLUXUS = D.TBCURSOS
    
    FROM TMOV A (NOLOCK)
    INNER JOIN TMOVCOMPL B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDMOV = A.IDMOV)
    INNER JOIN FLAN C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA AND C.IDMOV = A.IDMOV)
    INNER JOIN FLANCOMPL D (NOLOCK) ON (D.CODCOLIGADA = C.CODCOLIGADA AND D.IDLAN = C.IDLAN)
    WHERE A.IDMOV = 337385

    Quero que o valor informado no campo B.TBCURSOS seja levado para o campo D.TBCURSOS, sendo:

    B = tabela TMOVCOMPL

    D = tabela FLANCOMPL

    Alguém poderia me ajudar?

    Grato,

    Ilano

    quarta-feira, 19 de novembro de 2014 13:39

Respostas

  • Create TRIGGER [dbo].[Add_Blocked_User]
    ON [dbo].[TMOV]
    AFTER INSERT
    AS 
    BEGIN
    
    	SET NOCOUNT ON;
    
    	Declare @ID int
    	Select @ID = [TMOV] from inserted  
    
    	Begin
               --aqui coloca sua lógica.
               --update tabelaB set campoB = (select campoA from tabelaA where campoId = @ID)
    
    	End
    
    END
    Tenta tirar uma base disso cara.

    Nome : Romy G. Moura Cargo: Analista Programador

    quarta-feira, 19 de novembro de 2014 13:46
  • ilanocf,

    Acredito que o exemplo que o Romy postou pode te ajudar, mas veja este outros exemplos:

    Drop Table Saldos
     (Codigo Int Identity(1,1),
      Produto Int,
      Descricao Char(10),
      Quantidade Float(8),
      Data DateTime,
      Saldo Float(8) Null)
    
    Truncate Table Saldos
    
    Insert Into Saldos Values (311,'Balão 1',10,GetDate(),0)
    Insert Into Saldos Values (211,'Balão 2',10,GetDate(),0)
    Insert Into Saldos Values (331,'Balão 3',10,GetDate(),0)
    Insert Into Saldos Values (211,'Balão 4',10,GetDate(),0)
    Insert Into Saldos Values (312,'Balão 5',10,GetDate(),0)
    
    Select * from Saldos
    
    Create Trigger T_Atualizar_Saldos
    On Saldos
    After Insert, Update
    As
    Begin
     Update Saldos 
     Set Saldos.Saldo = Saldos.Saldo + I.Quantidade
     From Saldos  Inner Join Inserted I
                           On Saldos.Produto = I.Produto
    End
    
    Insert Into Saldos Values (312, 'Balão 1',4,GetDate(),0)
    
    Select * from Saldos
    CREATE  Trigger T_Atualizar_Saldos
    On EstFisic
    After Insert, Update
    As
    
    Set NoCount Off
    
    Declare @TipoMov Char(1),
               @Codigo Char(10),
               @Quantidade Float(8),
               @Data_Mov DateTime
    
    Select @TipoMov=Status, @Quantidade=Quantidade, @Codigo=Codigo, @Data_Mov=Data From Inserted
    
    Begin
    
      If @TipoMov = 'E'
       Begin  
        Update Produtos 
        Set Saldo= Saldo+@Quantidade, Data=@Data_Mov
        Where Codigo = @Codigo 
       End
      
      If @TipoMov='S'
       Begin  
        Update Produtos 
        Set Saldo= Saldo-@Quantidade, Data=@Data_Mov
        Where Codigo = @Codigo 
       End
    End

    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 19 de novembro de 2014 14:01
  • Galera, muitíssimo obrigado pela atenção. Com certeza experimentarei todos. Mas gostaria de saber se esse formato está correto:

    CREATE TRIGGER TGR_CURSOS_TMOV_FLAN
    ON FLANCOMPL
    AFTER INSERT
    AS
    BEGIN
    	DECLARE
    	@IDLAN	INTEGER
    	
    	SELECT @IDLAN = IDLAN FROM FLANCOMPL
    	
    	BEGIN
    		UPDATE FLANCOMPL SET TBCURSOS =
    		(SELECT CASE WHEN B.TBCURSOS IS NOT NULL THEN B.TBCURSOS ELSE NULL END
    			FROM TMOV A (NOLOCK)
    			INNER JOIN TMOVCOMPL B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDMOV = A.IDMOV)
    			INNER JOIN FLAN C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA AND C.IDMOV = A.IDMOV)
    			INNER JOIN FLANCOMPL D (NOLOCK) ON (D.CODCOLIGADA = C.CODCOLIGADA AND D.IDLAN = C.IDLAN)
    			WHERE C.IDLAN = @IDLAN)
    		WHERE IDLAN = @IDLAN
    	END
    END
    GO

    Obrigado!

    Ilanocf,

    Sim, sim esta no caminho!!!

    Só um detalhe, no SQL Server você não declara valores como Integer e sim INT.



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quarta-feira, 19 de novembro de 2014 14:43
  • Deleted
    quarta-feira, 19 de novembro de 2014 19:40

Todas as Respostas

  • Create TRIGGER [dbo].[Add_Blocked_User]
    ON [dbo].[TMOV]
    AFTER INSERT
    AS 
    BEGIN
    
    	SET NOCOUNT ON;
    
    	Declare @ID int
    	Select @ID = [TMOV] from inserted  
    
    	Begin
               --aqui coloca sua lógica.
               --update tabelaB set campoB = (select campoA from tabelaA where campoId = @ID)
    
    	End
    
    END
    Tenta tirar uma base disso cara.

    Nome : Romy G. Moura Cargo: Analista Programador

    quarta-feira, 19 de novembro de 2014 13:46
  • ilanocf,

    Acredito que o exemplo que o Romy postou pode te ajudar, mas veja este outros exemplos:

    Drop Table Saldos
     (Codigo Int Identity(1,1),
      Produto Int,
      Descricao Char(10),
      Quantidade Float(8),
      Data DateTime,
      Saldo Float(8) Null)
    
    Truncate Table Saldos
    
    Insert Into Saldos Values (311,'Balão 1',10,GetDate(),0)
    Insert Into Saldos Values (211,'Balão 2',10,GetDate(),0)
    Insert Into Saldos Values (331,'Balão 3',10,GetDate(),0)
    Insert Into Saldos Values (211,'Balão 4',10,GetDate(),0)
    Insert Into Saldos Values (312,'Balão 5',10,GetDate(),0)
    
    Select * from Saldos
    
    Create Trigger T_Atualizar_Saldos
    On Saldos
    After Insert, Update
    As
    Begin
     Update Saldos 
     Set Saldos.Saldo = Saldos.Saldo + I.Quantidade
     From Saldos  Inner Join Inserted I
                           On Saldos.Produto = I.Produto
    End
    
    Insert Into Saldos Values (312, 'Balão 1',4,GetDate(),0)
    
    Select * from Saldos
    CREATE  Trigger T_Atualizar_Saldos
    On EstFisic
    After Insert, Update
    As
    
    Set NoCount Off
    
    Declare @TipoMov Char(1),
               @Codigo Char(10),
               @Quantidade Float(8),
               @Data_Mov DateTime
    
    Select @TipoMov=Status, @Quantidade=Quantidade, @Codigo=Codigo, @Data_Mov=Data From Inserted
    
    Begin
    
      If @TipoMov = 'E'
       Begin  
        Update Produtos 
        Set Saldo= Saldo+@Quantidade, Data=@Data_Mov
        Where Codigo = @Codigo 
       End
      
      If @TipoMov='S'
       Begin  
        Update Produtos 
        Set Saldo= Saldo-@Quantidade, Data=@Data_Mov
        Where Codigo = @Codigo 
       End
    End

    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 19 de novembro de 2014 14:01
  • Galera, muitíssimo obrigado pela atenção. Com certeza experimentarei todos. Mas gostaria de saber se esse formato está correto:

    CREATE TRIGGER TGR_CURSOS_TMOV_FLAN
    ON FLANCOMPL
    AFTER INSERT
    AS
    BEGIN
    	DECLARE
    	@IDLAN	INTEGER
    	
    	SELECT @IDLAN = IDLAN FROM FLANCOMPL
    	
    	BEGIN
    		UPDATE FLANCOMPL SET TBCURSOS =
    		(SELECT CASE WHEN B.TBCURSOS IS NOT NULL THEN B.TBCURSOS ELSE NULL END
    			FROM TMOV A (NOLOCK)
    			INNER JOIN TMOVCOMPL B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDMOV = A.IDMOV)
    			INNER JOIN FLAN C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA AND C.IDMOV = A.IDMOV)
    			INNER JOIN FLANCOMPL D (NOLOCK) ON (D.CODCOLIGADA = C.CODCOLIGADA AND D.IDLAN = C.IDLAN)
    			WHERE C.IDLAN = @IDLAN)
    		WHERE IDLAN = @IDLAN
    	END
    END
    GO

    Obrigado!

    quarta-feira, 19 de novembro de 2014 14:10
  • Galera, muitíssimo obrigado pela atenção. Com certeza experimentarei todos. Mas gostaria de saber se esse formato está correto:

    CREATE TRIGGER TGR_CURSOS_TMOV_FLAN
    ON FLANCOMPL
    AFTER INSERT
    AS
    BEGIN
    	DECLARE
    	@IDLAN	INTEGER
    	
    	SELECT @IDLAN = IDLAN FROM FLANCOMPL
    	
    	BEGIN
    		UPDATE FLANCOMPL SET TBCURSOS =
    		(SELECT CASE WHEN B.TBCURSOS IS NOT NULL THEN B.TBCURSOS ELSE NULL END
    			FROM TMOV A (NOLOCK)
    			INNER JOIN TMOVCOMPL B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDMOV = A.IDMOV)
    			INNER JOIN FLAN C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA AND C.IDMOV = A.IDMOV)
    			INNER JOIN FLANCOMPL D (NOLOCK) ON (D.CODCOLIGADA = C.CODCOLIGADA AND D.IDLAN = C.IDLAN)
    			WHERE C.IDLAN = @IDLAN)
    		WHERE IDLAN = @IDLAN
    	END
    END
    GO

    Obrigado!

    Ilanocf,

    Sim, sim esta no caminho!!!

    Só um detalhe, no SQL Server você não declara valores como Integer e sim INT.



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quarta-feira, 19 de novembro de 2014 14:43
  • Bom pessoal,

    Fizemos os testes mas não executou. Falta alguma coisa????

    quarta-feira, 19 de novembro de 2014 14:55
  • Boa tarde Ilano,

    Para construir uma trigger, dê uma olhada no link abaixo.

    http://smcode.com.br/triggersSql.aspx

    A sua trigger ficará da seguinte maneira.

    CREATE TRIGGER [NOME_TRIGGER]
    ON [NOME_TABELA]
    
    FOR [UPDATE/INSERT/DELETE]
    
    AS
    
    DECLARE	@IDLAN	INTEGER
    	
    SET @IDLAN = (SELECT IDLAN FROM FLANCOMPL)
    	
    BEGIN
    
     UPDATE FLANCOMPL SET TBCURSOS =
    		(SELECT CASE WHEN B.TBCURSOS IS NOT NULL THEN B.TBCURSOS ELSE NULL END
    			FROM TMOV A (NOLOCK)
    			INNER JOIN TMOVCOMPL B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.IDMOV = A.IDMOV)
    			INNER JOIN FLAN C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA AND C.IDMOV = A.IDMOV)
    			INNER JOIN FLANCOMPL D (NOLOCK) ON (D.CODCOLIGADA = C.CODCOLIGADA AND D.IDLAN = C.IDLAN)
    			WHERE C.IDLAN = @IDLAN)
    		WHERE IDLAN = @IDLAN
    END

    O lugar que na minha visão estava errado, eu corrigi, que é a linha onde você declara o valor para a variável @IDLAN (a linha está em negrito).

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    quarta-feira, 19 de novembro de 2014 15:06
  • Cara veja se é isto, acredito que no sql não tem INTEGER e sim INT se eu não me engano.

    Nome : Romy G. Moura Cargo: Analista Programador

    quarta-feira, 19 de novembro de 2014 16:09
  • Romy,

    Isso mesmo, o Integer no SQL Server é Int.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 19 de novembro de 2014 16:32
  • Olá pessoal,

    Fazendo os testes percebi que a linha

    SET @IDLAN = (SELECT IDLAN FROM FLANCOMPL)

    Está retornando mais de um registro. Pois diz que a subquery retornou mais de um resultado. Tem como pegar o IDLAN atual? Se eu der um TOP 1 funciona, mas como posso ter garantia de que fará no registro que quero que seja feito? Além de achar que esse não seria o correto, ou estou dizendo alguma besteira?


    Testando com um TOP 1 ele executou, mas também não fez nada pois a referência IDLAN não esta retornando uma só.

    quarta-feira, 19 de novembro de 2014 16:59
  • SET @IDLAN = (SELECT MAX(IDLAN) FROM FLANCOMPL)

    Pegando o MAX não funcionaria não?

    quarta-feira, 19 de novembro de 2014 19:27
  • Deleted
    quarta-feira, 19 de novembro de 2014 19:40
  • Ilanocf,

    Conseguiu resolver seu problema? Caso sim, marque como resposta todos os posts que ajudaram você a obter a solução.

    Se ainda tem problemas, indique onde parou para que todos da Comunidade possam ajudar você a obter a solução desejada.


    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 24 de novembro de 2014 17:44
    Moderador
  • Dentro de uma trigger é possível criar relacionamento de tabelas?

    segunda-feira, 24 de novembro de 2014 20:14
  • Dentro de uma trigger é possível criar relacionamento de tabelas?

    Rubem,

    Criar relacionamento de tabela? Poderia explicar melhor o que você pretende fazer.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 24 de novembro de 2014 20:37
    Moderador