Ajuda com trigger para registros duplicados
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:
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.
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
Curtidas 0
Respostas
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.
Obrigado.
GOSTEI 0
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.
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
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
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
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.
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