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)
-   -   Enviar al BD solo los registros que se actualizaron (https://www.clubdelphi.com/foros/showthread.php?t=12872)

karocs 29-07-2004 21:05:49

Enviar al BD solo los registros que se actualizaron
 
Hola

Hago una consulta a la base de datos, y mantengo los registros localmente en un ClientDataSet, y actualizo algunos como puedo hacer un ApplyUpdates sobre los que se modificaron y no enviarlos todos a la Bd nuevamente

Gracias .. ;)

jachguate 29-07-2004 21:19:11

Eso ya lo hace el client dataset solito. Envía solamente los contenidos en la lista que mantiene de añadidos, actualizados y borrados.

Hasta luego.

;)

karocs 29-07-2004 22:15:51

gracias por reponder

ahora... hay alguna propiedad del ClientDataSet que me indique eso, es Modify ?

Gracias ... ;)

jachguate 30-07-2004 00:31:05

Que te indique que :confused: ?

karocs 30-07-2004 15:53:36

Enviar a la BD solo los registros que se actualizaron
 
hola

Alguna propiedad que me indique cuales registros se modificaron en el ClientDataSeT

Saludos...

jachguate 30-07-2004 18:55:53

La propiedad donde se lleva el registro es Delta

Hasta luego.

;)

karocs 02-08-2004 17:05:37

Enviar a la BD solo los registros que se actualizaron
 
Saludos..

Puedo acceder a la propiedad Delta de alguna forma ? o antes de hacer Post o ApplyUpdates coloco la propiedad ?.

Gracias...

__marcsc 02-08-2004 17:23:20

Hola,

no te lo puedo asegurar con exactitud, pero creo recordar que los ClientDataSet tienen dos propiedades de tipo OleVariant, una de ellas Delta y la otra Data.

Data tiene los datos que contiene el DataSet pero es asignable por lo que si tu a un ClientDataSet le asignas Delta a su propiedad Data deberías poder ver solo los registros modificados.

Sorry si hay alguna inexactitud ;)

Saludos.

guillotmarc 02-08-2004 17:28:58

Hola.

Puedes acceder al Delta en el evento BeforeApplyUpdates (lo obtendrás como parámetro del evento).

Para saber si un registro de un clientdataset ha sido modificado, puedes consultar su propiedad UpdateStatus, que puede ser : No Modificado, Modificado, Insertado, Eliminado.

Saludos.

jachguate 02-08-2004 17:37:54

Cita:

Empezado por karocs
o antes de hacer Post o ApplyUpdates coloco la propiedad ?.

Esto es totalmente automático. Podes consultar y manipular la propiedad delta, o incluso hacer que sea visible en un Grid... pero no hace falta que asignes nada a ella.

Hasta luego.

;)

Jordy 02-08-2004 21:12:38

Enviar al BD solo los registros que se actualizaron
 
Hola a todos.

Tengo una aplicación a medias por el siguiente motivo:

Tengo una BD Firebird 1.5 y creo una pantalla con DBEdits cada uno enlazado a un campo de la tabla excepto el campo clave que le introduzco la ref. que yo quiero y al apretar Enter me busca el registro y ya lo tengo en cada campo del formulario. Ahora si modifico algún dato y luego apreto un botón que tengo un ApplyUpdates(0) me da un error de que no me conoce el nombre de la tabla a actualizar (he modificado el parámetro del ApplyUpdates a -1 y a un valor +n y me hace lo mismo).
Todo lo demás buscar, modificar a través de sql, y la elimincación me funciona correctamente, pero esto no y me interesa poderlo hacer.

El tipo de acceso lo hago con:
1 TSQLConnection
1 TSQLQuery
1 TDataSetProvider
1 TClientDataSet
1 TDataSource

los dos primeros son de dbExpress. Lo malo es que tambíen lo he probado con componentes Interbase y me hace lo mismo, en cambio con ADOExpress me funciona bíen. Lo malo de ADO es el tiempo de respuesta de la BD que es mucho más lento que en los otros dos anteriores que es inmedito.
No he probado con BDE ya que dicen que ya está obsoleto, no sé.

Alguien me puede ayudar en este caso ?.
y Vosotros con que componentes lo hariais, ya que es una aplicación Cliente/Servidor con mucho movimiento de información en red con varios ordenadores ?.

Gracias. Jordy.

guillotmarc 03-08-2004 10:45:11

Hola.

Esto me ha ocurrido cuando la consulta de la que se reciben los datos, tiene una subconsulta. El Parser de la sentencia no es muy inteligente, y considera la primera tabla que encuentra, como la tabla a modificar.

En todo caso la solución es sencilla. En el evento OnGetTableName del TDatasetProvider, indícale cual es la tabla a utilizar para modificar los registros.

Saludos.

Jordy 03-08-2004 14:43:18

Hola guillotmarc,

Primero muchas grácias por contestarme.
He probado lo que me has dicho y me da el mismo error. Lo que he hecho es lo siguiente:

He ido al TDatasetProvider y he hecho doble click sobre el evento OnGetTableName y he escrito. TableName := 'Nombre de la tabla';

y me da el mismo error

Project Project1.exe raised exception class EDatabaseError with message 'Table unknow nombre de la tabla at line 1, column 17.

y si le doy a F9

Project Project1.exe raised exception class EDatabaseError with message 'Unable to find record. No key specified'. Process stoped.

No sé sí hago algo mal.

Jordy.

guillotmarc 03-08-2004 17:18:52

Hola.

Respecto al primer problema, verifica el nombre de la tabla, sobre todo el tema de mayúsculas/minúsculas. (En Interbase, por ejemplo, para indicar una tabla con carácteres en minúsuclas, hay que entrecerrar su nombre con dobles comillas).

Respecto al problema de Unable to find record, es debido a que no es capaz de detectar el registro a modificar, debido a que no se ha indicado cual es el campo de clave primaria. Para indicarlo, vé a los campos persistentes del TSQLQuery (no del TClientDataset), y en el campo correspondiente a la clave primaria, actívale el flag pfInKey en su propiedad ProviderFlags.

Saludos.

Jordy 03-08-2004 20:55:10

Muchas grácias Gillotmarc.
Ya que me funciona perfectamente de la siguiente manera.
Yo en Firebird tengo el nombre de la tabla todo en mayusculas, pues he hecho lo qhe tú me has dicho de modificar el nombre de la tabla (antes lo tenía con la primera letra y el resto en minusculas) a mayusculas y todo OK.
En cuanta al segundo problema ha desaparecido.

Muchas Gracias.

Jordy.


La franja horaria es GMT +2. Ahora son las 13:56:21.

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