Mit gelöschte Zeilen arbeiten (ZEOS, CachedUpdates)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Soner
Beiträge: 737
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Mit gelöschte Zeilen arbeiten (ZEOS, CachedUpdates)

Beitrag von Soner »

Ich verwende ZEOS-Komponenten und benutze CachedUpdates und möchte von den gelöschten Zeilen die Indizien zugreifen. Die existieren ja noch bis man TZQuery.ApplyUpdates aufruft.
Hat jemand schon mal das gemacht und kennt die Lösung?

Das Problem mit TZQuery.OnBeforeDelete Event ist, dass es aufgerufen wird, sobald man TZQuery.Delete aufruft und solange TZQuery.ApplyUpdates nicht aufgerufen wird, ist es noch nicht gelöscht.

Code: Alles auswählen

  ZQuery1.First;
  while not ZQuery1.EOF do begin
    if (usInserted=ZQuery1.UpdateStatus) then   //das geht 
        Beep; 
    if r(usDeleted=ZQuery1.UpdateStatus) then    //das geht nicht weil gelöschte Zeilen Übersprungen werden.  Es fiel mir zu spät ein.
       Beep;
    ZQuery1.Next;
  end;

Soner
Beiträge: 737
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Mit gelöschte Zeilen arbeiten (ZEOS, CachedUpdates)

Beitrag von Soner »

Ich glaube TZUpdateSQL.OnBeforeDeleteSQLStatement- oder TZUpdateSQL.OnBeforeDeleteSQL-Event scheint richtig zu sein. Die werden nur bei TZQuery.ApplyUpdates aufgerufen. Jetzt muss ich noch an die Werte rankommen.

mhe
Beiträge: 1
Registriert: Di 17. Jun 2025, 11:56

Re: Mit gelöschte Zeilen arbeiten (ZEOS, CachedUpdates)

Beitrag von mhe »

Ich glaub, mit RecNo solltest auf Records mit Löschvormerkung zugreifen können.

Code: Alles auswählen

var
  i: Integer;
begin
  for i := 1 to Query1.RecordCount do
  begin
    Query1.RecNo := i;
    if Query1.UpdateStatus = usDeleted then
    begin
      ShowMessage('Deleted record: ' + Query1.FieldByName('name').AsString);
    end;
  end;
end;

Soner
Beiträge: 737
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Mit gelöschte Zeilen arbeiten (ZEOS, CachedUpdates)

Beitrag von Soner »

mhe hat geschrieben: Di 17. Jun 2025, 12:05 Ich glaub, mit RecNo solltest auf Records mit Löschvormerkung zugreifen können.
...
Ausprobiert, geht nicht, gleicher Effekt. Ich benutze ZEOS.

Jetzt erinnere ich mich, ZEOS arbeitet mit internen Listen. Ich hatte vor Jahren TZAbstractCachedResultSet erweitert um alte Werte anzuzeigen. Ich muss mal schauen wie ich es damals gemacht habe.

Falls jemand vor ähnlichem Problem steht und dieses Thema stirbt, wäre eine einfache Lösung bei TZQuery.OnBeforeDelete-Event die Indizien der gelöschten Zeilen in einer Liste zu speichern.
Nach TZQuery.ApplyUpdates sind die tatsächlich gelöscht, weil man zwischendurch als Benutzer gelöschte Zeilen nicht zurückholen kann. Man könnte noch mit TZQuery.Locate kontrollieren, aber das wäre überflüssig, vielleicht höchstens sinvoll, wenn zwischendurch Exception auftritt oder der Benutzer refresh macht. Das ist mir eben eingefallen, vielleicht die Lösung für mich.

Elegant ist das natürlich, wenn man bei TZUpdateSQL-Events gelösche Index bekommen kann, dann muss man nicht komplette Datentabelle von Anfang bis Ende durchlaufen sondern nur gelöschte und hinzugefügte Zeilen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6853
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mit gelöschte Zeilen arbeiten (ZEOS, CachedUpdates)

Beitrag von af0815 »

Bei so speziellen Themen würde ich ins Zeos Forum direkt gehen. Die sind sehr bemüht und man bekommt oft schnell eine Antwort.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten