Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ayuda con exportacion de DBgrid (https://www.clubdelphi.com/foros/showthread.php?t=67513)

microbiano 21-04-2010 00:23:10

ayuda con exportacion de DBgrid
 
les comento:

la finalidad de hacer esto que dejar un archivo plano para poder migrarlo a otro sistema.

cargo un archivo de excel en un dbgrid, has ahi sin problemas, el problema radica cuando toda la informacion del dbgrid la quiero exportar a un archivo de texto para lo cual lo hago con el siguiente codigo:

Código Delphi [-]
procedure TForm1.btn1Click(Sender: TObject);
var
  i : integer;
  a: Integer;
  archivo : TextFile;
  ruta_archivo: string;
  Data : TDataSet;
  begin
  ruta_archivo := ExtractFilePath( Application.ExeName ) + 'prueba.txt';
  AssignFile( archivo, ruta_archivo );
  Data:=DBGRID1.DataSource.DataSet;
  Data.First;
    while not(Data.eof) do
     begin
       for i := 0 to dbgrid1.Columns.Count-1 do
       //for a:=0 to Data.RecordCount- 1 do
        begin
          if FileExists( ruta_archivo ) then
             Append( archivo )
          else
            Rewrite( archivo );
            writeln(archivo,Data.FieldByName(DBGrid1.Columns[i].FieldName).asString+'|');
        end;
        Next;
      end;
end;

bien el problema radica en que solo me guarda el primer registro del dbgrid.

ahora la pregunta es

1.- como hago para recorrer todos los registro del DBGRid y guardarlos en un archivo de texto

2.- hay alguna forma que despues de exportar toda esa informacion, se puedan eliminar de ese archivo caracteres como por ejemplo espacio comas,puntos, asteriscos,acentos, caracter de numero

3.- me podrian ayudar por favor.

Enan0 21-04-2010 14:02:17

esta es la solucion

Código Delphi [-]

ruta_archivo := ExtractFilePath( Application.ExeName ) + 'prueba.txt';
  AssignFile( archivo, ruta_archivo );
       if FileExists( ruta_archivo ) then
             Append( archivo )
          else
            Rewrite( archivo );
  while not DBGrid1.DataSource.DataSet.Eof do begin

       for i := 0 to dbgrid1.Columns.Count-1 do
        begin
            write(archivo,DBGrid1.DataSource.DataSet.FieldByName(DBGrid1.Columns[i].FieldName).asString+'|');
        end;
        Writeln(archivo);
        DBGrid1.DataSource.DataSet.Next;
      end;

        CloseFile(archivo);

tambien te hice un cambio para que te queden los datos separados por el pipe y no por lineas + pipe.

saludos

Neftali [Germán.Estévez] 21-04-2010 14:12:52

El Next, debería saltar al siguiente registro.

Lo más sencillo es que ejecutes ese código paso a paso y veas porqué no salta al siguiente registro. Podrás ver si hay algun error y se detiene o porqué no funciona evaluación del:

Código Delphi [-]
data.EOF

AÑADO: Veo que se me adelantaron.

Enan0 21-04-2010 14:18:25

En tu caso tenes 2 cosas mas.. reabris siempre el archivo... (en cada loop)

y despues le haces un NEXT.. a nada!!

tendrias que poner DATA.NEXT


y por ultimo cerrar el archivo..


PAra Tratar los caracteres lo que podes hacer es assigarlos a una variable de TEXTO, en vez de al archivo.. y ahi modificarlo!! (cambiar lo que quieras y por ultimo guardarlo)

Tambien podrias hacerlo con un TSTringList

y te olvidas del problema de writeLn yWrite and Close y todo eso!!!

Quedaria mas o menos asi.




Código Delphi [-]
var

 i : integer;
  a: Integer;
  archivo : TStringList;
  Data : TDataSet;
  s:String;
  begin
  Archivo:=TStringList.Create;
  Data:=DBGRID1.DataSource.DataSet;
  Data.First;
    while not(Data.eof) do
     begin
        s:='';
       for i := 0 to dbgrid1.Columns.Count-1 do
       //for a:=0 to Data.RecordCount- 1 do
        begin

            s:=s+(Data.FieldByName(DBGrid1.Columns[i].FieldName).asString+'|');
        end;
        archivo.Add(s);
        data.Next;
      end;
     if FileExists('Test.txt') then DeleteFile('Test.txt');
     archivo.SaveToFile('Test.txt') ;

end;

subzero 21-04-2010 19:05:04

Hola, se que estas armando un archivo de texto recorriendo un dbgrid, quizas haz revisado la posibilidad de recorrer la consulta almacenar esta info en un memo con las consideraciones que debe tener cada campo y luego guardarlo. La idea es en tiempo de ejecución conocer el comportamiento de tu procedimiento quizas sea otra opción, saludos

microbiano 22-04-2010 00:16:26

gracias enano
 
podrias poner un ejemplo,
la verdad ya intente meter todos los caracter que quiero reemplazar en una base pero no puedo solucionarlo

hice lo siguiente;

Código Delphi [-]
procedure TForm1.btn2Click(Sender: TObject);
var
i : integer;
  a: Integer;
  archivo : TStringList;
  Data : TDataSet;
  cadena:String;
  letra: String;
  reemplaza: string;
begin
  Archivo:=TStringList.Create;
  Data:=DBGRID1.DataSource.DataSet;
  Data.First;
  letra:='';
  while not(Data.eof) do
     begin
        cadena:='';
       for i := 0 to dbgrid1.Columns.Count-1 do
       //for a:=0 to Data.RecordCount- 1 do
        begin
         cadena:=cadena +(Data.FieldByName(DBGrid1.Columns[i].FieldName).asString+'|');
        end;
        archivo.Add(cadena);
        data.Next;
      end;
  Q_carac.Open;
//cuando hago el open hace la siguiente consulta: select * from caracter
  while Q_carac.Eof do
  begin
    letra:=(Q_carac.fieldByname('caracter').AsString);//aqui es donde recorro todos los caracter que quiero reemplazar
    cadena:=StringReplace(cadena,letra,'',[rfReplaceAll]);//y aqui hago en reemplazo en la cadena pero no funciona :-(
  end;

     if FileExists('Test.txt') then DeleteFile('Test.txt');
     archivo.SaveToFile('Test.txt') ;
end;


alguna idea

microbiano 23-04-2010 15:40:31

aun no logro resolver el problema de reemplazar
 
alguna mejor idea para reemplazar cierto caracter de una cadena.

Gatsoft 10-10-2012 18:59:46

LB_NOMBRES.Caption:=SearchAndReplace(LB_NOMBRES.Caption,'É','E')


Código Delphi [-]
FUNCTION SearchAndReplace(sSrc, sLookFor, sReplaceWith : string) : string;
VAR
   nPos, nLenLookFor : integer;
BEGIN
   nPos := Pos(sLookFor, sSrc) ;
   nLenLookFor := Length(sLookFor) ;
   while (nPos > 0) do begin
     Delete(sSrc, nPos, nLenLookFor) ;
     Insert(sReplaceWith, sSrc, nPos) ;
     nPos := Pos(sLookFor, sSrc) ;
   end;
   Result := sSrc;
END;

rretamar 10-10-2012 19:55:45

Recorriendo un dataset:

Código Delphi [-]
DataSet.DisableControls; // Deshabilitamos la actualización de componentes visuales, para que no se vea por ejemplo en las grillas cómo se va "moviendo" el puntero al registro actual
DataSet.First;
While Not DataSet.Eof Do 
  Begin
    { Aqui se coloca el código para leer los datos de cada registro y hacer algo con ellos }
  DataSet.Next; // Avanzamos al siguiente registro
End;
DataSet.EnableControls;

Luego de este recorrido de un dataset, el puntero estará en el último registro. Si queremos conservar la posición para restaurarla al final, podemos usar un objeto TBookmark.

ecfisa 10-10-2012 20:12:06

Hola microbiano.

¿ Y no te convendría recorrer los campos directamente del TDataSet ?

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  s : string;
begin
  with TStringList.Create do
  try
    DataSet.First;
    DataSet.DisableControls;
    while not DataSet.Eof do
    begin
      for i:= 0 to DataSet.FieldCount-1 do
        s:= s + DataSet.Fields[i].AsString + '|';
      DataSet.Next;
    end;
    Q_carac.Open;
    while not Q_carac.Eof do
    begin
      s := StringReplace(s, Q_Carac.FieldByName('caracter').AsString, '', [rfReplaceAll]);
      Q_carac.Next;
    end;
    Q_carac.Close;
    SetLength(s, Length(s)-1);
    Text:= s;
    SaveToFile(ExtractFilePath(Application.ExeName) + 'prueba.txt');
  finally
    Free;
    DataSet.EnableControls;
  end;
end;

Saludos.

Edito: No había visto el mensaje de rretamar, que te sugiere lo mismo.


La franja horaria es GMT +2. Ahora son las 00:24:15.

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