PDA

Ver la Versión Completa : Dbgrid con ADO !!!!!!!!!!


TEO127
22-02-2007, 17:24:38
Hola amigos necesito de ayuda, tengo un dbgrid conectado a un datasource y este a un adoquery.

Todo funciona ok, pero lo que necesito es que cuando el usuario cambie los valores en el dbgrid estos no se reflejen automaticamente en la base de datos (no se actualizen los registros) haste que yo se lo diga explicitamente (Ej : Boton "Aplicar Cambios").


Saludos

Neftali [Germán.Estévez]
22-02-2007, 17:44:00
Revisa la ayuda sobre TClientDataSet.
Hay bastante información, pero la idea de funcionamiento es más o menos la que necesitas.
Simplificando mucho es como si fuera un copia local de la tabla; Los cambios se realizan en local y al final puedes aplicarlos todos. Necesitarás algun sistema de recuperación de colisiones/errores pero creo que es lo que necesitas.

Otra opción (pero creo que más compleja) es trabajar con algun componente en memoria y lego al aplicar, realizar los cambios manualmente a la Base de Datos.

TEO127
22-02-2007, 18:01:57
Lo hice (use un TclientDataset) , pero ahora el dbgrid no me deja editar los valores de los campos.

Caral
22-02-2007, 18:08:46
Hola TEO127
Que yo sepa si no hay un dbnavegator o esta en edit la tabla no se cambia nada en el dbgrid por mas que lo modifique el usuario.
El DBgrid lo que hace es enseñar o mostrar la informacion nada mas.
No veo cual es el problema.
Saludos

TEO127
22-02-2007, 18:16:30
Hola Caral , lo que sucede es lo siguiente, si bien el Dbgrid no es mas que un reflejo de los datos de una tabla o una consulta, dependiendo de la configuracion del Dataset asociado, este (el dbgrid) actualiza automaticamente los registros de la tabla cuando el usuario edita un dato (es es el caso de TADOQuery). Ahora bien lo que yo necesito es una forma de poder editar los campos y mantenerlos en una especie de buffer hasta que yo le ordene a la aplicaion actualizar los cambios en la(s) tabla(s) correspondientes. Para esto neftali me recomendo que usara TClientDataset que retiene en memoria los datos de otro Tdataset, sin embargo no me funciono ya que ahora el dbgrid me muestra los datos, pero no me deja modificarlos (editarlos).

Saludos y gracias por tu interes.

Caral
22-02-2007, 18:21:26
Hola TEO127
Para estos casos lo que hago es crear una tabla temporal, se hacen todas las cosas que se quieran y una vez hechas se verifican los datos en esta tabla temporal, si son los correctos o los que me interesan, actualizo la tabla original y a la vez elimino los datos de la temporal.
Para mi es la manera mas sencilla de hacerlo, y ademas evito que el usuario se pueda equivocar directamente sobre la tabla.
No se si sera una medida optima, pero funciona y es facil.
Saludos

Neftali [Germán.Estévez]
22-02-2007, 18:36:05
Revisa cómo lo estás haciendo.
¿Cómo es la consulta?

Aquí te pongo un simple ejemplo; Trabaja con la tabla "dbdemos.mdb" que suele estar en el directorio:
"C:\Archivos de programa\Archivos comunes\Borland Shared\Data\"

Una consulta ADO carga los datos de la tabla "Country" y se modifican sin problemas. Lo que ya no he realizado es la actualización final. Para eso usas el método ApplyUpdates de TClientDataSet.

Caral
22-02-2007, 18:48:26
Hola Neftali
Pregunto: porque un DataSetProvider1 y no un AdoConnection?
Me parece casi lo mismo.
En que se diferencian?
Saludos

Caral
22-02-2007, 19:02:33
Hola
Me contesto a mi mismo.
El DataSetProvider1, trabaja con el ClientDataSet, para mantener la ejecucion de la consulta en memoria.
El adoConnection se puede utilizar siempre, pero se liga al ADoquery y va bien.
Saludos

luisgutierrezb
22-02-2007, 19:08:43
si quieres poder despues deshacer los cambios que mandas a la base de datos, puedes usar transacciones, AdoConnectio.BeginTrans; CommitTrans, RollbackTrans.
pero si quieres que de plano no mande nada, si vas a tener que usar tablas temporales

TEO127
22-02-2007, 19:12:00
Funciono todo ok, luego de unos pequenos ajustes.

1. Declare los campos en forma persistente.
2. Cambie el modo de actualizacion del DatasetProvider.UpdateMode=upWhereChanged.


Gracias por todo, Neftali y Caral.

Neftali [Germán.Estévez]
22-02-2007, 19:15:21
Bueno, creo que son componentes distintos. TDataSetProvider trabaja con el TClientDataset y este su vez trabaja con cualquier Base de Datos; Podrías enganchar el TDataSetProvider a un:
* TADOQuery
* TIBQuery
* TQuery
* ...

En cambio el TADOConnection es el componente de conexión que se usa para trabajar con ADO.
Por ejemplo (imagen (http://img76.imageshack.us/img76/8603/imagen5xk2.png)) -los componentes se conectan en horizontal-:
(1) El primer caso es una conexión ADO normal, sin ClientDataSet
(2) El segundo caso es la misma conexión ADO, pero utilizando TClientDataSet.
(3) Y el tercer caso es una conexión con TClientDataset, pero en este caso utilizando el BDE.

No se si aclara algo, o lía más...:D:D

EDITO: Bueno, ya veo que está todo OK...

Neftali [Germán.Estévez]
22-02-2007, 19:17:49
...pero si quieres que de plano no mande nada, si vas a tener que usar tablas temporales

Eso de "que de plano no mande nada", no lo he entendido. ¿Puedes explicarlo?