Delphi5: SQL-Ergebnisse in Text-Datei schreiben

Hallo Delphianer,
die Ergebnisse einer SQl-Abfrage erscheinen in einer DBGrid-Komponente. Ich möchte die Ergebnisse aber zusätzlich in eine Text-Datei schreiben.
Hätte jemand einen Tip für mich, wie ich die DBGrid-Komponente zeilenweise auslesen kann. Oder gibt es vielleicht einen einfacheren Weg (Export in Datei) ?

MfG.
Uwe

Schau mal unter www.torry.ru in den DB Aware Komponenten nach. Dort gibt es DB-Grids, die eine Exportfunktion schon beeinhalten.
Es gibt auch Komponenten, die Datenmengen direkt in eine CSV-Datei schreiben können.
Gruß

Du kannst das Grid natürlich zeilenweise auslesen in der Art:

with myquery do
begin
while not eof do
begin
writeln(myFile,fieldbyname(‚Beispielfeld1‘).asstring…

ist aber ungeschickt.
besser
Plaziere auf das Formualar
ein TBatchmove
ein TTable
übernehme assign die Fielddefs vom Query auf das
Tableobjekt
definiere tabletype tASCII
lege den Tablename fest (4eg mit Savedlg)
Batchmove.execute macht den Rest.

Habe mir einen Dialog definiert mit allen Exports die
ich brauche z.B.
Text
Excel

ist aber mit LMD-Tools und Lametta aufgeblasen
Hier der Sourcecode.
Dfm kannst du selbst gestalten oder von mir als mail haben

unit DlgExpGrid;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms, Buttons,db,dbtables,Grids, DBGrids, RXDBCtrl,
Dialogs,Dlginf1, DbPrgrss, OleServer, Excel97, lmdcompo, lmdclass,
lmdnonvS;

type
TDlgExportGrid = class(TForm)
LBAllColls: TListBox;
tabexport1: TTable;
SaveExportDlg: TSaveDialog;
DBProgress1: TDBProgress;
Panel1: TPanel;
ButOK: TBitBtn;
BitBtn2: TBitBtn;
DBankExport: TDatabase;
LMDStarter1: TLMDStarter;
procedure FormActivate(Sender: TObject);
procedure ButOKClick(Sender: TObject);
procedure DBankExportAfterDisconnect(Sender: TObject);
private
DlgExportDataset : tdataset;
public
end;

Procedure DoDlgExportGrid(TheForm : TForm);

implementation

{$R *.DFM}

Procedure DoDlgExportGrid(TheForm : TForm);
var
DlgExportGrid : TDlgExportGrid;
begin
if TheForm nil then
Begin
DlgExportGrid := TDlgExportGrid.create(TheForm);
DlgExportGrid.DlgExportDataset := nil;
if (TheForm.activecontrol is tdbgrid)
then DlgExportGrid.DlgExportDataset := (TheForm.activecontrol
as tdbgrid).datasource.dataset;
if TheForm.activecontrol is tRXdbgrid
then DlgExportGrid.DlgExportDataset := (TheForm.activecontrol
as tRXdbgrid).datasource.dataset;
if DlgExportGrid.DlgExportDataset nil
then DlgExportGrid.showmodal
else MessageDlg(‚Bitte aktivieren sie zunächst die Tabelle deren‘
+#13+#10+‚Spalten sie exportieren wollen.‘, mtError, [mbOK], 0);
DlgExportGrid.free;
End;
end;

procedure TDlgExportGrid.FormActivate(Sender: TObject);
var i : integer;
begin
DlgExportDataset.GetFieldNames(LBAllColls.items);
for i := 0 to LBAllColls.items.count -1 do
begin
LBAllColls.selected[i] := DlgExportDataset.fieldbyname(LBAllColls.items[i]).visible;
end;
end;

procedure TDlgExportGrid.ButOKClick(Sender: TObject);
var i,j : longint;
myInfobox: TmyInfobox;
begin
if SaveExportDlg.execute then
begin
case SaveExportDlg.Filterindex of
1: tabexport1.tabletype := ttParadox;
2: tabexport1.tabletype := ttDBase;
3: tabexport1.tabletype := ttFoxPro;
4: tabexport1.tabletype := ttASCII;
End;
if SaveExportDlg.Filterindex = 5 then
Begin
TabExport1.Databasename := ‚M3Excel‘;
TabExport1.tablename :=ExtractFileName(SaveExportDlg.filename);
End
else
Begin
TabExport1.Databasename := ‚‘;
TabExport1.tablename := SaveExportDlg.filename;
End;
{lametta}
myInfobox:= TmyInfobox.create(self);
myInfobox.labInfotext.caption := ‚Erzeuge Datenstruktur‘;
myInfobox.Gauge1.maxvalue :=DlgExportDataset.fieldcount;
myInfobox.Gauge1.minvalue :=0;
myInfobox.Gauge1.progress :=0;
myInfobox.show;
myInfobox.labInfotext.refresh;
{End lametta}
tabexport1.FieldDefs.Clear;
for i := 0 to DlgExportDataset.fieldcount-1 do
begin
{lametta}
myInfobox.Gauge1.progress :=i;
myInfobox.Gauge1.refresh;
{End lametta}
if LBAllColls.selected[i]
then tabexport1.FieldDefs.Add(
DlgExportDataset.fields[i].fieldname,
DlgExportDataset.fields[i].datatype,
DlgExportDataset.fields[i].size,
false);
end;
for i := 0 to tabexport1.fieldcount-1 do
tabexport1.fields[i].calculated := false;
tabexport1.IndexDefs.Clear;
try
tabexport1.CreateTable;
tabexport1.open;
DlgExportDataset.first;
{lametta}
myInfobox.labInfotext.caption := ‚Kopiere Datensätze‘;
myInfobox.Gauge1.maxvalue :=DlgExportDataset.recordcount;
myInfobox.Gauge1.minvalue :=0;
myInfobox.Gauge1.progress :=0;
j := 0;
myInfobox.refresh;
{End lametta}
while not DlgExportDataset.eof do
begin
inc(j);
{lametta}
myInfobox.Gauge1.progress :=j;
myInfobox.Gauge1.refresh;
{End lametta}
tabexport1.append;
for i := 0 to tabexport1.fieldcount-1 do
begin
tabexport1.fields[i].assign(
DlgExportDataset.fieldbyname(tabexport1.fields[i].fieldname));
end;
tabexport1.post;
DlgExportDataset.next;
end;
finally
DBProgress1.messagecontrol := nil;
DBProgress1.Gauge := nil;
myInfobox.free;
TabExport1.close;
Session.DropConnections;
if SaveExportDlg.Filterindex = 5 then
Begin
SaveExportDlg.filename := ChangeFileExt(SaveExportDlg.filename, ‚.xls‘);
if RenameFile(‚c:\temp\Export.xls‘,SaveExportDlg.filename) then
Begin
MessageDlg(‚EXCEL-Arbeitsblatt erzeugt‘, mtinformation, [mbOK], 0);
LMDStarter1.Command := SaveExportDlg.filename;
LMDStarter1.execute;
End
else MessageDlg(‚Datei konnte nicht erzeugt werden‘+#13+#10
+‚Siehe c:\temp\export.xls‘, mtError, [mbOK], 0);
End;
end;
end;
end;

procedure TDlgExportGrid.DBankExportAfterDisconnect(Sender: TObject);
begin
MessageDlg(‚Datenbankverbindung wurde beendet‘, mtWarning, [mbOK], 0);
end;

end.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]