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
[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!