Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas al crear TXT y asignar un String (https://www.clubdelphi.com/foros/showthread.php?t=25700)

lucasarts_18 30-09-2005 17:29:00

Problemas al crear TXT y asignar un String
 
Holas:

Estoy trabajando con archivos TXT, tengo unas rutinas que verifican si el archivo exista o no, si no existe lo creo y le asigno un String,pues aquí sucede siempre el problema, me da un error I/O Errror 103. No obstante si el archivo ya se encuentra creado no tengo ningún problema.

Les dejo el código:

Código Delphi [-]
 chdir('C:\');
   if not FileExists('BOL_FECHA.txt') then
     FileCreate('BOL_FECHA.txt');
   AbrirArchivo('BOL_FECHA.txt');

Código Delphi [-]
 procedure TFrmInterfaz.AbrirArchivo(Nombre : ShortString);
 begin
   chdir('C:\');
   try
     assignfile(Archivo,Nombre);
     append(Archivo);
   except
     closefile(Archivo);
     ShowMessage('Se ha producido un error al intentar abrir el archivo');
   end;
 end;
 

 procedure TFrmInterfaz.CerrarArchivo(Nombre : ShortString);
 begin
   closefile(Archivo);
 end;

Trabajo con Delphi 7...
Gracias anticipadas al que pueda brindarme una ayuda :D

Saludos

maeyanes 30-09-2005 17:42:27

Necesitas manejar los archivos de texto de esa manera?

Por que también puedes usar la clase TStringList para hacer lo que necesitas.

Código Delphi [-]
var
  ATextFile: TStringList;

begin
  ATextFile := TStringList;
  try
    if FileExists('bol_fecha.txt') then
      ATextFile.LoadFromFile('bol_fecha.txt');
    // Aquí manipulas el archivo por ejemplo:
    ATextFile.Add('Una línea nueva al final');
    ATextFile.Insert(3, 'Insertando una línea en la 4ta. pocisión');
    ATextFile[0] := 'Cambiando el contenido de la primera línea');
    ATextFile.Delete(2); // Eliminando la 3ra. fila
    ATextFile.SaveToFile('bol_fecha.txt')
  finally
    ATextFile.Free
  end
end;

lucasarts_18 30-09-2005 17:54:43

Hola:

Yo creo que andaría bien, pero el problema me sucede cuando el archivo TXT no existe y por lo tanto yo lo tengo que crear..

:rolleyes:

lucasarts_18 30-09-2005 17:59:31

Hola:

Olvidé escribir esto:

Código Delphi [-]
 procedure TfrmInterfaz.EscribirArchivo;
 begin
   writeln(Archivo,concatenacion);
   writeln(Archivo,' ');
   flush(Archivo);
 end;

y les dejo toda la rutina para que se comprenda mejor:

Código Delphi [-]
 procedure TFrmInterfaz.btnBolFechaClick(Sender: TObject);
 var
   tipo,boleta_id,rut,fecha,lote,codigo,monto,descuento,montomp,
   codigo_Doc,nro_documento,fecha_vcto,cod_articulo,cantidad,
   preciounitario : String;
   cantidad_doc : SmallInt;
   venta_id : String;
 begin
   chdir('C:\');
   if not FileExists('BOL_FECHA.txt') then
     FileCreate('BOL_FECHA.txt');
   AbrirArchivo('BOL_FECHA.txt');
   with DMServidores.OQryBoletaFecha do
   begin
     SQL.Clear;
     Close;
     SQL.Add('Select * from Out_Venta');
     Execute;
     while Eof = False do
     begin
       tipo := Uppercase(Field(0));
       boleta_id := UpperCase(Field(1));
       rut := QuitarGuion(UpperCase(Field(2)));
       fecha := FormatDateTime('ddmmyyyy', StrToDate(Field(3)));
       lote := UpperCase(Field(4));
       codigo := UpperCase(Field(5));
       monto := UpperCase(Field(6));
       descuento := UpperCase(Field(7));
       venta_id := UpperCase(Field(8));
       concatenar(tipo,boleta_id,rut,fecha,lote,codigo,
                  monto,descuento);
       With DMServidores.OQryMedioPago do
       begin
         SQL.Clear;
         Close;
         SQL.Add('Select * From Out_Venta_Medio_Pago');
         SQL.Add(' Where Venta_Id =' + venta_id );
         Execute;
         while EOF = False do
         begin
           cantidad_doc := RowsProcessed;
           montomp := UpperCase(Field(1));
           codigo_Doc := UpperCase(Field(2));
           //dateseparator := #0;
           if varisnull(Field(3)) or VarIsEmpty(Field(3)) then nro_documento := FormatDateTime('ddmmyyyy', date)
           else nro_documento := UpperCase(Field(3));
           //dateseparator := #0;
           fecha_vcto := FormatDateTime('ddmmyyyy', StrToDate(Field(4)));
           Concatenar(cantidad_doc,montomp,codigo_doc,nro_documento,fecha_vcto);
           Next;
         end;
 
       end;
       With DMServidores.OQryVentaDet do
       begin
         SQL.Clear;
         Close;
         SQL.Add('Select * from Out_Venta_Detalle');
         SQL.Add(' Where Venta_Id =' + venta_id );
         Execute;
         while EOF = False do
         begin
           cod_articulo := UpperCase(Field(1));
           cantidad := UpperCase(Field(2));
           preciounitario := UpperCase(Field(3));
           concatenar(cod_articulo,cantidad,preciounitario);
           Next;
         end;
       end;
       EscribirArchivo();
       next;
     end;
     Free;
     CerrarArchivo('bol_fecha.txt');
     Showmessage('Datos traspasados con exito');
     concatenacion := '';
   end;
 end;

insisto el problema solo sucede cuando el archivo TXT no existe

Saludos..

maeyanes 30-09-2005 18:46:59

Parece que no me entendiste o no me explique bien... jejeje

Voy a tratar de usar tu código para que entiendas:

Código Delphi [-]
procedure TFrmInterfaz.btnBolFechaClick(Sender: TObject);
var
  // Todas tus declaraciones
  ATextFile: TStringList;

begin
  ATextFile := TStringList.Create;
  try
    chdir('C:\');
    // Si el archivo existe lo abrimos, si no, no hay problema
    if FileExists('BOL_FECHA.txt') then
      ATextFile.LoadFromFile('BOL_FECHA.txt');
    with DMServidores.OQryBoletaFecha do
    begin
      // Aquí tu código...
      // En donde usas el procedimiento Concatenar utiliza:
      ATextFile.Add(tipo + boleta_id + rut + fecha + lote + 
        codigo + monto + descuento)
    end;
    { Aquí guardas el contenido de ATextFile a un archivo, si no existe, 
      el método lo crea: }
    try
      ATextFile.SaveToFile('BOL_FECHA.txt')
    except
      ShowMessage('Ocurrió un error guardando el archivo')
    end
  finally
    ATextFile.Free
  end
end;

No se que hace exactamente el procedimiento o función Concatenar, pero me imagino que une el contenido de las variables en una sola línea y la agrega al archivo que estás manejando. Es por eso que solo use el (+) para unirlas de la misma manera.

Espero que con esto me de a entender mejor.


Saludos...

lucasarts_18 30-09-2005 20:33:03

Hola:

maeyanes, gracias resulto de maravilla, ya no se cae..
No quedo igual como lo expusiste tú ya que tendría que haber cambiado algunas cosas, pero lo acomodé a lo lógica del programa y está funcionando bien..

Nuevamente gracias..

Saludos

PD: No está malo saber porque de la otra forma se caía..:(:confused:

maeyanes 30-09-2005 21:21:37

Cita:

Empezado por lucasarts_18
Hola:

maeyanes, gracias resulto de maravilla, ya no se cae..
No quedo igual como lo expusiste tú ya que tendría que haber cambiado algunas cosas, pero lo acomodé a lo lógica del programa y está funcionando bien..

Nuevamente gracias..

Saludos

Que bueno que te sirvió así... :)

Cita:

Empezado por lucasarts_18
PD: No está malo saber porque de la otra forma se caía..:(:confused:

Buscando en google encontré esto: http://www.faqts.com/knowledge_base/...html/aid/24059

Aquí lo reproduzco:
Código Delphi [-]
{ Delphi: File: Error: I/O Error 103

Cause:
A file is assigned and then closed, but the file pointer has not
(for all possible cases) been reset or rewritten, in between.

---

Solution:
Reset or rewrite the file pointer in all possible cases.

---

The source code with the problem looks like this: }
procedure TForm1.PROCFileCreateNew( filenameS : string );
var fP : TextFile;
begin
 AssignFile( fP, filenameS );
 if FNFileCheckExistNotB( filenameS ) then begin
  Reset( fP );
 end;
 Close( fP );
end;

// Then the error occurs in Close( fP );

{---

Solution:
You should in any case reset the file pointer (using 'reset'
or 'rewrite') between you 'assigned' the file until it reaches the
'close'.

E.g. like this: }
procedure TForm1.PROCFileCreateNew( filenameS : string );
var fP : TextFile;
begin
 AssignFile( fP, filenameS );
 //
 // so you also cover all other possibilities
 // (like also in the other branch of the 'if')
 // between assign and close
 // by putting or a reset or a rewrite there
 //
 if FNFileCheckExistNotB( filenameS ) then begin
  Rewrite( fP );
 end
 else begin
  Reset( fP );
 end;
 Close( fP );
end;

Espero que esto te de una idea de por que el error en el código original.


Saludos...

lucasarts_18 30-09-2005 22:42:43

Hola:

Maeyanes, gracias al link que me enviaste he logrado corregir el error por el cual inicie este post, aunque me quedo con tu idea, al parecer es mejor manejarlo así, de esa manera.

dejo la solución por si alguien la necesita...

Código Delphi [-]
 procedure TForm1.Button1Click(Sender: TObject);
 begin
   chdir('C:\');
   AssignFile(Afile,'Hola.txt');
   if fileexists('Hola.txt') then
   begin
     Reset(Afile);
     existe := True;
     escribir();
   end
   else
   begin
     Rewrite(Afile);//esto creo el archivo si no existe....
     escribir;
   end;
 end;
 
 procedure TForm1.escribir;
 begin
   if existe = True then
   begin
     append(Afile);
     Writeln(Afile,'Hola');
   end
   else
     Writeln(Afile,'Hola');
 
   flush(Afile);
   CloseFile(Afile);
 end;

No sé si será la mejor forma de hacerlo pero es la única manera que encontré, tuve que quitar la función FileCreate (para que diablos está !!!!, si con rewrite se puede crear archivos, la unica diferencia que yo veo es FileCreate no necesita una variable asociada, crea directamente el archivo)

No sé si estaré en lo acertado, pero cualquier correción estoy con los ojos bien abierto para aprender....:D.

Saludos


La franja horaria es GMT +2. Ahora son las 02:01:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi