Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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

Saludos
__________________
No todo es como parece ser...
Responder Con Cita
  #2  
Antiguo 30-09-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 30-09-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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..

__________________
No todo es como parece ser...
Responder Con Cita
  #4  
Antiguo 30-09-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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..
__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 30-09-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #6  
Antiguo 30-09-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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..
__________________
No todo es como parece ser...
Responder Con Cita
  #7  
Antiguo 30-09-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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..
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...
Responder Con Cita
  #8  
Antiguo 30-09-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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.....

Saludos
__________________
No todo es como parece ser...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:41:33.


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