AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Denkanstoß MemTable/Cachetable FireDac
Thema durchsuchen
Ansicht
Themen-Optionen

Denkanstoß MemTable/Cachetable FireDac

Ein Thema von Eppos · begonnen am 1. Okt 2020 · letzter Beitrag vom 2. Okt 2020
Antwort Antwort
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#1

AW: Denkanstoß MemTable/Cachetable FireDac

  Alt 1. Okt 2020, 18:17
... aber wenn man schon kopiert, dann wohl eher direkt in ein TDictionary<> oder eine TObjectList<TMyData> bzw. TList<TMyDataRecord>.
...
Könntest du mir das kurz erläutern, evtl. mit Beispiel, wie du das meinst?
Also in Verbindung mit einem Memtable.

Gruß
BP
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: Denkanstoß MemTable/Cachetable FireDac

  Alt 1. Okt 2020, 18:46
Wie gesagt, einfach die Daten (Records und Fields) in ein DataSet ohne DB-Verbindung (MemTable) kopieren.
Delphi-Quellcode:
Q := Datamodule.OpenSql('SELECT a, b FROM t');
try
  MemData.Close; // um den Inhalt schnell zu löschen, oder eben via "while MemData.RecordCount > 0 do MemData.Delete;" jeden Datensatz entfernen
  MemData.Open; // in MemData sind natürlich die gleichen Felder drin, wie im Query
  // eventuell auch noch MemData.DisableControls und MemData.EnableControls verwenden
  while not Q.EoF do begin
    MemData.Insert;

    //TDatamodule.CopyAllFields(Q, MemData); // Wir haben uns ein paar Hilfsfunktionen gebaut, aber man kann auch direkt mir den Query-Komponenten arbeiten.
    for i := 0 to Q.FieldCount - 1 do
      MemData.Fields[i].Value := Q.Fields[i].Value;
    { oder, weil ich unten auch nur zwei Felder nutze
    MemData.FieldByName['a'].Value := Q.FieldByName['a'].Value;
    MemData.FieldByName['b'].Value := Q.FieldByName['b'].Value;
    }


    MemData.Post;
    Q.Next;
  end;
finally
  Q.Free;
end;

Delphi-Quellcode:
//CacheList := TDirectory<string,string>.Create;

with Datamodule.OpenSql('SELECT a, b FROM t') do
  try
    CacheList.Clear;
    while not EoF do begin
      CacheList[AsString('a')] := AsString('b'); // bzw. FieldByName('a').AsString
      Next;
    end;
  finally
    Free;
  end;
Also Daten abrufen (SELECT), die Dataset-Records durchlaufen und die Daten in der Liste speichern.

Und dann nur noch die Liste befragen
Delphi-Quellcode:
S := CacheList['irgendwas']; // Peng, wenn es 'irgendwas' nicht gibt. (könnte man aber auch auf "Leerstring wenn nicht vorhanden" umbauen)

if CacheList.Contains('irgendwas') then
  S := CacheList['irgendwas'];
  
if CacheList.TryGet('irgendwas', X) then
  S := X;

...
und wenn nötig den oberen Code nochmal ausführen, um die Liste zu aktualisieren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Okt 2020 um 18:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:45 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