Tratar erro de FK

Delphi

17/08/2011

Estou atualizando uma tabela de produtos, comparando com outra tabela, quando o produto nao existir na tabela A devera ser excluido da tabela B, porem alguns produtos tiveram movimentacao entao a exclusao devera ser cancelada e quero colocar uma marca nesses produtos. Estou tentando com o codigo abaixo, mas retorna o erro de FK e nao cai na except.    
 
      try
        CdsProdutos.Delete;
        CdsProdutos.ApplyUpdates(0);
      except
        CdsProdutos.Edit;
        CdsProdutosORIGEM.Value := '9';
        CdsProdutos.Post;
        CdsProdutos.ApplyUpdates(0);
        CdsProdutos.Next;
      end;
    end
    else
      CdsProdutos.Next;
 
 


Obrigado a todos  
Felipe Ip

Felipe Ip

Curtidas 0

Respostas

Leonardo Xavier

Leonardo Xavier

17/08/2011

ola. vou dar uma dica, sua tabela A poderia ter mis um campo chamado flag, este campo seria preenchido com o numero 1 se for movimentado, para fazer sua rotina de subtração faça uma consulta com todos os campos que tenha o numero 1 como flag. então faça a alteração ou a exclusão, será bem mais facil e você nao precisará passar por todos os dados de sua tabela indo assim diretamente ao dado necessario. qualquer coisa posta ai. Abraços
GOSTEI 0
Geversom Sousa

Geversom Sousa

17/08/2011

você pode deletar diretamente no Banco de dados via SQL usando algo semelhante ao código abaixo: 
DELETE FROM TABELA2 T2 WHERE NOT EXISTS (SELECT CODIGO             /* verifica se o registro existe na tabela 1 */                     FROM TABELA1 T1                    WHERE T1.CODIGO = T2.CODIGO)   AND NOT EXISTS (SELECT CODIGO                     FROM TABELA3 T3        /* verifica se existe na tabela 3 - que viola a FK */                    WHERE T3.CODIGO = T2.CODIGO).


Explicando para que o registro seja deletado, o mesmo não deverá existir na tabela 1 e nem na tabela 3 
tabela 1 - a sua tabela base. tabela 3 - a tabela que viola a FK. 
--- 
para marcar os registros você também pode fazer via SQL com algo semelhante à: 
UPADTE TABELA2 T2   SET ORIGEM = '9' WHERE NOT EXISTS (SELECT CODIGO             /* verifica se o registro existe na tabela 1 */                     FROM TABELA1 T1                    WHERE T1.CODIGO = T2.CODIGO)   AND  EXISTS (SELECT CODIGO                     FROM TABELA3 T3        /* verifica se exista na tabela 3 - que viola a FK */                    WHERE T3.CODIGO = T2.CODIGO).

Abraço 


Geversom Sousa
Desenvolvedor Delphi - C#
(62) 8246-8168 //  8442-2368 

http://www.gedeveloper.blogspot.com/
http://twitter.com/geversom
http://photosge.blogspot.com/


 
GOSTEI 0
Pjava

Pjava

17/08/2011

Acho que via banco não é o que ele quer pelo que eu entendi, pois se ele tivesse várias aplicações rodando em vários clientes dele, ele teria que ter um cara sempre que essa rotina fosse executada, teria q ter um cara lá só para rodar isso no banco. Acho que a solução que o colega deu de uma flag, seria o ideal. Aí sua rotina rodaria automaticamente.
GOSTEI 0
POSTAR