AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Update Problem nach Sortieren in TFDMemTable

Update Problem nach Sortieren in TFDMemTable

Offene Frage von "BerndD."
Ein Thema von BerndD. · begonnen am 10. Aug 2018 · letzter Beitrag vom 20. Aug 2018
Antwort Antwort
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
BerndD.

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

AW: Update Problem nach Sortieren in TFDMemTable

  Alt 20. Aug 2018, 08:52
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf