Tratar erro de FK
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.
Obrigado a todos
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
Curtidas 0
Respostas
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
17/08/2011
você pode deletar diretamente no Banco de dados via SQL usando algo semelhante ao código abaixo:
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 à:
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/
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
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