Einzelnen Beitrag anzeigen

BerndD.

Registriert seit: 10. Aug 2018
Ort: Halle/Saale
3 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Update Problem nach Sortieren in TFDMemTable

  Alt 10. Aug 2018, 10:06
Datenbank: CSV Dateien • Version: Delphi 10.2.3 • Zugriff über: TFDBatchMoveTextReader
Hallo,
mein Ziel ist ein einfaches Programm für macOS zu schreiben, das CSV-Dateien lesen und schreiben soll, also ohne Datenbank nur mit „flat files“ arbeitet. Zur Bearbeitung und Verwendung dieser Daten sollen diese in sortierter und gefilterter Form dargestellt werden können. Die Verwendung beschränkt sich im Wesentlichen auf die Auswahl eines oder mehrerer Datensätze aus der Gesamtmenge.
Mein Testprogramm benutzt folgende Komponenten:
Code:
Batch: TFDBatchMove;
Reader: TFDBatchMoveTextReader;
Writer: TFDBatchMoveDataSetWriter;
FDMemTable1: TFDMemTable;
Grid1: TStringGrid;
Batch benutzt Reader zum Lesen der CSV-Datei und Writer zum umwandeln in ein TFDMemTable konformes Format, was in FDMemTable1 abgelegt wird. FDMemTable1 ist über LiveBindings mit dem Grid1 verbunden. Hier das bisschen Quellcode was ich zum testweisen Anlegen von zwei Indizes und zum Laden der CSV-Datei verwende:
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Reader.FileName := ExtractFilePath(ParamStr(0)) + 'adr10.csv';
  with FDMemTable1.Indexes.Add do begin
    Name := 'by_name';
    Fields := 'Nachname';
    Active := True;
  end;
  with FDMemTable1.Indexes.Add do begin
    Name := 'by_plz';
    Fields := 'Plz';
    Active := True;
  end;
  FDMemTable1.IndexesActive := True;

  Batch.LogFileName := ExtractFilePath(ParamStr(0)) + 'Batch.log';
  Batch.Execute;
end;
Beim Starten des Programms wird, wie erwartet, der gesamte Datenbestand, in der Reihenfolge wie sie in der Datei stehen, im Grid angezeigt. Nun dachte ich, dass ich auf FDMemTable1 Sortier- und Filterregeln anwenden könnte und dadurch diese Komponente nur noch die Datensätze an das Grid liefert, die der Filterregel entsprechen und dies in der Reihenfolge, die durch die Sortierreihenfolge bestimmt wird. Das scheint aber nicht der Fall zu sein, den bereits das Sortieren nach einen Feld über eins der folgenden Befehle
Code:
FDMemTable1.IndexName := 'by_name';
FDMemTable1.IndexName := 'by_plz';
FDMemTable1.IndexFieldNames := 'Plz';
liefert immer demselben Fehler: Es wird einfach in der Grid-Anzeige der 5. Datensatz mit dem letzten, den 10. Datensatz überschrieben. Erst wenn ich ein Feld editiere, mit Enter bestätige und danach mit den Cursortasten mich in eine andere Zeile bewege, wird plötzlich die richtige Sortierreihenfolge angezeigt.

Nun meine Fragen:
Wie muss ich Sortier- und Filter- Befehle auf die MemTable ausführen, damit sie optimiert angewendet werden und sich die Grid-Darstellung danach aktualisiert?
Ist mein Konzept grundsätzlich richtig oder sollte ich zwischen TFDMemTable und TStringGrid eine TFDQuery zwischenschalten? Das hatte ich verworfen, weil ich dazu eine Connection benötige, womit ich als DB Laie nichts anfangen kann (mein Programm soll ja auch ohne DB funktionieren).

Update: Anhang einfügen geht nicht, deshalb hier externer Link mit sha256 Prüfsumme:
2139a9f1e762942da2cf93634a978adad753954795ee5d0b04 977b23b5cd2b4f *FirstTest.zip

Vielen Dank im Voraus
Bernd

Geändert von BerndD. (10. Aug 2018 um 14:56 Uhr) Grund: Dateianhang hinzugefügt
  Mit Zitat antworten Zitat