Ajuda com trigger para registros duplicados

Firebird

22/02/2012

Olá, pessoal.

O aplicativo da empresa em que trabalho realiza inserts dos pedidos de venda copiando os dados de outro banco de dados na rede e, após concluir todos os inserts, ele apaga a tabela cliente.

O problema é que, de vez em quando, ocorrem erros na rede antes de concluir-se a operação e ele acaba tendo erros com registros duplicados.

Então, estou tentando criar uma trigger diminua o impacto da rede no aplicativo.

Por enquanto está assim:
CREATE TRIGGER PEDIDODUPLO_BI0 FOR PEDIDOSVENDA
ACTIVE BEFORE INSERT POSITION 0
as
begin
     if (new.documento  = pedidosvenda.documento) then
        if (new.data = pedidosvenda.data) then
           begin
                delete from pedidosvenda where (pedidosvenda.documento = new.documento);
           end
        else if (new.data <> pedidosvenda.data) then
           begin
                update pedidosvenda set pedidosvenda.documento = pedidosvenda.documento || A;
           end
end


O meu problema ocorre na parte em que a data é diferente (onde teria que ser feito o update para o número do documento), ela não executa. Simpesmente substitui o registro anteerior mesmo a data sendo diferente.

Raphael Peret

Raphael Peret

Curtidas 0

Respostas

Diego Lusa

Diego Lusa

22/02/2012

Rafael, você poderia postar o código formatado? Além disso, poderia explicar melhor como ocorre esta cópia de registros de uma base para outra?

Obrigado.
GOSTEI 0
Raphael Peret

Raphael Peret

22/02/2012

CREATE TRIGGER PEDIDODUPLO_BI0 FOR PEDIDOSVENDA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.documento = pedidosvenda.documento) then
if (new.data = pedidosvenda.data) then
begin
delete from pedidosvenda where (pedidosvenda.documento = new.documento);
end
else if (new.data <> pedidosvenda.data) then
new.documento = new.documento || A;

end

É, se colocar entre as tags de código o fórum deforma.

O sistema que a empresa utiliza, faz a cópia exata dos registros de uma base de dados Access para a base Firebird. Ou seja, tudo que está na tabela pedidosvenda da base em Access vem para a tabela pedidosvenda da base Firebird e depois de realizar todos os inserts, apaga a tabela da base de dados Access deixando-a em branco.

O que eu quero que essa trigger faça é, no momento em que o sistema estiver fazendo os inserts na base Firebird, ela compare se a coluna documento que está sendo inserida já existe na tabela.

Se existir e a data for a mesma, ele deleta o registro existente e insere o novo. Se a data for diferente, ele altera o new.documento para new.documento || A.

O meu problema está na parte de alterar. O banco está simplesmente sobrepondo, como se a data fosse a mesma.

Outra coisa que esqueci de informar é a versão do Firebird: 1.5.
GOSTEI 0
Diego Lusa

Diego Lusa

22/02/2012

Raphael, vou te sugerir a construção abaixo. Acredito que vá funcionar.

CREATE TRIGGER PEDIDODUPLO_BI0 FOR PEDIDOSVENDA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable data date;
begin

--recupera o registro, caso exista
select v.data from pedidosvenda v where v.documento = new.documento into :data;

if (data = new.data) then
begin
delete from pedidosvenda p where p.documento = new.documento;

end
else if( (data is not null) and (new.data <> data)) then
new.documento = new.documento || A;

end
GOSTEI 0
Raphael Peret

Raphael Peret

22/02/2012

Diego, funcionou perfeitamente.

Agora quando faço o insert de um registro com data diferente mas com número de documento igual ele altera a numeração do documento como eu queria que fizesse.

Muito obrigado.
GOSTEI 0
POSTAR