Lazarus: Banco nativo usando sdfdataset com formato CSV

Publicado por Almir Bispo dos Santos Filho em 23/02/2009

[ Hits: 10.424 ]

Blog: http://adltecnologia.blogspot.com.br

 


Lazarus: Banco nativo usando sdfdataset com formato CSV



Dica para Lazarus: usando o sdfdataset em base de dados nativa, utilizando arquivos de texto (.txt, csv, bat etc).

Às vezes precisamos criar bases nativas para modelar dados de acordo com uma determinada aplicação. Nesta dica faremos uma pequena demonstração: criaremos uma unidade de cadastro onde cada campo de dado é salvo num arquivo de formato csv (comma separated value).

Prossiga assim:
  • Em um form, coloque três edits: edit1, edit2 e edit3;
  • Coloque também um botão.

Obs.: Para cada edit associaremos um campo (que pode ser mostrado para o usuário por labels). Exemplo: para o edit1, colocaremos o label com caption "nome", para o edit2 colocaremos o label com caption "email", para o edit3 colocaremos o label com caption "fone".

Então criaremos um sistema de cadastro usando o evento onclick do botão. Crie um arquivo *.csv numa pasta de sua preferência.

var arq:tstringlist;
begin
arq:=tstringlist.create;
if not fileexists ('caminho do seu arquivo') then
begin
showmessage('Arquivo não existe !');
end;

if fileexists('caminho do seu arquivo') then
begin
arq.loadfromfile('caminho do seu arquivo');
//lembre se: a vírgula é o delimitador padrão neste exemplo
arq.add(edit1.text+','+edit2.text+','+edit3.text);//pegou o nome, email e fone
arq.savetofile('caminho do seu arquivo');
end;
arq.free;
end;

//fazendo uma pesquisa no arquivo que acabamos de criar
//o código abaixo mostra como usar uma pesquisa usando o
//sdfdataset ligado ao dbgrid,tendo como delimitador a vírgula
//pode ser usado no onchange de um edit ou clique de botão
//lembre-se que no exemplo acima criamos 3 campos (nome, email, fone)
//e na propriedade schema do sdfdataset deve-se adicionar um campo
//para cada linha. Exemplo (dentro da propriedade schema):
//
//nome
//email
//fone
//
//coloque mais um edit para fazer pesquisa(edit4)
//coloque um botão para clicar na hora da pesquisa


procedure TForm1.BitBtn2Click(Sender: TObject);
var n,nn:integer;
arq,rel:tstringlist;
dadoa,dadob:string;
m:tmemorystream;
begin

m:=tmemorystream.Create;
arq:=tstringlist.create;
rel:=tstringlist.create;
arq.loadfromfile('caminho do seu arquivo');
n:=0;
repeat
dadoa:=copy(arq.strings[n],1,length(arq.strings[n]));
nn:=1;
repeat
dadob:=copy(dadoa,nn,length(edit4.text));
if dadob=edit4.text then //se o objeto ou parte é encontrado em qualquer linha do arquivo
begin
rel.add(arq.strings[n]); //então é adicionado no resultado
end;
inc(nn);
until(nn=length(dadoa)-length(edit4.text));
inc(n);
until(n=arq.count);
rel.SaveToStream(m); //é salvo para memoria
sdfdataset1.Active:=false;
sdfdataset1.LoadFromStream(m);// o sdfdataset carrega da memoria
sdfdataset1.Active:=true;//o sdfdataset é ativado
sdfdataset1.First;
m.SaveToFile(extractfilepath(application.exename)+'REPORTFIN.BAT');//um relatório de pesquisa é salvo

m.free;
rel.Free;
arq.Free;
end.
//resultado: se usarmos um datasource, um dbgrid e um sdfdataset
//configurado como este exemplo, poderemos ver o resultado da
//pesquisa no sdfdataset

Outras dicas deste autor

Construindo gráfico com Canvas

Adicionando campos de arquivo csv em componente do lazarus

Leitura recomendada

Case e concatenação no SQL - Ajuste de ordem ou posição na tabela

Como criar domínio no WebLogic

Informix: Adicionando um chunk

SQL: UNION ALL vs UNION e ordenação

Informix, administração básica

  

Comentários
[1] Comentário enviado por fpasqueto em 16/07/2009 - 10:21h

excelente artigo, muito bom mesmo parabens, vou utilizar essa sua dica no meu pdv, eu ja havia procurado uma classe pra xml mas nao achei pra lazarus.

[2] Comentário enviado por jlvidals em 10/09/2009 - 06:41h

Beleza!
Vou utilizar para o cadastro da escola. Estamos migrando tudo!

[3] Comentário enviado por GusGraf em 16/11/2017 - 09:14h

Estou engatinhando no Lazarus, segui o projeto acima e ele trava na seguinte linha:(arq.savetofile('/home/dte/banco.csv');
Se remover o banco do local descrito ele avisa que o arquivo não existe, mas na hora de gravar trava. Acabei resolvendo o problema, por algum motivo o arquivo banco.csv estava como somente leitura. Obrigado!

[4] Comentário enviado por gibroh@hotmail.c em 16/11/2017 - 12:12h


[3] Comentário enviado por GusGraf em 16/11/2017 - 09:14h

Estou engatinhando no Lazarus, segui o projeto acima e ele trava na seguinte linha:(arq.savetofile('/home/dte/banco.csv');
Se remover o banco do local descrito ele avisa que o arquivo não existe, mas na hora de gravar trava. Acabei resolvendo o problema, por algum motivo o arquivo banco.csv estava como somente leitura. Obrigado!


Eu vim aqui para te responder,mas percebi que o problema ja foi resolvido.
Atualmente tenho um projeto melhor para csv (Um banco nosql no formato CSV ,inclusive para linux:
https://www.vivaolinux.com.br/comunidade/CSV-Comp-Framework/)



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts