Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid -> CSV (https://www.delphipraxis.net/147480-dbgrid-csv.html)

Delphi3 9. Feb 2010 18:51

Datenbank: belliebige • Zugriff über: ODBC

DBGrid -> CSV
 
Moin Moin,


ich stehe malwieder total auf den schlauch
kann mir einer mal kurz sagen wie ich eine text datei erstelle und die beschreib

ich habe es mit FileWrite probiert
nur schon beim Fileopen habe ich immer -1 und die Datei wird nicht erstellt

ich will aus einer Query bzw DBGrid eine CSV datei erstellen

nun habe ich schon eine Funktion dafür erstellt

Delphi-Quellcode:
          i := 1;
          zeile := mQuery.Fields[0].asString;
          mQuery.First;
          while not mQuery.Eof do begin
            Zeile := zeile + '; ' + mQuery.Fields[i].asString;

            mQuery.Next;
            inc(i);
          end;
und selbs das läuft noch nicht
wie würdet ihr das machen?
sollte einfach nur eine super einfache lösung sein

mkinzler 9. Feb 2010 18:54

Re: DBGrid -> CSV
 
Delphi-Quellcode:
Nicht eher so:
          mQuery.First;
          while not mQuery.Eof do begin
          begin
             zeile := '';
             for i := 0 to mQuery.Fields.Count -1 do
             begin
                 Zeile := zeile + '; ' + mQuery.Fields[i].asString;
             end;
             mQuery.Next;
             ...//Ausgabe Zeile
          end;
?

Delphi3 9. Feb 2010 19:44

Re: DBGrid -> CSV
 
sieht super aus

nun such ich noch ein kleines beispiel wie ich txt datein erstelle und und fülle

mkinzler 9. Feb 2010 19:55

Re: DBGrid -> CSV
 
Z.B.

Code vor dem obigen Block:

Delphi-Quellcode:
var
  sl: TStrings;
...
begin
  try
    sl := TStringList.Create;
    ...
In der Schleife (Ausgabe):

Zitat:

sl.Add( zeile);
Nach der Schleife:

Delphi-Quellcode:
    sl.SaveToFile( <Dateiname>);
  finally
    sl.Free;
  end;

Delphi3 10. Feb 2010 16:21

Re: DBGrid -> CSV
 
hmm

nun weiss ich wo das problem ist

und zwar

Delphi-Quellcode:
                 Zeile := zeile + '; ' + mQuery.Fields[i].asString;
die Komponente die ich einsetze kennt halt .Fields nicht
setze zur zeit die mODBC ein :(

ich weiss die tQuery kanns auch

gibs sonst eine alternative für mQuery.Fields[i] ?

Delphi3 10. Feb 2010 16:33

Re: DBGrid -> CSV
 
hmm

wollte nun eine neue version von der mODBC installieren

naja und genau an der stelle harkt es
er erwartet immer hinter den Fields immer [] statt .

hmmm ist zum mäusemelken

p80286 10. Feb 2010 16:34

Re: DBGrid -> CSV
 
Entschuldige aber mODBC kennt FIELDS!

Meinen wir das gleiche?
Zitat:

Version: 1.09a last updated 09 Sep 2003
Platform: D3, D4, D5, D6, D7, CB3 & ODBC 3.0
Sources: available
Autor: Konstantin Savelyev
Edit:
klar
Delphi-Quellcode:
Fields[i].Fieldname
Fields[i].asstring
Du mußt ja das Feld aussuchen um das es geht.

Gruß
K-H

Delphi3 10. Feb 2010 16:43

Re: DBGrid -> CSV
 
naja

ja

ich nehme aber eine andere version

http://www.tedsoft.de/mOBDC/download...2002-09-19.zip

Delphi3 10. Feb 2010 16:50

Re: DBGrid -> CSV
 
verdammt

quark
ich bin dumm
das ist garnicht das problem

und zwar das problem ist leider in einer anderen zeile

Delphi-Quellcode:
 mQuery.Fields.Count -1
naja da muss ich wissen wieviele spalten es gibt :(

hmm dumm

p80286 10. Feb 2010 16:56

Re: DBGrid -> CSV
 
Ich hab Dir was herauskopiert, ist zwar Futter für ein Stringgrid aber das Prinzip ist das gleiche:

Delphi-Quellcode:
var
  tl : tStringlist;
....
  tl:=tStringlist.Create;
  ....
  if not DM_1.mQuery1.eof then begin
    for i:=0 to DM_1.mQuery1.fieldcount-1 do
      dummy:=dummy+DM_1.mQuery1.fields[i].fieldname+#9;
    delete(dummy,length(dummy),1); {trailing TAB to delete}
    tl.add(dummy);

    repeat
      dummy:='';
      for i:=0 to DM_1.mQuery1.fieldcount-1 do
        dummy:=dummy+DM_1.mQuery1.fields[i].asstring+#9;
      delete(dummy,length(dummy),1); {trailing TAB to delete}
      tl.add(dummy);
      DM_1.mQuery1.next;
    until DM_1.mQuery1.eof;
  end
Gruß
K-H

Sir Rufo 10. Feb 2010 17:13

Re: DBGrid -> CSV
 
Das sollte eigentlich das machen was du wünschst:

Delphi-Quellcode:
procedure DataSetExportToCSV( const DataSet : TDataSet; const FileName : string; const Header : boolean = False; const Delim : string = ';'; const Quote : string = '"' );
var
  bm : TBytes;
  idx : integer;
  row, val : string;
  csv : Text;
begin
  if DataSet.Active then
    begin

      bm := DataSet.GetBookmark;
      DataSet.DisableControls;
      AssignFile( csv, FileName );
      try

        AssignFile( csv, FileName );
        ReWrite( csv );
        try

          if Header then
            begin
              row := '';
              for idx := 0 to DataSet.FieldCount - 1 do
                begin
                  val := DataSet.Fields.Fields[ idx ].FieldName;
                  val := Quote + StringReplace( val, Quote, Quote+Quote, [ rfReplaceAll ] ) + Quote;
                  if idx > 0 then
                    row := row + Delim;
                  row := row + val;
                end;
              WriteLn( csv, row );
            end;

          DataSet.First;
          while not DataSet.Eof do
            begin
              row := '';
              for idx := 0 to DataSet.FieldCount - 1 do
                begin
                  val := DataSet.Fields.Fields[ idx ].AsString;
                  if Pos( Delim, val ) + Pos( Quote, val ) > 0 then
                    val := Quote + StringReplace( val, Quote, Quote+Quote, [ rfReplaceAll ] ) + Quote;
                  if idx > 0 then
                    row := row + Delim;
                  row := row + val;
                end;
              WriteLn( csv, row );
              DataSet.Next;
            end;

        finally
          CloseFile( csv );
        end;

      finally
        DataSet.EnableControls;
      end;

      if DataSet.BookmarkValid( bm ) then
        DataSet.GotoBookmark( bm );

    end;
end;

Delphi3 10. Feb 2010 17:17

Re: DBGrid -> CSV
 
Liste der Anhänge anzeigen (Anzahl: 1)
hmm ok

fieldcount

ok

hmm nun bin ich beim fehler den ich auch nicht kenne

Sir Rufo 10. Feb 2010 17:21

Re: DBGrid -> CSV
 
Wenn du 5 Felder hast, dann liefert FieldCount 5 zurück

Wenn du aber mit for idx := 0 to FieldCount dann fragst du

0, 1, 2, 3, 4, 5 => 6 Felder ab!

ergo: for idx := 0 to FieldCount -1

Delphi3 10. Feb 2010 17:51

Re: DBGrid -> CSV
 
aber hab ich doch

da steht eine -1
und der fehler ist immer noch da

ich glaub ich brauch ein größeres brett für meinen kopf

Klaus01 10. Feb 2010 17:56

Re: DBGrid -> CSV
 
Zitat:

Zitat von Delphi3
aber hab ich doch

da steht eine -1
und der fehler ist immer noch da

ich glaub ich brauch ein größeres brett für meinen kopf

Auf Deinem ScreenShot ist die -1 aber nicht zu sehen.

Bretter gibt es bei Obi ;o)

Grüße
Klaus

Sir Rufo 10. Feb 2010 17:58

Re: DBGrid -> CSV
 
In deinem Screenshot sieht man nur etwas anderes ...

besser du zeigst uns den aktuellen Code, oder benutzt die Code-Beispiele, die wir dir gegeben haben.

Delphi3 10. Feb 2010 18:02

Re: DBGrid -> CSV
 
richtig

aber ich habe beides probiert

mal eine andere frage
wie bekomme ich die feldnamen eigentlich raus?

Sir Rufo 10. Feb 2010 18:06

Re: DBGrid -> CSV
 
Augen auf ... zu #11 gehen ... lesen

Delphi3 10. Feb 2010 18:16

Re: DBGrid -> CSV
 
sorry

ich habs grad gesehen

ich strukturier erstmal alles
weil ich tapse hier nur in dunkeln

aber es geht nun alles

danke das ihr es ausgehalten habt

Sir Rufo 10. Feb 2010 18:17

Re: DBGrid -> CSV
 
war so gerade noch auszuhalten :mrgreen:

Luckner 28. Aug 2014 11:29

AW: DBGrid -> CSV
 
Hallo Sir Rufo,
habe Deinen Beitrag zum o.g. Problem gefunden und würde diese Routine gerne benutzen. Nun habe ich Probleme mit der Übergabe der Variablen für diese Procedure. Ich rufe die Prcedure aus:
procedure TFrameArtikel.ButtonCsvExportClick(Sender: TObject);
var FileName : string;
begin
FileName := 'C:\temp\Artikel.csv';
procedure DataSetExportToCSV( const DatamoduleArtikel.DataModule1.IBDataSetArtikel : TIBDataSet; const FileName : string; const Header : boolean = False; const Delim : string = ';'; const Quote : string = '"' );
end;

procedure DataSetExportToCSV( const DataSet : TDataSet; const FileName : string; const Header : boolean = False; const Delim : string = ';'; const Quote : string = '"' );
begin
(wie Dein Vorschlag)
end;

Jetzt kommt der Fehler beim Compilieren: Anweisung erwartet, aber Procedure gefunden.

Könntest Du mir helfen? Habe sowieso Probleme mit den Procedure-Übergaben. Muß noch Menge Üben.

Danke, Luckner

Jumpy 28. Aug 2014 11:35

AW: DBGrid -> CSV
 
Hallo,

bin zwar nicht Sir Rufo, aber das Benutzen der [delphi ][/delphi ]-Tags würde deinen Code schon übersichtlicher machen. Dann sieht man auch, das du in der Prozedur ButtonCsvExportClick die andere Prozedur nicht aufrufst, sondern stattdessen ihre definition dahin kopiert hast. Also:

Delphi-Quellcode:
procedure TFrameArtikel.ButtonCsvExportClick(Sender: TObject);
var FileName : string;
begin
  FileName := 'C:\temp\Artikel.csv';
  DataSetExportToCSV(DatamoduleArtikel.DataModule1.IBDataSetArtikel,FileName,False,';','"');
end;

Luckner 28. Aug 2014 11:48

AW: DBGrid -> CSV
 
Hallo Jumpy,

danke für den Hinweis. Ich glaube, jetzt ist eine Pause fällig. Vor lauter Bäumen sehe ich den Wald nicht mehr. Ich hätte noch 2 Stunden darauf starren können und nichts gefunden.

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz