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)
-   -   IBQuery --> DataSetProvider --> ClientDataset (https://www.clubdelphi.com/foros/showthread.php?t=5496)

pinoxito 24-11-2003 00:49:47

IBQuery --> DataSetProvider --> ClientDataset
 
Hola, tengo una aplicacion con IBQuery --> DataSetProvider --> ClientDataset. Cuando hago el ApplyUpdates en el clientDatset, no se reflejan los cambios hasta que no cierro el formulario, esto es normal? No deberian reflejarse los cambios inmediatamente en la BD cuando se hace el applyupdates? :confused:

Humberto Pertuz 24-11-2003 02:17:37

porque no utilizas mejor un TSQLTable en vez del sqlquery

mosorio 24-11-2003 10:43:22

Hola!
Si mal no recuerdo, debes hacer un refresh al ClientDataset para que se vean los cambios en los componentes DBaware.

Saludos

guillotmarc 24-11-2003 11:34:56

Hola.

Siento estar en desacuerdo con Humberto. Soy totalmente contrario a la utilización de un componente TSQLTable (lo mismo digo de un TTable, TADOTable, TIBTable, ....). Estos componentes acceden a todas las filas y columnas de la tabla, cuando normalmente solo queremos acceder a determinadas filas (lo restringimos con un where en la consulta), y mostrar unas pocas columnas. Esto hará que tengamos que descargar menos datos, y la aplicación y la red vayan mucho mas descargadas.

Respecto a la actualización de los datos, en el propio ClientDataset que ejecuta el ApplyUpdates, los cambios siempre están actualizados. Pero si tienes otro Dataset apuntando a los mismo datos, estos nunca se actualizan automaticamente, tienes que forzar su actualización mediante el Refresh que se ha comentado.

Saludos.

pinoxito 24-11-2003 12:45:10

Borré todas los componentes y empecé de nuevo la relación entre ellos (IBQuery->DatasetProvider-> ClientDatset) y volvi a poner todos los campos persistentes en los clientDatsets con sus propiedades pflags como antes y el DatasetProvider-->pWhereKeyOnly.. A la hora de aplicar cambios no se que pasa que siempre dice "Unable to find record. No key specified" y lo he montado exactamente igual que al principio. En el clientdataset he puesto en los campos persistentes que son clave el providewrflag pfInKey=true... y ya no se que mas hacer... :confused:

guillotmarc 24-11-2003 12:47:10

Hola.

El pfInKey de los ProviderFlags, hay que activarlo en los campos persistentes del IBQuery y no en los del ClientDataset.

Saludos.

pinoxito 24-11-2003 14:01:42

El pfInWhere para que sirve realmente?

guillotmarc 24-11-2003 14:32:23

Hola.

Cuando tu actualizas un cambio en el ClientDataset, el ApplyUpdates no lo pasa al IBDataset para que se ejecute en él, sinó que se construye una sentencia UPDATE que realiza la modificación.

update table set campo1 = valor1, campo2 = valor2, ....
where campo1 = campo1 and campo2 = valor2 and ...

Cuando quitas el pfInWhere de un campo, no se añadirá a la cláusula where de la sentencia update. Esto es util por ejemplo en los campos memo, donde hay que quitarlo para que no esté un campo memo en el where (cosa que no aceptan muchos motores).

Aunque tienes que tener en cuenta que hay 3 formas para realizar las sentencias update. Esto depende del UpdateMode del DatasetProvider.

upWhereAll
upWhereChanged
upWhereKeyOnly

La primera opción construye el select con todos los campos en el Where (excepto naturalmente los marcados sin pfInWhere). La segunda opción construye la cláusula where, con los campos de clave primaria (pfInKey) y los campos que han cambiado, finalmente la 3a. opción solo pone en el where los campos de clave primaria.

Personalmente utilizo la 3a opción (aunque probablemente la más recomendable es la 2a).

Saludos.

brandolin 16-11-2005 20:40:34

Disculpen que tome este hilo de hace un tiempo y reflote el tema es que ma pasa algo similar y para no habrir uno nuevo retomo de donde dejamos... la cosas es asi, trabajo con D7 + Firebird 1.7 + Dbexpress

Tenia una base de datos con dos tablas maestro + detalle que funcionaban muy bien en actualizacion, bajas, etc etc con el componente SimpleDataSet.

Tuve que cambiar los indices y la llave foranea que relaciona a dos tablas y a partir de ese momento empesaron los problema... no actualizaba y daba el error "unable to find record...." cuando se modificaba un dato en la grilla.

Viendo este hilo y sus consejos cambie el simpledataset por IBQuery->DatasetProvider-> ClientDatset y salio andando, el tema es que se me complico demasiado el codigo con estos componentes etc etc....

Habra alguna posibilidad de definir los key en el simpledataset y que funciones o bien que en el dataprovider (del simpledataset) especificar upWhereChanged.

Bueno espero se haya entendido, desde ya muchas gracias


La franja horaria es GMT +2. Ahora son las 05:01:12.

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