TFileStream (Arquivo TXT)

15/09/2004

Bom dia...

Gostaría de saber como que eu faço pra gravar um arquivo txt nesse FileStream...

Vejam o q fiz quando mando gerar um arquivo....


procedure TfCb042.tbImprimiClick(Sender: TObject);
var  Arquivo : TFileStream;
     registro,
     temp,
     sAux,                //variavel temporaria para CPF ou CGC
     temp1: string;     //variável temporária
     Soma : Real;
     cont,max: integer;    //contador de linhas
     flag    : boolean;    //True = CGC;
                           //False = CPF;
     sData : String;
     ValidaArquivo : Boolean;
     nCounter, banco : Integer;
     Dia, Mes, Ano : Word;
     Dtvenc: TDateTime;

     teste : String;
begin
//  inherited;

  try
    if MessageDlg(´Deseja gerar o arquivo de Boleta Registrada agora?´,
                   mtConfirmation, [mbNo, mbYes&93;, 0) = mrNo then
      Exit
    else
    begin
      gArquivo.Progress := 0;
      cont := 1;
      Soma := 0;
      ValidaArquivo := True;

      with qArquivo Do
      begin
        Close;
        Sql.Clear;
        Sql.add (´SELECT TOP ´+QuantGerar.text+´ * ´);
        Sql.add (´FROM CBCSERCO LEFT JOIN (CBYCONTA RIGHT JOIN CBBCONTR ON CBYCONTA.CBYIDENT = CBBCONTR.CBYIDENT) ON CBCSERCO.CBBIDENT = CBBCONTR.CBBIDENT´);
    //    Sql.Add (´CBYCONTA right join CBBCONTR on (CBBCONTR.CBYIDENT = CBYCONTA.CBYINDET) ´);
        Sql.Add (´Where (CBBGERAD = False) and (CBBMESCO = ´+#39+CB_Mes.Text+39+´) ´);
        Open;
        if qArquivo.RecordCount = 0 then
        begin
          ShowMessage(´Não existe nenhuma boleta gerada para envio.´);
          exit;
        end else
        begin
         showmessage (´há dados!´);//  dsFinanceiro.DataSet.Insert;


      end;

      DateTimeToString(sData,´ddmmyy´,Now);

      banco := 21;

      if banco = 21 then
      begin
        qArquivo.First;

        gArquivo.MinValue := 0;
        gArquivo.MaxValue := qArquivo.RecordCount;

        while not qArquivo.Eof do
        begin
          inc(cont);
          registro := ´´;
          temp := ´´;
          temp1:= ´´;
          Soma := Soma + qValorCBDVLSER.asFloat;
          registro := registro + ´1´;
          registro := registro + ´02´;
          if not fCb001.ValidaCGC(´27400100000161´) then
          begin
            raise ERangeError.CreateFmt(´Favor verificar o CNPJ do Cristo Rei.´, [&93;);
          end;
          registro := registro + ´27400100000161´;

          registro := registro + ´00001828078´+ StringOfChar(´ ´, 9);
          sAux := IntToStr(dsFinanceiro.DataSet.fieldByName(´CBHIDENT´).AsInteger + 2000);
          sAux := StringofChar (´0´, 8 -  length(sAux))+ sAux;
          registro := registro + Calcula_Nosso_Numero(sAux) + StringOfChar(´ ´, 10) + StringOfChar(´ ´, 6) + StringOfChar(´0´, 2) + StringOfChar(´0´, 2);
          registro := registro + StringOfChar(´ ´, 15);
          registro := registro + ´1´;
          registro := registro + ´76´;
          registro := registro + inttostr(dsFinanceiro.DataSet.fieldByName(´CBHIDENT´).AsInteger);
          registro := registro + DateToStr (dsFinanceiro.DataSet.fieldByName(´CBHDTVEN´).AsDateTime);
          registro := registro + FloatToStr (dsFinanceiro.DataSet.fieldByName(´CBHVALOR´).asFloat);
          registro := registro + Mensagem.text;
          registro := registro + StringOfChar(´0´, 6 - Length(inttostr(cont)))+inttostr(cont);
          registro := registro + #1310;
          &91;b&93;Arquivo.Write (registro&91;1&93;, 402);                   &91;/b&93;//ERRO AQUI... Está dando ACCESS VIOLATION

          gArquivo.progress := qArquivo.recno;
          qArquivo.Next;

        end;   //final do while

      end;
    end;
  end;
  Except
    ValidaArquivo := False;
    Arquivo.Free;
  end;

  if ValidaArquivo then
  begin
    with fcb001.qConsulta do
    begin
      Close;
      SQL.Clear;
      SQL.Add(´UPDATE CBHFINAN SET CBHQTHAC = :Valor,             ´);
      SQL.Add(´                    CBHBOLEN = True                ´);
      SQL.Add(´ WHERE CBHCONCI = FALSE                            ´);
      SQL.Add(´   AND CBYIDENT = :Conta                           ´);
      SQL.Add(´   AND CBHBOLEN = False                            ´);
      SQL.Add(´   AND CBHINBRG = True                             ´);
      SQL.Add(´   AND CBHDTVEN BETWEEN :Dtatual AND :Dtvencimento ´);
      SQL.Add(´   AND CBHQTHAC = 0                                ´);

      fcb001.qConsulta.Parameters.ParamByName(´Valor´).Value        := max;
      fcb001.qConsulta.Parameters.ParamByName(´Conta´).Value        := fCb001.qContaCBYIDENT.AsInteger;
      fcb001.qConsulta.Parameters.ParamByName(´Dtvencimento´).value := DateTimeToStr(Dtvenc);
      fcb001.qConsulta.Parameters.ParamByName(´Dtatual´).value      := DateTimeToStr(Now);
      fcb001.qConsulta.ExecSQL;
      fcb001.qConsulta.Filtered := False;
      ShowMessage(´O arquivo foi gerado com sucesso. Favor enviar ao banco.´);
      SaveDialog.FileName := ´Cristo Rei´+ sData + ´.txt´;
      if SaveDialog.Execute then
        Arquivo := TFileStream.Create(ExpandFileName(SaveDialog.FileName), fmCreate)
      else
        exit;

      Arquivo.Free;
    end;
  end
  else
  begin
    ShowMessage(´ATENÇÃO: Por algum motivo o arquivo não pode ser gravado. Favor informar aos responsáveis pelo sistema.´);
  end;
end;



Se alguém puder me ajudar.... desde já agradeço...


Diegus

Melhor resposta

15/09/2004

Colega,

Falta criar o objeto TFileStream. Acredito também que você deveria substituir por TStringList, pois é mais apropriado para o que você está se propondo.

No seu caso, a ordem correta é:

var  Arquivo: TFileStream;
     Registro: String;
begin
  Registro  := ´´;

  Arquivo   := TFileStream.Create(´C:\TEMP\ARQUIVO.TXT´, fmCreate);

  Arquivo.Write(registro[1&93;, 402);

  Arquivo.Free;



Aroldo Zanela

Responder Citar

Outras Respostas

15/09/2004

Marcelo Saviski

Declare a variável registro como [color=green:cd08e0f9ad]registro: string[402][/color:cd08e0f9ad]
talvez funcione


Responder Citar

15/09/2004

Martins

Valeu, estava precisando de algo parecido....


Responder Citar