PDA

Ver la Versión Completa : Error en DBGrid?


identsoft
21-07-2008, 09:05:18
Un saludo foreros.
Tengo un form con un Button, un DBGrid y un Data Source.
Tengo además un DataModule con SQLConnection, Dataset (de tipo ctQuery), un DataSetProvider y un ClientDataSet (enlazados adecuadamente).
Naturalmente el DataModule está en el uses del form.
La conexion la abrimos (sin problemas) desde el principio.
Inicialmente, DataSet.Active = false y ClientDataset.Active = false
Cuando pinchamos sobre el button, simplemente hacemos:
1.-montamos el CommandText del Query (correctamente)
2.-DataSet.Open
3.-ClientDataSet.Open
Pero no aparecen los datos del Query
Sin embargo, si activamos (desde el IDE, con el commandText preparado) el DataSet y el ClientDataSet si que aparecen todos los datos.
¿Es un error o me dejo algo?
Utilizo Delphi 2006 y Firebird 1.5
Gracias y un saludo para todos

Post: en Delphi 7 sí funciona correctamente (comprobado)

coso
21-07-2008, 11:01:14
Hola : los enlaces son asi

DBGrid.DataSource -> source a conjunto de datos
DataSource.DataSet -> enlace al conjunto de datos asociado -> TQuery, TTable, TDataSet,...
TQuery, TTable, TDataSet . Connection -> conexion a la base de datos (en ADO).

Si, por ejemplo, tienes una configuracion asi :



DataSource1.DataSet := DataSet1;
DBGrid1.DataSource := DataSource1;



y cambias el query, no se te reflejaran los cambios en el dbgrid.

identsoft
21-07-2008, 12:12:33
Y entonces, si quieres modificar el query como hay que hacerlo para que se reflejen los cambios?

coso
21-07-2008, 12:29:44
un dataset es un conjunto de datos. Si el dbgrid o cualquier control apunta a un datasource, debes cambiar la propiedad .dataset de este para apuntar a los datos que tu quieres. En tu caso, segun lo que entiendo, yo haria

1.- montar el query y activarlo
2.- datasource del dbgrid.dataset = query

Caro
21-07-2008, 13:50:57
Coso, identsoft esta manejando DBExpress, por lo que necesita un DataSet que puede ser (SQLQuery, SQLTable o SQLDataSet en este ultimo el commandType puede ser ctQuery, ctTable, ctStoredProc, ademas que es el que esta utilizando Identsoft) cualquiera de esos DataSet debe ir enlazado a un DataSetProvider y el Provider enlazado a un ClientDataSet y el ClientDataSet enlazado recien al DataSource.

De la forma que lo estas haciendo esta bien ademas como dices te funciona en Delphi 7, no manejo delphi 2006, pero por lo que he leído aqui en el foro es que el Driver de Interbase ya no es del todo compatible con firebird. Revisa este hilo http://www.clubdelphi.com/foros/showthread.php?t=57526&highlight=ADO%2A ahi mismo te indica de donde bajarte otro driver para Firebird que es gratuito.

Saluditos

coso
21-07-2008, 13:52:47
Vaya :confused: mea culpa por meter confusion. Gracias caro.

identsoft
22-07-2008, 12:46:52
Gracias coso y Caro por vuestro interes.
Ya lo he solucionado. Lo pongo aquí por si interesa a alguien.
El problema está en volver a reasignar el Dataset al DataSource.
No se porqué razón, pero se pierde esa conexion.
Si antes de hacer el Open, reasignas DataSource.DataSet := DataSet
problema solucionado.

Ahora la cuestión es : ¿porqué unas veces hay que volver a reasignar el DataSet al DataSource y otras veces no hace falta?

Gracias a ambos.

identsoft
23-07-2008, 08:57:26
Perdon, se me ha hido la mano:
DataSource.DataSet := ClientDataSet