FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
Hola
Cita:
Código:
if not Data_principal.SQLConnection1.InTransaction then Cita:
Cita:
¿ 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). |
|
|
|