Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ricardo®

Inserção de dados entre tabelas com trigger

Recommended Posts

Bom dia para todos. :)

 

Por favor, estou precisando de ajuda para montar uma trigger. Estudei pelo livro que tenho, olhei todos os tópicos e até achei um postado pela scristina que se aproxima bastante do meu problema, mas eu não consegui entender. E tenho pra mim que o meu problema está relacionado justamente com as tabela inserted e deleted da trigger. Acho que eu não entendi direito como elas funcionam ou talvez eu não possa fazer o detalhe que quero com uma trigger.

 

Bom, sem mais delongas... http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

 

A trigger que fiz é seguinte:

 

CREATE TRIGGER T_TRANSF ON TITMMOV

AFTER INSERT AS

BEGIN

INSERT INTO TITMMOVRATDEP SELECT TITMMOV.CODCOLIGADA, TITMMOV.IDMOV, TITMMOV.NSEQITMMOV, TITMMOV.CODFILIAL,

TITMMOV.CODTB1FLX, TITMMOV.QUANTIDADE*TITMMOV.PRECOUNITARIO, 100 FROM TITMMOV

END

 

 

Eu preciso passar as informações da tabela TITMMOV para a TITMMOVRATDEP toda vez que a tabela TITMMOV receber novas informações. Tô achando que eu preciso colocar a tabela inserted em algum lugar. Já fiz uns testes mas não funcionou.

 

Alguém sabe o que devo fazer?

 

Desde já, agradeço e fico na torcida. :D

 

Valeu pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá eriva_br.Vou dar uma olhada no artigo. Tomara que ajude. Conto com a sua ajuda e de quem mais puder caso eu não consiga, ok?!Obrigado pela resposta!Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá eriva_br.Vou dar uma olhada no artigo. Tomara que ajude. Conto com a sua ajuda e de quem mais puder caso eu não consiga, ok?!Obrigado pela resposta!Att.

bl, qq. coisa posta ae http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficou mais claro. Fiz um teste com o código modificado em negrito, mas ainda tenho dúvida se está certo ou não a utilização da tabela INSERTED:

 

CREATE TRIGGER T_TRANSF ON TITMMOV

AFTER INSERT AS

BEGIN

INSERT INTO TITMMOVRATDEP SELECT CODCOLIGADA, IDMOV, NSEQITMMOV, CODFILIAL,

CODTB1FLX, QUANTIDADE*PRECOUNITARIO, 100 FROM INSERTED

END

 

 

Deu esse erro:

No user transaction is currently in progress.

The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.

 

E depois:

At beginning of table.

 

O que será que está faltando? Li no meu livro a respeito de ROLLBACK, mas diz que ele desfaz todas as transações, mas caso algo não esteja de acordo com o que o banco quer.

 

E agora? Como faço?

 

Desde já, agradeço qualquer ajuda, inclusive a sua eriva_br. Obrigado de novo.

 

Saudações a todos! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ricardo,

Primeira coisa, você precisa capturar dados da titmmov para jogar na TITMMOVRATDEP, mas a propria titmmov é a melhor tabela para a instalação da trigger? esta pergunta se deve ao fato, de a titmmov ser a tabela de itens dos movimentos de pedido de compra ou de venda, de notas fiscais de compra ou de venda, de ajustes, de requisições e por ai vai. Para cada tipo de movimento que você venha a inserir, o banco de dados vai guardar estes dados para você na TITMMOVRATDEP, ou seja, vai fazer um disparo da trigger.

 

Se você possuir 5 itens o movimento, sua trigger vai ser disparada 5 vezes. Não seria melhor fazer o controle sobre a tmov por exemplo (tabela que armazena os dados do movimento e é a tabela pai da titmmov) e controlar tb em quais os tipos de movimento ou situações especificas a tigger devera ser executada??

 

Tenho um codigo para calculo de margem de lucro no nucleus, e usei a ultima tabela que é alimentada na base para gerar o disparo. No meu caso, a tabela usada foi "TMOVRESUMOTRBIT", analisada pelo profiler.

 

