Array
(
)

Deletando registro no mestre detalhe

Dpinho
   - 28 dez 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.


Caninha51
   - 29 dez 2005

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


Dpinho
   - 29 dez 2005


Citação:
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?


Aerreira
   - 29 dez 2005

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.


Caninha51
   - 29 dez 2005

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


Dpinho
   - 29 dez 2005


Citação:
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:

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);

Tabela Itemos = Detalhe
Receitas = Mestre.

Por favor ajude a resolver esta questão


Caninha51
   - 29 dez 2005

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! ;)