Insert - Master/Detail
Delphi 2007 - FB 2.0
Tenho um form. com Master/Detail dentro de Transação, certinho.
Mas por exemplo, Pedido de Venda, depois q o usuário digita todos os dados os itens e manda gravar,
no BD trigger devolve uma exceção dizendo q não tem SALDO ESTOQUE de um determinado item.
Ai o usuário altera q QTDE desse item e manda gravar novamente, aqui o erro acontece.
1ª Tentativa
-------------------
DM.StartTransaction;
try
cdsMaster.ApplyUpdate(0); cdsDetails.ApplyUpdate(0); // Erro sem saldo (por uma exceção BD trigger DM.Commit;
except
DM.Rollback;
end;
Parece q na 2ª tentativa, o cdsMaster não está mais como "Insert" e não vai mais para o BD. 2ª Tentativa ------------------- DM.StartTransaction;
try
cdsMaster.ApplyUpdate(0); cdsDetails.ApplyUpdate(0); // Erro de FK DM.Commit;
except
DM.Rollback;
end;
Alguém pode me ajudar... é urgente.
try
cdsMaster.ApplyUpdate(0); cdsDetails.ApplyUpdate(0); // Erro sem saldo (por uma exceção BD trigger DM.Commit;
except
DM.Rollback;
end;
Parece q na 2ª tentativa, o cdsMaster não está mais como "Insert" e não vai mais para o BD. 2ª Tentativa ------------------- DM.StartTransaction;
try
cdsMaster.ApplyUpdate(0); cdsDetails.ApplyUpdate(0); // Erro de FK DM.Commit;
except
DM.Rollback;
end;
Alguém pode me ajudar... é urgente.
Josmani Perim
Curtidas 0
Respostas
Eriley Barbosa
27/09/2010
Como o erro ta dando no cdsDetail, o Master ta gravando e quando você altera a quantidade, ta alterando no detail e não no master, então o master não entra em edição ou inserção e você manda dar um applyupdates no master e ai acontece o erro.
Talvez isso resolva:
DM.StartTransaction;
try
cdsMaster.ApplyUpdate(0); cdsDetails.ApplyUpdate(0); // Erro sem saldo (por uma exceção BD trigger DM.Commit;
except DM.Rollback;
if not cdsMaster = dsEdit then cdsMaster.Edit;
end;
try
cdsMaster.ApplyUpdate(0); cdsDetails.ApplyUpdate(0); // Erro sem saldo (por uma exceção BD trigger DM.Commit;
except DM.Rollback;
if not cdsMaster = dsEdit then cdsMaster.Edit;
end;
GOSTEI 0
Josmani Perim
27/09/2010
Obrigado pela resposta, mas já tinha tentado isso.
Isto faz o cdsMaster ficar como "Alteração" e não como "Inclusão" e qdo tento gravar novamente, dá erro no cdsMaster:
"Record not found or changed by another user"
Pq pensa q é uma alteração e não acha o reg. no BD.
GOSTEI 0
Eriley Barbosa
27/09/2010
É que você não pode colocar o cdsMaster em insert, senão vai perder os dados digitados pelo usuário.
DM.StartTransaction;
try if cdsMaster in [dsInsert, dsEdit] then
cdsMaster.ApplyUpdate(0); if cdsDetails in [dsInsert, dsEdit] then cdsDetails.ApplyUpdate(0); // Erro sem saldo (por uma exceção BD trigger DM.Commit;
except DM.Rollback;
end;
De uma olhada neste link, talvez te ajude: http://www.ramosdainformatica.com.br/art_recentes01.php?CDA=316
try if cdsMaster in [dsInsert, dsEdit] then
cdsMaster.ApplyUpdate(0); if cdsDetails in [dsInsert, dsEdit] then cdsDetails.ApplyUpdate(0); // Erro sem saldo (por uma exceção BD trigger DM.Commit;
except DM.Rollback;
end;
De uma olhada neste link, talvez te ajude: http://www.ramosdainformatica.com.br/art_recentes01.php?CDA=316
GOSTEI 0
Josmani Perim
27/09/2010
Eu sei disso.
Agradeço sua atenção.
Vou continuar tentanto aqui. Obrigado.
GOSTEI 0