Cursores e ClientDataSet
Published: 2020-04-14 12:06:45

**Post publicado originalmente em 12/02/2006 em https://gardelsi.blogspot.com/**

Quando mudei pro Delphi percebi uma certa dificuldade para se criar cursores em memoria para armazenar dados, no foxpro é relativamente simples a criação de um bastando apenas usar o comando "create cursor", pra quem não sabe é super importante o uso de cursores quando se deseja por exemplo vincular a fonte de dados de um grid com um cursor de modo que somente se confirma os registros os dados seja incluídos efetivamente na tabela, esse é um exemplo simples, existe inúmeras aplicabilidades para os cursores.

Ao pesquisar sobre cursores no delphi encontrei um artigo super interessante e estou postando ele aqui.

Este artigo pode ser encontrado em: http://www.clubedainformatica.com.br/documentos/mostraartigo.php?artigo=80

## Tabelas Temporárias no Delphi através do ClientDataSet

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:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/6ca0ma4mn549ph4vfgrx.jpg)

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:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/7omba190qpe3cqq9y1am.gif)

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:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/o7kwvaxo9bnfoxoo288k.jpg)

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:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bmfxcjmd8wj98ox9aui0.gif)

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":

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jv9qa77076gzijhmpnif.gif)

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.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ss909goeoppfh5x806f7.jpg)

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!

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bq8fqkt7j7cyi5yqf9e4.jpg)

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.

## 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.

É isso ae... até mais para todos...