Fórum como montar e preencher ClientDataSet a partir de uma query #367460
31/12/2008
0
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
Curtir tópico
+ 0Posts
02/01/2009
Raimundo.farias
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
02/01/2009
Vitor Alcantara
Gostei + 0
02/01/2009
Raimundo.farias
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
06/01/2009
Vitor Alcantara
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
Clique aqui para fazer login e interagir na Comunidade :)