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
|