FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 .. |
#2
|
||||
|
||||
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.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
|||
|
|||
gracias por reponder
ahora... hay alguna propiedad del ClientDataSet que me indique eso, es Modify ? Gracias ... |
#4
|
||||
|
||||
Que te indique que ?
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
Enviar a la BD solo los registros que se actualizaron
hola
Alguna propiedad que me indique cuales registros se modificaron en el ClientDataSeT Saludos... |
#6
|
||||
|
||||
La propiedad donde se lleva el registro es Delta
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
|||
|
|||
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... |
#8
|
||||
|
||||
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. |
#9
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#10
|
||||
|
||||
Cita:
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#11
|
|||
|
|||
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. |
#12
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#13
|
|||
|
|||
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. |
#14
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#15
|
|||
|
|||
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. |
|
|
|