Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 17 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
72 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Tabelas Temporárias através do ClientDataSet
Publicado por Admin : Quinta, Dezembro 19, 2002 - 07:36 GMT-3 (18645 leituras)
Comentários 3 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Alguns colegas meus de Delphi acreditam que não seja possível criar tabelas em memória com os componentes nativos do Delphi. E para tal feito usam componentes externos como a RXLib. O que eu sempre digo a eles é:
Vocês conhecem o ClientDataSet ?.

Infelizmente muitos respondem que não ou simplesmente eles tem a seguinte idéia do ClientDataSet na cabeça:

É de apenas podermos usar o ClientDataSet quando formos trabalhar com Midas e ou Objetos Distribuídos. E desta forma, deixam de estudá-lo e aprender alguns recursos que esse poderoso componente nos oferece. Outra desculpa é que seus sistemas não se baseiam nessas tecnologias. E entre os mais variados recursos que o ClientDataSet nos traz é o de criarmos "tabelas" em memória sem vinculo com o Banco de Dados.

Vamos iniciar a nosso exemplo colocando um ClientDataSet no FORM, vá até a ABA Midas e coloque o ClientDataSet no Form. Seu Name será: ClntDtStExemplo, após isso, coloque um DataSource e seu Name será: DtSrcExemplo e coloque também um DBGRID para visualizarmos os registros, e seu Name será: DBGrdExemplo.

