Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Copiar TADOQuery a TDataSource (https://www.clubdelphi.com/foros/showthread.php?t=66517)

kasper 24-02-2010 15:42:12

Copiar TADOQuery a TDataSource
 
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
Código:

DataSource.DataSet:=ADOQuery1;
se copia correctamente, pero cuando después hago:
Código:

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

Cita:

Empezado por ContraVeneno (Mensaje 354889)
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

Código Delphi [-]
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

Cita:

Empezado por ZeroHot (Mensaje 354901)
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 [-]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:

Código:

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:

Código:

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

Cita:

Empezado por ContraVeneno (Mensaje 355049)
¿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


La franja horaria es GMT +2. Ahora son las 09:01:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi