Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   unknow cursor (DBexpress) (https://www.clubdelphi.com/foros/showthread.php?t=5921)

cwelx 11-12-2003 01:32:06

unknow cursor (DBexpress)
 
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;


guillotmarc 11-12-2003 14:32:57

Hola

Cita:

- Es correcta la utilización de la transacción?
¿ Que servidor utilizas ?. En principio casi todos los servidores acceptan varias transacciones simultaneas, por lo que yo quitaría la comprobación :

Código:

if not Data_principal.SQLConnection1.InTransaction then
De forma que aunque haya una transacción en curso, iniciamos una nueva transacción para controlar esta actualización. (Sinó, al hacer un Commit estamos finalizando la transacción en curso, que si estaba aún activa es porqué estaba controlando una actualización que aún no ha finalizado, lo que probablemente provoque un error).

Cita:

- despues de hacer un applyupdates, se puede seguir modificando los datos del formulario?
Si.

Cita:

- Tengo que volver a pasarle los parametros al clientDataset??
No hace falta.

¿ Porque utilizas AsuntosCDS.Asunto.FieldByName('CODASU').Asinteger ? ¿ No seria mejor simplemente Dataset.FieldByName('CODASU').AsInteger ?

Nunca he usado el evento NewRecord, para estas cosas siempre he usado el AfterInsert. No sé si el problema estará aqui, pero puedes probarlo.

Si las acciones de ObtenUltimoNumero y ActualizaNumeracion, las realizas en el Servidor (mediante un procedimiento almacenado), te ahorrarás mucho trabajo en la aplicación. En la aplicación solo tendrias algo como :

procedure TAsuntosCDS.AsuntoAfterInsert(DataSet: TDataSet);
begin
spObtenUltimoNumero.ExecProc;
Dataset.FieldByName('CODASU').Asinteger:= spObtenUltimoNumero.ParamByName('NUMERO').AsInteger;
end;

Como ves, tienes que definir un procedmiento almacenado spObtenUltimoNumero, que cuando lo ejecutas devuelve el ultimo numero como parámetro, y actualiza la numeración.

Saludos.


La franja horaria es GMT +2. Ahora son las 20:14:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi