Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Spaltenname mit in einer CSV-Datei speichern (https://www.delphipraxis.net/73380-spaltenname-mit-einer-csv-datei-speichern.html)

Ati 17. Jul 2006 12:20

Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos

Spaltenname mit in einer CSV-Datei speichern
 
Hallo zusammen,

wie in einem vorherigen Thread schonmal verkündet arbeite ich bei meinem aktuellen Programm mit Lazarus. Das ist aber halb so wild, da ich bisher fast alles von Delphi so übernehmen konnte. Jetzt gibt es aber nicht die Möglichkeit Daten direkt nach Excel zu exportieren. Also gehe ich den Weg über eine CSV-Datei. Zu diesem Zweck habe ich folgenden Code gefunden:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  application.Terminate;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  ndx : Integer;
  sl : TStringList;
  tString : String;
begin
  sl := TStringList.Create;
  try
    with qrmain do
    begin

      First;
      while not (Eof) do
      begin
        tString := '';
        for ndx := 0 to Fields.Count -1 do
        begin
          tString := tString + '"' + Fields.Fields[ndx].AsString + '",';
        end;
        sl.Add(tString);
        Next;
      end;
    end;
    sl.SaveToFile('c:\We_Anforderungen.csv');
   finally
    FreeAndNil (sl);
  end;
  Showmessage('Daten wurden gespeichert!!')
 
end;
Das passt so gut, das wenn ich die Datei mit Excel öffne alles ganz normal aussieht. Jetzt möchte ich gerne noch die Spaltenüberschrift mit dabei haben...geht das und wenn ja wie?

Danke
Ati

marabu 17. Jul 2006 12:51

Re: Spaltenname mit in einer CSV-Datei speichern
 
Hallo Ati,

ich würde es so machen:

Delphi-Quellcode:
procedure AddNames(csv: TStrings; fields: TFields);
var
  i: Integer;
begin
  with TStringList.Create do
  begin
    for i := 0 to Pred(fields.Count) do
      Add(fields[i].FieldName);
    csv.Add(CommaText);
    Free;
  end;
end;

procedure AddValues(csv: TStrings; fields: TFields);
var
  i: Integer;
begin
  with TStringList.Create do
  begin
    for i := 0 to Pred(fields.Count) do
      Add(fields[i].AsString);
    csv.Add(CommaText);
    Free;
  end;
end;

procedure SaveToCsv(ds: TDataSet; fn: TFileName);
var
  csv: TStringList;
  bm: TBookmark;
begin
  csv := TStringList.Create;
  ds.DisableControls;
  bm := ds.GetBookmark;
  try
    AddNames(csv, ds.Fields);
    ds.First;
    while not ds.Eof do
    begin
      AddValues(csv, ds.Fields);
      ds.Next;
    end;
    csv.SaveToFile(fn);
  finally
    csv.Free;
    ds.GotoBookmark(bm);
    ds.FreeBookmark(bm);
    ds.EnableControls;
  end;
end;
Dieser Ansatz berücksichtigt das Vorkommen von Quote in den Daten selbst und verdoppelt solche Quotes. Keine Ahnung, ob du das mit Lazarus übersetzen kannst, aber vielleicht hilft es dir ja trotzdem.

Grüße vom marabu

Ati 17. Jul 2006 13:15

Re: Spaltenname mit in einer CSV-Datei speichern
 
Also marabu Dein Code funktioniert einwandfrei....vielen Dank. Was Du aber danach geschrieben hast, verwirrt mich, da ich nicht weiß was Du damit meinst. Des weiteren sind da Codezeilen, die ich mir auch noch nicht ganz erklären kann. Vielleicht kannst/möchtest Du die mal kurz erklären.
Delphi-Quellcode:
qrmain.DisableControls;
      bm := qrmain.GetBookmark;
      qrmain.GotoBookmark(bm);
      qrmain.FreeBookmark(bm);
      qrmain.EnableControls;
Nur so als Lerneffekt. Dank schonmal im voraus

marabu 17. Jul 2006 15:05

Re: Spaltenname mit in einer CSV-Datei speichern
 
Nimm als Beispiel ein StringField, in welchem sich ein Zitat findet:

Code:
Aus der Reihe "Letzte Worte" heute der Briefträger mit "Braves Hundchen"
Dein Code schreibt diesen Text so in eine CSV-Datei:

Code:
"Aus der Reihe "Letzte Worte" heute der Briefträger mit "Braves Hundchen""
Richtig wäre die Verdoppelung der enthaltenen Quotes:

Code:
"Aus der Reihe ""Letzte Worte"" heute der Briefträger mit ""Braves Hundchen"""
Was die Bookmark-Methoden betrifft, so fand ich es einfach ordentlicher, wenn das Programm den Satzzeiger nach Ausführung meines Codes wieder an der gleichen Stelle vorfindet wie vorher. DisableControls sorgt lediglich dafür, dass die Echtzeit-Aktualisierung von verknüpften visuellen Komponenten unterbleibt, während ich den Satzzeiger steuere - mit EnableControls stelle ich den alten Zustand wieder her.

marabu

Ati 18. Jul 2006 06:55

Re: Spaltenname mit in einer CSV-Datei speichern
 
Danke. Das habe jetzt selbst ich verstanden :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.

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