Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Update Problem nach Sortieren in TFDMemTable (https://www.delphipraxis.net/197493-update-problem-nach-sortieren-tfdmemtable.html)

BerndD. 10. Aug 2018 10:06

Datenbank: CSV Dateien • Version: Delphi 10.2.3 • Zugriff über: TFDBatchMoveTextReader

Update Problem nach Sortieren in TFDMemTable
 
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

BerndD. 20. Aug 2018 08:52

AW: Update Problem nach Sortieren in TFDMemTable
 
Hallo,
beim weiteren probieren mit meinem Testprogramm ist mir ein anderes Problem aufgefallen: Editiert man ein Datensatz im TStringGrid, und sortiert dann, wird der alte Datensatz und der neue Datensatz angezeigt. Die Anzahl der angezeigten Datensätze bleibt aber gleich. Ob dafür ein anderer Datensatz überschrieben wird, oder die Anzahl nicht aktualisiert wird, kann ich nicht erkennen. Ich weiß nicht, wie man zu Debug-Zwecken den Inhalt einer TFDMemTable auslesen kann.

Mein Fazit: Es ist zwar möglich ein TStringGrid über LiveBindings an eine TFDMemTable anzubinden, aber dies ist offensichtlich sinnlos.

Das einzige was ich bei den mitgelieferten Beispielen gefunden habe ist:
http://docwiki.embarcadero.com/CodeE...le.Main_Sample
Dort wird ein TBDGrid über ein TDataSource an eine TFDMemTable angebunden. Das Beispiel ist deshalb nicht auf eine "Geräteübergreifende Anwendung" anwendbar, da meines Wissens ein TBDGrid nicht dafür verwendbar ist.

Mir würde bereits ein kleiner Hinweis darauf, wie die Anbindung eines TStringGrid an eine TFDMemTable realisiert werden kann, sehr weiterhelfen.

DukeM 8. Apr 2020 21:21

AW: Update Problem nach Sortieren in TFDMemTable
 
Wurde das Problem behoben? Es besteht leider immer noch in FMX!

Ich bekomme die Sortierung auch nicht upgedatet, wenn ich mit First/Next eimal durchlaufe! Auch der BindingNavigator mit seinem Refresh Button hilft nichts :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 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