Ok. Sua tela deve ficar parecida com a seguinte:

    


      

     Neste momento precisamos adicionar as Colunas no qual iremos trabalhar no ClientDataSet.      Dê um duplo clique em cima do componente ClientDataSet para incluirmos as colunas nas quais iremos trabalhar. O processo é o mesmo como se estivéssemos incluindo as colunas no Field Editor "TFields" de um TTable, TQuery e ou qualquer componente descendente de TDataSet.

     Atento para o fato de que todos as colunas que iremos incluir será: "New Field". Isto é, um novo campo !. Segue um exemplo:
    

     

     Ok. Vamos incluir três colunas para este exemplo, mas, você pode incluir quantas colunas desejar.

     Vamos incluir a coluna: CODIGO.

     Escolha New Field no passo anterior, deve aparecer a seguinte tela:
    

     

     Na propriedade Name coloque: CODIGO, a propriedade Component é preenchida automaticamente. O Tipo "Type" neste caso é: Integer. O Tamanho "Size" por Default é 0.

     No Grupo Field Type escolha: Data. Após isso, clique em Ok.

     Desta forma estamos informando ao ClientDataSet que criamos uma coluna virtual chamada "CODIGO". Ok. Vamos incluir as outras colunas.

     Vamos seguir os passos citados acima até novamente aparecer a tela de "New Field". Vamos agora incluir a coluna chamada:

     DESCRICAO;
     Tipo - String;
     Size - 50,

     o tipo da coluna é do mesmo tipo do CODIGO, isto é, Data.

     Vamos agora incluir nossa última coluna. Siga os mesmos passos citados acima até aparecer a tela de "New Field". Essa coluna irá se chamar:

     VALOR_COMPRA;
     Tipo: Currency;
     Size por Default é 0, o tipo da coluna é: Data.

     Se tudo ocorreu sem problemas, devemos ter a seguinte tela:
   

  

     Ok. Neste momento, ligamos o DataSource ao ClientDataSet através da propriedade: DataSet, após isso, ligamos o DBGRID ao DataSource através da propriade: DataSource. Ainda nos falta um passo apenas para podermos dizer que vamos trabalhar com a tabela em memória. O de realmente criarmos o DataSet em memória e vazio e esperando a nossa entrada de dados. Para isto, clique com o botão direito em cima do ClientDatSet, devemos ter o seguinte popup menu "tela":

    

      

     Devemos nesse momento escolher a opção: Create DataSet. Pronto !!!!. Temos a nossa tabela em memória com as colunas que criamos. Segue a tela final com as colunas criadas e com a nossa tabela em memória.

    

     

     Repare que os títulos da coluna ficou exatamente igual ao nome da coluna que informamos no Field Editor. É fácil corrijirmos isso, podemos faze-lo da mesma forma que fazemos como se estivéssemos trabalhando com os Field Editor´s de "TTable" e ou "TQuery" como já citados mais acima. Precisamos apenas modificar a propriedade "DisplaLabel" do TFields para que o titulo do GRID apareça da forma como desejamos.

     Ok. Temos a nossa tabela em memória. Os registros serão criados da forma normal como o Delphi trabalha com o DBGRID, isto é, navegando com as setas para incluirmos um novo registro, CTRL+DELETE para excluirmos, ENTER em cima da coluna para alterarmos o conteúdo do campo e assim por diante !.
   

   

     Vocês prestaram a atenção sobre os mecanismos do Delphi nesse exemplo ????.

     Precisamos digitar alguma linha de código para conseguirmos o efeito desejado da nossa tabela em memória ??. Não né !!. Outra, temos algum vinculo com Banco de Dados ??. Não né !!.

     Agora me digam, o DELPHI não é Fantástico ?!.

     Claro que é !. O DELPHI é e continuará sendo a melhor ferramenta de programação para Windows por muito e muito tempo.

     Alguns recursos que o ClientDataSet ainda nos oferece:

     Podemos gravar a nossa estrutura do ClientDataSet através do método: SaveToFile() e buscar essa estrutura através do método: LoadFromFile().

     Se prestarmos atenção nos parâmetros do SaveToFile( const FieldName: string = ´´; Format TDataPacketFormat=dfBinary);

     Podemos ver que temos opções de formato para salvar este arquivo em disco. As duas opções são:

     dfBinary - Todas as informações são gravadas em formato binário;
     dfXML - As informações são gravadas em XML.

     Ressalto para o seguinte:

     Se o nome do arquivo não for informado, TClientDataSet utilizará o nome especificado em FileName. Se não houver um nome atribuído a essa propridade será levantada um exceção!.

     Podemos fazer isso tudo em código, o código para a inclusão das colunas é o mesmo usado para incluirmos colunas em tempo de run-time dentro de uma base de Dados. E para isso, utilizamos o FieldDefs.

     O processo de gravação desses dados em memória, é o mesmo usado no dia a dia. Devemos "navegar" entre o DataSet pegar o conteúdo da coluna e colocarmos na tabela que pretendemos. É claro que no exemplo abaixo, eu necessito de um vinculo com algum Banco de Dados. Neste caso, eu fiz a conexão com o InterBase usando os componentes IBX.

     Segue um pequeno exemplo de gravação do nosso ClientDataSet na base de dados:

     procedure TFrmClientDataSet.ActnGravarExecute(Sender: TObject);
     begin
       { Vamos para o 1o Registro. }
       ClntDtStExemplo.First;
       IBSQL.Transaction := IBDatabase.InternalTransaction;
       { Loop para percorrer os registros no ClientDataSet. }
       while not ClntDtStExemplo.Eof do
       begin  
         IBSQL.Close;
         IBSQL.SQL.Clear;
         { Informamos a Instrução SQL para inclusão dos registros. }
         IBSQL.SQL.Add('INSERT INTO TAB_CLIENTDATASET');
         IBSQL.SQL.Add(' (CODIGO,');
         IBSQL.SQL.Add(' DESCRICAO,');
         IBSQL.SQL.Add(' VALOR_COMPRA)');
         IBSQL.SQL.Add('VALUES ');
         IBSQL.SQL.Add('(:AHRCodigo,');
         IBSQL.SQL.Add(' :AHRDescricao,');
         IBSQL.SQL.Add(' :AHRValor_Compra)');
         { Inicia a transação. }
         if not IBDatabase.InternalTransaction.InTransaction then
         IBDatabase.InternalTransaction.StartTransaction;
         IBSQL.Prepare;
         { Os parâmetros especificados acima. }
         IBSQL.ParamByName('AHRCodigo').AsInteger := ClntDtStExemploCODIGO.AsInteger;
         IBSQL.ParamByName('AHRDescricao').AsString := ClntDtStExemploDESCRICAO.AsString;
         IBSQL.ParamByName('AHRValor_Compra').AsFloat := ClntDtStExemploVALOR_COMPRA.AsFloat;
         { Executa a instrução SQL. }
         IBSQL.ExecQuery;
         try
           { Grava os dados na tabela e fecha a transação. }
           IBDatabase.InternalTransaction.Commit;
         except
           { Ocorreu algum problema. Não gravamos nada e fechamos a transação. }
           IBDatabase.InternalTransaction.Rollback;
         end;
         { Vamos para o próximo registro. }
         ClntDtStExemplo.Next;
       end;
     end;

     Conclusão:

     Fique atento e estude a tencnologia MIDAS e agora no Delphi 6 a DataSnap. DataSnap no Delphi 6 é o Midas com outro nome e alguns recursos a mais. A Borland já vem alertando aos desenvolvedores Delphi para importância desses recursos. No site do The Club está o exemplo completo do nosso artigo.

     É necessário levar junto para a instalação do seu aplicativo a seguinte DLL: midas.dll e a mesma tem de estar no diretório SYSTEM do Windows.


     autor: Anderson Haertel Rodrigues anderson.hr@bol.com.br 



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: rubensavelino : Jan 15, 2003 - 10:23
(Informações sobre o membro | Enviar uma mensagem) http://
Existe algum limite de registro para este Banco de Dados em memoria ????


por: mauricio_rp : Mar 30, 2004 - 01:58
(Informações sobre o membro | Enviar uma mensagem)
Como fazer para carregar uma tabela XML em tempo de execução?? Ou seja, sem usar o load from myBase table).
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados