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)
-   -   Delphi 2010 + dbExpress (https://www.clubdelphi.com/foros/showthread.php?t=65176)

ppb 25-11-2009 20:34:58

Delphi 2010 + dbExpress
 
Hola a todos,



Estoy haciendo una aplicación que recibe , a través de TcpServer , datos
que graba en una BD MySql ; para el acceso a las tablas utilizo dbExpress con
"TSqlConnection->TSqlTable->TDataSetProvider->TClientDataSet". Cuando
hago el "ClientDataSet.RefreshRecord" devuelve "Record not found or changed by another user".( que he leido que es lo que hay que utilizar )
Lo he cambiado por "ClientDataSet.Refresh" pero cuando la tabla esta vacía ( y sólo en este caso ) inserto 1 ó mas registros y no se reflejan los cambios. Si la tabla tiene algún registro funciona bien.

Código:

DModuleMain.ClientDataSetPacientes.Insert;
DModuleMain.ClientDataSetPacientes.FieldByName('Campo').AsDateTime:=Now;
....
....
DModuleMain.ClientDataSetPacientes.Post;

DModuleMain.ClientDataSetPacientes.ApplyUpdates(0);
//DModuleMain.ClientDataSetPacientes.RefreshRecord;
DModuleMain.ClientDataSetPacientes.Refresh;

entorno : Delphi 2010 + MySql 5.1

¿ alguien puede echarme una mano ?

Gracias.

Un saludo.

Al González 26-11-2009 19:07:20

¡Hola!

¿Cómo has establecido la propiedad UpdateMode del proveedor y la propiedad ProviderFlags de los campos persistentes?

Respecto a querer refrescar un registro tras aplicarlo a la base de datos, te recomiendo leer este hilo: http://www.clubdelphi.com/foros/showthread.php?t=62154

Saludos.

Al González. :)

ppb 27-11-2009 19:33:05

Cita:

Empezado por Al González (Mensaje 347533)
¡Hola!

¿Cómo has establecido la propiedad UpdateMode del proveedor y la propiedad ProviderFlags de los campos persistentes?

Gracias Al , por tu ayuda .
He echado un vistazo el hilo que comentas y no se si me puede valer.
Tengo el mismo escenario del hilo , dos tablas, utilizo un campo de la primera
para referenciar en la segunda , da la casualidad que el campo del que hablo
es el indice principal de primera tabla y ademas es AutoInc ( propiedad AutoGenerateValue = arAutoInc), con lo cual no se su valor a priori.
En la BD MySql si están los registros , pero cuando quiero recuperar el
indice después de hacer el refresh , siempre me devuelve 0 , solo pasa
cuando la tabla está vacía, si existen registros funciona bien.


campo indice ProviderFlags [pfInUpdate,pfInWhere,pfInKey]
resto ProviderFlags [pfInUpdate,pfInWhere]


la propiedad UpdateMode la tenia a "upWhereAll" la ha cambiado a "upWhereKeyOnly" pero sigue pasando los mismo.


Si se te ocurre algo mas , ya sabes .

Gracias de nuevo por tu ayuda.

toni.vi 28-11-2009 10:36:56

Utiliza upWhereChanged en UpdateMode

rgstuamigo 28-11-2009 14:42:18

De la ayuda de Delphi7>
Cita:

Client datasets work with an in-memory snapshot of the data from the source dataset. If the source dataset represents server data, then as time elapses other users may modify that data. The data in the client dataset becomes a less accurate picture of the underlying data.

Like any other dataset, client datasets have a Refresh method that updates its records to match the current values on the server. However, calling Refresh
only works if there are no edits in the change log. Calling Refresh when there are unapplied edits results in an exception.

Client datasets can also update the data while leaving the change log intact. To do this, call the RefreshRecord method. Unlike the Refresh method, RefreshRecord updates only the current record in the client dataset. RefreshRecord changes the record value originally obtained from the provider but leaves any changes in the change log.

Warning

It is not always appropriate to call RefreshRecord.:eek::o;) If the user's edits conflict with changes made to the underlying dataset by other users, calling RefreshRecord masks this conflict. When the client dataset applies its updates, no reconcile error occurs and the application can't resolve the conflict. ;)

In order to avoid masking update errors, you may want to check that there are no pending updates before calling RefreshRecord. For example, the following AfterScroll refreshes the current record every time the user moves to a new record (ensuring the most up-to-date value), but only when it is safe to do so.:;)

Código Delphi [-]
procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet);
begin
  if ClientDataSet1.UpdateStatus = usUnModified then :eek:
    ClientDataSet1.RefreshRecord; ;)
end;

Hechale una miradita.;).
Saludos...:)

ppb 29-11-2009 13:52:41

Gracias rgs ,
salta una excepción solo cuando la tabla esta vacía
exception class EDBClient with message 'At beginning of table'"
no se si al final tendré que hacer una chapuzilla para salir de aquí . como crear una registro inútil cuando la tabla este vacía o algo así.

de nuevo gracias por vuestro tiempo

también he probado la sugerencia de toni.vi y el resultado es el mismo.


La franja horaria es GMT +2. Ahora son las 11:50:34.

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