Insert - Master/Detail

Delphi

27/09/2010

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.
Josmani Perim

Josmani Perim

Curtidas 0

Respostas

Eriley Barbosa

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;
GOSTEI 0
Josmani Perim

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

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
GOSTEI 0
Josmani Perim

Josmani Perim

27/09/2010

Eu sei disso. Agradeço sua atenção. Vou continuar tentanto aqui. Obrigado.
GOSTEI 0
POSTAR