Pensa bem, se a empresa tem 10 pessoas lançando notas fiscais, pedidos ou outros, para cada movimento inserido, teras pelo menos de 2 a 5 disparos do código. Acredito que seja melhor pegar da tmov, capturar o idmov inserido, rodando depois uma consulta filtrando o idmov guardado na variavel. ai, para cada movimento, você terá um disparo e consequentemente menos peso no guerreiro mssql...

 

Passa mais sobre o caso, o que precisa e para que fins, ai conversamos mais sobre a solução.

 

Mesmo assim, dah uma observado no seguinte....

CREATE TRIGGER T_TRANSF ON TITMMOV

AFTER INSERT AS

BEGIN

INSERT INTO TITMMOVRATDEP

SELECT CODCOLIGADA,IDMOV, NSEQITMMOV, CODFILIAL,CODTB1FLX, QUANTIDADE*PRECOUNITARIO, 100 FROM INSERTED

END

1º roda a select com o ultimov idmov cadastrado na sua base. verifique se esta preenchida a filial na titmmov. além disto, perceba que você esta tentando inserir dados da ftb1 com o campo codtb1flx, sendo que na tabela TITMMOVRATDEP, no campo informado, deveria ter um relacionamento com a gdepto, ou seja, tabela de departamentos. provavelmente, estes dois detalhes são os fatores que estão gerando o erro. imagina, vou fazer uma inserção, sendo que apartir de agora, faz parte da minha inserção, a duplicação de dados. se algum problema ocorrer na inserção ou na duplicação, o banco de dados dar um rollback de tudo o que havia feito, tudo mesmo... por isto esta mostrando erro para você, pq a filial é null, podendo tb codtb1flx ser null, ou então, se codtb1flx estiver preenchido, vai dar erro de relacionamento com a gdepto, afinal, codtb1flx é da tabela ftb1... hehe, confundi todo mundo...

 

2º pega o teu insert da trigger, coloca ele pegando da titmmov e seta um idmov, vai ver que vai dar pau... viva as constraints...

 

Agora com tudo isto, acho melhor estudar mais os detalhes da implementação que esta querendo fazer. passa certinho o que deseja cara...

 

att,

Rodcorgus

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Rodcorgus,

 

primeiramente, muitíssimo obrigado pela atenção e pelo tempo dedicado a mim. De todos os fóruns que faço parte e de todas as postagens que já fiz, essa foi uma das respostas mais bacanas que já recebi para uma dúvida. Obrigado. Aproveito também para agradecer eriva_br também pela colaboração. Tô muito feliz. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

O legal mesmo é que você, Rodcorgus, conhece o RM. Pra mim é uma baita coincidência, mesmo sabendo que o RM está em diversas empresas. Acho que foi por isso que foi bem bacana. http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Concordo com você Rodcorgus. Mas eu ainda não sou um profundo conhecedor do RM, por isso não sei se a TITMMOV seria a melhor tabela para a instalação da trigger. Me disseram aqui na empresa que seria no momento em que um dado é inserido na TITMMOV que a TITMMOVRATDEP deveria receber a informação para o rateio do departamento automaticamente. É mais ou menos assim... vou inserir um novo movimento, e depois um item para o movimento. Na guia identificação, coloco o produto. Na guia tabelas coloco a natureza financeira. Aí começa a confusão, porque no momento que eu incluo o centro de custo no rateio, ele já tem que me trazer, automaticamente, a qual departamento esse centro de custo pertence. A idéia é que a trigger faça esse trabalho.

O que devo fazer? Detalhar mais a trigger para que ela saiba de qual tabela deve trazer cada coluna, com seus respectivos relacionamentos? Assim eu poderia evitar que o insert me traga algum valor nulo, não é?!

Vou continuar tentando. Uma hora se consegue. Não posso desistir. Conto com a colaboração de todos e já agradeço especialmente a eriva_br e a Rodcorgus. Obrigado mesmo!

 

