quarta-feira, fevereiro 07, 2007

Dica de Delphi - Exportar dataset para arquivo texto de largura fixa

Saudações,

Vez ou outra sempre há a necessidade de se gerar um arquivo texto de
largura fixa, seja para enviar para algum, lugar seja para exportação
para outro sistema. A rotina a seguir faz isso, usando como referencia
para a largura das colunas o próprio tamanho do campo. Detalhe: no
caso de campos Float, eles serão formatados com 3 casas após a
virgula, mas basta uma "mexidinha" no código para adequar à sua
necessidade.

Divirtam-se!

GeraTextoLarguraFixa(Dataset: TDataset; Separador: Char);
var
intI, intII, intIII: Integer;
strLista: TStringList;
strLinha: string;
dlgSalvar: TSaveDialog;
vetLarguraColuna: array of Byte;
begin

if Dataset.Active = False then
begin
MessageDlg('O arquivo texto não poderá ser gerado porque o
Dataset está fechado!',
mtWarning, [mbOk], 0);
Exit;
end;

dlgSalvar := TSaveDialog.Create(Self);
dlgSalvar.Title := 'Salvar Arquivo Texto';
dlgSalvar.Filter := 'Arquivos Texto|*.txt|Todos os arquivos|*.*';


strLista := TStringList.Create;
strLinha := EmptyStr;


SetLength(vetLarguraColuna, Dataset.FieldCount);

for intI := 0 to Dataset.FieldCount - 1 do
if Dataset.Fields[intI].DisplayWidth >
Length(Dataset.Fields[intI].DisplayLabel) then
vetLarguraColuna[intI] := Dataset.Fields[intI].DisplayWidth
else
vetLarguraColuna[intI] := Length(Dataset.Fields[intI].DisplayLabel);


//Cria a primeira linha com os nomes das colunas
for intI := 0 to Dataset.Fields.Count - 1 do
begin
strLinha := strLinha + Dataset.Fields[intI].DisplayLabel;

if vetLarguraColuna[intI] >
Length(Dataset.Fields[intI].DisplayLabel) then
for intII := Length(Dataset.Fields[intI].DisplayLabel) to
vetLarguraColuna[intI] do
strLinha := strLinha + ' '
else
strLinha := strLinha + ' ';
end;

strLista.Add(strLinha);
strLinha := EmptyStr;


for intI := 1 to Dataset.RecordCount do
begin
for intII := 0 to Dataset.Fields.Count - 1 do
begin

if Dataset.Fields[intII].DataType in [ftFloat, ftCurrency,
ftBCD, ftFMTBcd] then
begin
for intIII := Length(FormatFloat('##0.000',
Dataset.Fields[intII].AsFloat)) to vetLarguraColuna[intII] - 1 do
strLinha := strLinha + '0';

strLinha := strLinha + FormatFloat('##0.000',
Dataset.Fields[intII].AsFloat) + ' ';
end
else
begin
strLinha := strLinha + Dataset.Fields[intII].AsString;

for intIII := Length(Dataset.Fields[intII].AsString) to
vetLarguraColuna[intII] do
strLinha := strLinha + ' ';
end;

end;

strLista.Add(strLinha);
strLinha := EmptyStr;
Dataset.Next;
end;


if dlgSalvar.Execute then
try
strLista.SaveToFile(dlgSalvar.FileName);
MessageDlg('O arquivo "' + dlgSalvar.FileName + '" foi gerado
com sucesso!',
mtInformation, [mbOK], 0);
except
on Erro: Exception do
MessageDlg('Não foi possível gerar o arquivo ' +
dlgSalvar.FileName + '.' +
#13#13 + 'Erro:' + #13 + Erro.Message, mtError, [mbOk], 0);
end;

dlgSalvar.Destroy;
strLista.Free;

end;


--
Fernando D. Nappe
Analista de Sistemas

Um comentário:

Itamar disse...

Muito boa! Ótima dica!!!
deu certinho é disso que eu precisava.
Só 2 perguntas: Como eu faço para tirar os cabeçalhos dos campos exportar somente os registros?

E como eu crio uma rotina inversa,isto é, para importar os dados para um DataSet?
Obrigado : Itamar Monteiro