PDA

Ver la Versión Completa : Copiar TADOQuery a TDataSource


kasper
24-02-2010, 15:42:12
Buenas tardes,
estoy intentando copiar un ADOQuery a un DataSource para después poder liberar el AdoQuery sin perder el contenido en el datasource pero no sé como hacerlo. Si hago lo siguiente
DataSource.DataSet:=ADOQuery1;
se copia correctamente, pero cuando después hago:
FreeAndNil(ADOQuery1);
DataSource.DateSet se queda vacio...

¿Alguien sabe como se puede hacer esto?
Muchas gracias

ContraVeneno
24-02-2010, 16:11:16
Según entiendo, un DataSource es como un puente para que tu sistema (supongamos un Grid) se pueda comunicar con tu consulta (ADOQuery).

Es decir: Grid -> DataSource -> Query

Obviamente, si quitas el Query, el puente ya no tiene destino por lo que el grid no puede mostrar nada...

Vamos, que toda tu información no es que se "copie" en el datasource, tu información sigue estando en el Query.

kasper
24-02-2010, 16:18:25
Según entiendo, un DataSource es como un puente para que tu sistema (supongamos un Grid) se pueda comunicar con tu consulta (ADOQuery).

Es decir: Grid -> DataSource -> Query

Obviamente, si quitas el Query, el puente ya no tiene destino por lo que el grid no puede mostrar nada...

Vamos, que toda tu información no es que se "copie" en el datasource, tu información sigue estando en el Query.

Sí, realmente es así!!! por lo que según entiendo de tu respuesta que no se podrá liberar el Query, no?
Ok, Muchas gracias por tu respuesta!!!
saludos

ZeroHot
24-02-2010, 16:35:08
Estoy de acuerdo con nuestro compañero ContraVeneno tu DataSource reprecenta tu fuente de tus datos entonces cuando le escribes la sentencia

DataSource.DataSet:=ADOQuery1;

en español estas diciendo mi fuente de datos es igual a lo mismo que he consultado con el ADOQuery1, es por eso que cuando cuando liberas tu ADOQuery1 tu fuente se que da vacia y no muestra nada...

Te recomiendo que mejor nos expliques para que situacion quieres usar eso, es decir en realidad que es lo que quieres lograr cual seria la funcionabilidad y tal ves resulte otra forma de hacerlo mucho mas comoda...

Saludos desde R.D

kasper
24-02-2010, 17:03:21
Estoy de acuerdo con nuestro compañero ContraVeneno tu DataSource reprecenta tu fuente de tus datos entonces cuando le escribes la sentencia

Código Delphi [-] (http://www.clubdelphi.com/foros/#)DataSource.DataSet:=ADOQuery1;


en español estas diciendo mi fuente de datos es igual a lo mismo que he consultado con el ADOQuery1, es por eso que cuando cuando liberas tu ADOQuery1 tu fuente se que da vacia y no muestra nada...

Te recomiendo que mejor nos expliques para que situacion quieres usar eso, es decir en realidad que es lo que quieres lograr cual seria la funcionabilidad y tal ves resulte otra forma de hacerlo mucho mas comoda...

Saludos desde R.D

Muchas gracias por tu aportación ZeroHot. Como dices voy a explicar el motivo por el cual quiero hacer esto y si alguien conoce una forma más elegante de hacerlo, lo agradeceré!
Tengo un formulario general y otro donde realizo las consultas a SQLServer. Me gustaría tener separado todo lo que refiere a consultas a SQLServer del formulario general, por lo que hago funciones del estilo:

procedure TForm1.FormCreate(Sender: TObject);
begin
CargarClientes(DataSourceClientes);
DBGridClientes.DataSource := DataSourceClientes; //quiero la
//información para mostrarla en un DBGrid
end;

y esta función está definida en el formulario donde se hacen todas las consultas a SQLServer, como por ejemplo:

procedure CargarClientes(var DataSource: TDataSource);
var
ADOQueryClientes:TADOQuery;
begin
Try
ADOQueryClientes:=TADOQuery.Create(nil);
//se realiza la conexión de "ADOQueryClientes"
//consulta que quiero hacer
ADOQueryClientes.Open;
DataSource.DataSet:=ADOQueryClientes;
Finally
//FreeAndNil(ADOQueryClientes); //está comentado porque si lo
//descomento se pierde la información tal y como hemos estado hablando
End;
end;

Nota: "DataSourceClientes: TDataSource" es un objeto visual del formulario general.

No se si así queda algo más claro. La solución rápida que se me ha ocurrido sería crear el AdoQuery desde el formulario general y pasárselo a la función para que se modifique en ella.
¿Me proponéis algún método mejor?
Muchas gracias por vuestra ayuda!
Saludos

ContraVeneno
25-02-2010, 15:53:33
¿no tienes un módulo de datos (DataModule)?

Ese DataModule te serviría para tener separadas tus consultas de tu formulario principal...

:confused:

kasper
26-02-2010, 11:55:59
¿no tienes un módulo de datos (DataModule)?

Ese DataModule te serviría para tener separadas tus consultas de tu formulario principal...

:confused:


Ok!
No conocía los DataModule así que lo miraré haber que puedo hacer con ellos!
Muchas gracias