| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
fabiodocs Novato

Registrado: Quarta-Feira, 21 de Fevereiro de 2007 Mensagens: 11
|
Enviada: Qua Fev 21, 2007 9:55 am Assunto: Trigger com select Duvida |
|
|
O problema se concentra no seguinte , tenho duas tabelas, a primeira resumo_venda, a segunda detalhe_venda, sendo que na primeira existe um campo totalvenda e na segunda um campo totalitem, sendo que as duas tem um campo em comum que é o controlevenda, tenho que fazer uma trigger que seja disparada toda vez que a tabela detalhe for alterada para atualizar a tabela resumo....tentei de diversas formas a ultima foi assim :
AS
begin
new.total = new.quantidade * new.unitario;
select sum ( total ) from detalhe_venda where detalhe_venda.controle_venda = new.controle_venda into :i;
update resumo_venda set resumo_venda.valortotal = :i where resumo_venda.controle = detalhe_venda.controle_venda;
end
Mas não obtive sucesso.....peço a gentileza de quem puder me ajudar.. |
|
| Voltar ao Topo |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Qua Fev 21, 2007 1:44 pm Assunto: |
|
|
tente no after insert algo do tipo:
| Código: | as
declare variable valor numeric(15,2);
begin
select sum ( total ) from detalhe_venda
where detalhe_venda.controle_venda = new.controle_venda into :valor;
update resumo_venda set resumo_venda.valortotal = :valor
where resumo_venda.controle = new.controle_venda;
end
|
_________________ Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django |
|
| Voltar ao Topo |
|
 |
fabiodocs Novato

Registrado: Quarta-Feira, 21 de Fevereiro de 2007 Mensagens: 11
|
Enviada: Qua Fev 21, 2007 2:26 pm Assunto: |
|
|
Valeu pela dica....estava mesmo pensando em algo do tipo, consegui com o seguinte codigo tambem....
AS
begin
update resumo_venda set resumo_venda.valortotal = ( resumo_venda.valortotal - detalhe_venda.total ) where resumo_venda.controle = new.controle_venda;
update detalheviagem set detalheviagem.vendido = ( detalheviagem.vendido - old.quantidade) where detalheviagem.controleviagem = new.movimento and detalheviagem.codigoproduto = new.codigo_prod;
new.total = new.quantidade * new.unitario;
update detalheviagem set detalheviagem.vendido = ( detalheviagem.vendido + new.quantidade) where detalheviagem.controleviagem = new.movimento and detalheviagem.codigoproduto = new.codigo_prod;
update detalheviagem set detalheviagem.retorno = ( detalheviagem.totunidades - detalheviagem.vendido ) where detalheviagem.controleviagem = new.movimento and detalheviagem.codigoproduto = new.codigo_prod;
update resumo_venda set resumo_venda.valortotal = ( resumo_venda.valortotal + new.total ) where resumo_venda.controle = new.controle_venda;
end
Ficou meio extenso mas atualiza as tabelas que preciso, só não consegui colocar um commit junto ao trigger por isso os valores só são atualizaos quando fecho e abro a tabela .....Tem jeito de colocar um commit direto no trigger ? |
|
| Voltar ao Topo |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Qua Fev 21, 2007 2:38 pm Assunto: |
|
|
O commit deve ser dado na aplicação. O firebird ainda não suporta commi's dentro de ações do banco (triggers, stored procedures, etc).
Se tiver usando ibx, é só indicar no componente IbTransacion
ibTransaction1.Commit;
ou
ibTransaction1.CommitRetaining; _________________ Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django |
|
| Voltar ao Topo |
|
 |
fabiodocs Novato

Registrado: Quarta-Feira, 21 de Fevereiro de 2007 Mensagens: 11
|
Enviada: Qua Fev 21, 2007 2:54 pm Assunto: |
|
|
| Blz, cara agradeço muito tua ajuda, usei o esquema indicado por vc, ajudou bastante, fico grato, quanto ao commit tomei como solução colocar no dataset da tabela detalhes no evento after post uma rotina para fechar e abrir o dataset resumo, assim consegui com poucas linhas acertar um item que sera usado no sistema inteiro, agora desse jeito não preciso mais me preocupar com totais....Mas uma vez muito obrigado. Vou marcar como resolvido este topico. |
|
| Voltar ao Topo |
|
 |
|