Aqui tengo parte del codigo que uso cuando creo un nuevo registro, donde necesito obtener un código cuando se inserta uno nuevo y después grabarlo dicho registro antes de seguir actualizando. Utilizo DBExpress de la siguiente forma:
DBConnection --> SQLQuery --> TDatasetProvider --> ClientDataset
Despues del ApplyUpdates (en el codigo de abajo) me voy a cualquier campo del formulario e intento modificar algo, pero en ese momento se genera una execepcion, "unknow cursor".
En las funciones ObtenUltimoNumero y ActualizaNumeracion, necesito actualizar el contador de asuntos (mediantes consultas sql update), y debo hacerlo dentro de una transacción por si falla la inserción del nuevo registro, poder asi luego hacer un rollback.
- Es correcta la utilización de la transacción?
- despues de hacer un applyupdates, se puede seguir modificando los datos del formulario?
- Tengo que volver a pasarle los parametros al clientDataset??
Código:
procedure TAsuntosCDS.AsuntoNewRecord(DataSet: TDataSet);
var TD: TTransactionDesc;
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
AsuntosCDS.Asunto.FieldByName('CODASU').Asinteger:= ObtenUltimoNumero;
try
if not Data_principal.SQLConnection1.InTransaction then
Data_principal.SQLConnection1.StartTransaction(TD);
ActualizaNumeracion(AsuntosCDS.Asunto.FieldByName('CODASU').AsInteger);
if AsuntosCDS.Asunto.ApplyUpdates(0) = 0 then
Data_principal.SQLConnection1.Commit(TD)
else
Data_principal.SQLConnection1.Rollback(TD);
except
AsuntosCDS.Asunto.CancelUpdates;
Data_principal.SQLConnection1.Rollback(TD);
raise;
exit;
end;
end;