Saudações a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ricardo,Agradeço desde já as citações realizadas por você, é um prazer poder ajudar o amigo no que for possivel. Temos neste forum mais um colega que atua com RM Sistemas. As vezes, acabo até sendo um pouco chato quanto a codigos para RM, pois era consultor RM no sul junto a um representante. Hoje, estou atuando com SAP, mas continuo som RM no sangue, afinal de contas, apanhei para aprender sobre mssql com o RM, é fogo, para resumir. Não tem jeito, tabelas rm, a menos que tenha ou disponinilize o script de tabelas e dados para popular, se não tiver, vai ser f*** de auxiliar....Cara, quanto ao preenchimento, sem problemas, pode fazer. fiquei com certa duvida apenas no seguinte: você deseja que ao inserir o rateio especifico, já esteja preenchido o departamento no movimento? Pela lógica que o sistema vai fazer, é salvar o seu movimento normalmente, e ai sim popular a tabela com os dados de departamento. assim sendo, se salvar e não atualizar os dados, provavelmente, as informações vão estar na tabela, mas ainda não estarão na sua janela, precisando de um refresh... logo, a trigger pode estar em outra tabela, como a tmov por exemplo...Continuamos com as questões, este preenchimento vai ocorrer em todos os movimentos, desde pedidos de compra, de venda, nf de compra, nf de venda, requisições, solicitações, ajustes? tipo, se você só vai preencher isto em nf de compras, seria legal amarrar ao codtmv o disparo do preenchimento do departamento... detalhe mais, postando qual o codtmv e descrição de cada movimento, bem como com qual destes existentes, quais terão este rateio do departamento informado ativado...Na questão do codfilial, ele esta preenchido na tmov, mas pelo visto não esta informado na titmmov. para corrigir isto, poderia gerar no codigo da trigger a captura do codfilial da tmov para uma variavel usada no insert, ou então, se for apenas uma filial, definir direto "1", lembrando, que se o cliente inserir nova filial, ferra tudo... Além disto, e acho que mais grave, é a questão do codtb1flx. como vcs estão usando o departamento? estão cadastrando como departamento ou usando uma tabela opcional para informar isto?? Talvez, o que você deseja, é pegar pelo codtb1flx qual o departamento amarrado aquele registro, seria isto? na tabela TITMMOVRATDEP você precisa definir o codigo do departamento, pois o campo CODDEPARTAMENTOé chave extrangeira da tabela gdepto, referente ao campo CODDEPARTAMENTO da gdepto. se tentar inserir um campo da ftb1, vai dar pau na constraint... logo, precisa ver isto antes de tudo... a menos que mude a estrutura da TITMMOVRATDEP, nunca vai funcionar. Ainda sobre mudanças na estrutura da TITMMOVRATDEP, para resumir, nunca o faça.... vai dar só m***** quando tiver uma conversão do sistema e futuramente vai dar muita dor de cabeça. tinha um colega que as vezes tinha problemas ao inserir dados, pela amarração das tabelas. solução, desativar os relacionamentos e constraints, vê se pode... ai depois, iamos nos ferrar até achar a m***** gerada por ele...se a lógica necessária for de caputar o codigo do departamento de dentro da tabela opcional, beleza, uma consulta resolve o problema... Cara, além disto, tem algumas coisas que poderão auxliarmuito você. seguem 3 delas:1 - profiler: sempre que tiver duvidas de como o sistema esta fazendo algo, use o recurso. como descrevi antes, para um codigo de margem de lucro, defini na ultima tabela o disparo da trigger. mas para ver o que esta ocorrendo, precisa ter apenas seus dados no profiler, filtrados para sua seção. ai vem o segundo item, quue é o @@spid2 - @@spid: carinha muito legal. rode a seguinte query no gerador de consultas do rm:select @@spid from gcoligada where codocligada=1pegue este numero e coloque como filtro no profiler. é a melhor maneira de ter 10 pessoas trabalhando na base, mas você só lerá o que esta sendo feito no banco para a sua conexão, ou seja, o acesso ao seu modulo. detalhe, se estiver com dois modulos, dois @@spid diferentes...3 - um outro cara bem legal, é sp_help 'tabela'. mostra a estrutura da tabela, sem precisar acessar o enterprise manager. muito ustil sempre, mais util ainda quando se usa o msde. ele vai mostrar todos os dados importantes sobre a sua tabelaRicardo, espero que seja util o postado aqui. vamos trocando ideias para matar este problema que você esta tendo.att,rodcorgus

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.