Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-12-2003
cwelx cwelx is offline
Registrado
 
Registrado: nov 2003
Posts: 2
Poder: 0
cwelx Va por buen camino
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;

Última edición por cwelx fecha: 11-12-2003 a las 01:40:43.
Responder Con Cita
  #2  
Antiguo 11-12-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:49:55.


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