Deletando registro no mestre detalhe

28/12/2005

Amigos utilizo o SimpleDataset como objeto de conexão a tabela e tenho uma tabela Mestre (Nota Fiscal) e outa Detalhe (Itemnf), meu problema e quando quero deletar a nota tenho que fazer um loop na tabela detalhe para apagar os registros relacionados e dai acontece o erro de duplicação da transação.
alguem poderia me ajudar com uma forma mais simples para executar esta operação, não gostaria de trocar o simpledataser por outro.


Dpinho

Respostas

29/12/2005

Caninha51

Qual banco tu usa?
Provavelmente na tabelma itemNF tu tem uma chave estrangeira neh?
Eh soh colocar pra excluir em cascata...


Responder Citar

29/12/2005

Dpinho

Qual banco tu usa? Provavelmente na tabelma itemNF tu tem uma chave estrangeira neh? Eh soh colocar pra excluir em cascata...


Relamente não tem chave estrangeira, mas gostaria de fazer sem a chave, na unha se possivel.
Alguem poderia ajudar?


Responder Citar

29/12/2005

Aerreira

Não entendi direito quando falou ´acontece o erro de duplicação da transação´.

O ideal mesmo é usar a chave estrangeira e usar o ´on delete cascade´, mas como quer fazer manualmente, o correto seria primeiro excluir os registros da tabela detalhe e depois o registro master. Talvez esteja apagando a tabela mestre (e perdendo a sua chave de ligação entre as tabelas) e depois tentando apagar os registros detalhes com a chave errada.


Responder Citar

29/12/2005

Caninha51

Se tu quiser apagar na mão eh soh tu executar uma query pra excluir os detalhes e depois excluir o mestre.

DELETE FROM TABLEDETALHES WHERE CODMESTRE = X

DELETE FROM TABLEMESTRE WHERE CODIGO = X


Responder Citar

29/12/2005

Dpinho

Não entendi direito quando falou ´acontece o erro de duplicação da transação´. O ideal mesmo é usar a chave estrangeira e usar o ´on delete cascade´, mas como quer fazer manualmente, o correto seria primeiro excluir os registros da tabela detalhe e depois o registro master. Talvez esteja apagando a tabela mestre (e perdendo a sua chave de ligação entre as tabelas) e depois tentando apagar os registros detalhes com a chave errada.



o erro que esta retornando é: Update Affected more than 1 record.

Meu codigo é este:

[color=red:095afb6b05]DM.SDS_Itemos.IndexFieldNames := ´OS´;
DM.SDS_Itemos.first;
while DM.SDS_Itemos.FieldByName(´OS´).AsString = DM.SDS_Receitas.FieldByName(´Numero´).AsString do
begin
if DM.SDS_Itemos.FieldByName(´OS´).AsString = DM.SDS_Receitas.FieldByName(´Numero´).AsString then
begin
TD.TransactionID := 1;
TD.IsolationLevel := XILReadCommitted;
DM.SQLC.StartTransaction(TD);
DM.SDS_Itemos.Delete;
DM.SDS_Itemos.ApplyUpdates(0);
DM.SQLC.Commit(TD);
end;
DM.SDS_Itemos.Next;
end;
TD.TransactionID := 1;
TD.IsolationLevel := XILReadCommitted;
DM.SQLC.StartTransaction(TD);
DM.SDS_Receitas.Delete;
DM.SDS_Receitas.ApplyUpdates(0);
DM.SQLC.Commit(TD);[/color:095afb6b05]

Tabela Itemos = Detalhe
Receitas = Mestre.

Por favor ajude a resolver esta questão


Responder Citar

29/12/2005

Caninha51

Tenta dar um StartTransaction antes do while e dar um commit lah no final depois de apagar a receita.
E tira todos os outros Starts e commits....

E essa linha do IF eh desnecessário, pois vc jah tah colocando a mesma condição no while! ;)


Responder Citar