como montar e preencher ClientDataSet a partir de uma query

Delphi

31/12/2008

Olá,

gostaria de saber como posso configurar um clientDataSet a partir de uma consulta realizada com um TZQuery, em tempo de execução.

tipo, comecei a fazer algo assim, pois é para ficar em uma função generica que recebe como parametro apenas uma string com a consulta a ser executada e retorna o CDS configurado:


(...)

//cria o clientdataset

cds := TClientDataSet.Create(Self);
cds.CreateDataSet;
cds.LogChanges := false;

sqlstr := ´select case when msg_lido = 1 then ´´Lido´´ else ´´Não Lido´´ end Estatus , f.func_logon, m.* ´ +
              ´FROM mensagens m JOIN funcionarios f on f.func_id = m.func_id_de ´+
              ´WHERE m.func_id_para = :para ORDER BY msg_data_criacao DESC ´;


    cmd.SQL.Clear;
    cmd.SQL.Add(sqlstr); 
    cmd.Open;                //executa a consulta

//**********************
// para cada campo da consulta adiciona o mesmo campo no CDS

    for i:= 0 to cmd.FieldCount - 1 do
    begin
        campo := TField.Create(cds);
        campo.FieldName := cmd.Fields[i].FieldName;
        campo.SetFieldType(cmd.Fields[i].DataType);

        cds.Fields.Add(campo); //Inseri o campo no CDS

    end;

 //******************** ?????????
 // neste ponto consigo visualizar os mesmos campos no CDS mais ainda nao estão populados pois a iteração acima apenas cria os mesmos campos retornados na consulta dentro do CDS.

não sei como criar outro laço para preencher agora, apenas os valores do cmd... 




   //apos preencher todos os campos finaliza o comando.
    cmd.Close;
    cmd.Free;




Minha duvida agora é como inserir os mesmo registros retornados dentro do cds. não posso fazer mensao aos campos explicitamente (atravez de nome ou quantidade de campos ) especificamente para esta consulta pois ela é apenas um parametro da função... logo pode variar de consulta pra consulta...

espero ter sido claro. Agradeço a todos pela atenção.[/code]


Raimundo.farias

Raimundo.farias

Curtidas 0

Respostas

Raimundo.farias

Raimundo.farias

31/12/2008

Bom dia a todos,

Apenas complementando... utilizo outras tecnologias de desenvolvimento e em todas elas é possivel criar um objeto em memoria para armazenamento de dados (table, dataset, etc) e manter este mesmo objeto preenchido e desconectado do banco...

Pois bem estou precisando fazer isto em Delphi. ja desenvolvi uma classe para gerenciamento de conexões e comandos. Consigo efetuar todas as operações necessárias em banco apenas com este serviço.

O PROBLEMA !!!!

o problema surgiu na utilização de DBGrids nos forms que necessitam deste componente para apresentação de dados. Não consigo manter os dados visíveis no grid se, após preencher o mesmo com o resultado da consulta, fechar o comando e desconectar do banco. quando faço isso o grid fica em branco. pensei que estivesse fazendo errado e pedi ajuda a um colega e o mesmo colocou vários destes componentes de conexão a bancos nos forms que tem grids e os configurou do ´jeito´ dele.

resultado, para cada grid ativo ele mantem uma conexão ativa no banco. Abri o mysql Administrator e mostrei a ele a quantidade de conexões ´pinduradas´ no banco por causa dos componentes dele.


Pessoal,

preciso de um jeito de preencher um grid em tempo de execução usando apenas um query (TZQuery no meu caso) e que o mesmo não permanessa conectado enquanto apresenta os dados no grid.


IMPORTANTE !

os grids são somente leitura, logo não tem necessidade de efetuar alterações de dados muito menos manter as conexões ativas já que são somente leitura. apenas para apresentação de dados.


Hoje o que tenho é um metodo em meu objeto de conexão que recebe como parametro uma conexão e um comando, e retorna um DataSource para o grid. Mas o mesmo tem que se manter conectado para não perder os dados.


Agradeço a todos!


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

31/12/2008

Amigo por que você não utiliza DataSet (No seu caso o TZquery) + DataSetProvider + ClientDataSet. Dessa forma você carrega tudo para o clientdataset e depois pode desconectar o seu banco e ficar trabalhando em memória.


GOSTEI 0
Raimundo.farias

Raimundo.farias

31/12/2008

Oi Vitor,

agradeço a atenção!

se puder me explicar melhor. Tipo já tenho meu objeto ´cmd´ (TZQuery) configurado com a conexão e os dados retornados...
como devo instanciar o DataSetProvider e em qual propriedade deste eu informo meu objeto ´cmd´ e apos isto, como proceder com o clientdataset para utilizar o datasetprovider, popular os dados dele o grid e em seguida desconectar o mesmo e o grid permanecer preenchido?

Grato pela atenção!

Raimundo Farias


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

31/12/2008

Amigo o que viria a ser ´cmd´?

Agora funciona basicamente assim:

DataSetProvider ligado ao TQQuery pela propriedade DataSet.
ClientDataSet ligado ao DataSetProvider pela propriedade ProviderName.
DataSource ligado ao ClientDataSet pela propriedade DataSet.
DbGrid ligado ao DataSource.

Você irá chamar a sua consulta através do ClientDataSet em vez do TQuery. Após feito isso você pode desconectar o seu TZQuery que os dados irão continuar em memória através do ClientDataSet.

Isso é só uma visão bem básica do uso desses componentes em conjunto, você irá encontrar bastante material na internet, mais detalhado sobre o assunto.


GOSTEI 0
POSTAR