Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bookmark (https://www.delphipraxis.net/11354-bookmark.html)

Tau 5. Nov 2003 04:52


Bookmark
 
Hallo Leute

Beim Löschen über mehrere Tabellen bin ich gezwungen die Query zu schließen und wieder zu öffnen. Nach den öffnen der DatenBank ist der DB Zeiger logischerweise am ersten DatenSatz. Wenn ich Bookmarks verwende um den DB Zeiger zu verwalten bekomme ich in 2 Situationen Probleme.

1) Es ist nur ein Daten Satz vorhanden
2) Oder der DB Zeiger ist am ende der DatenBank

Danach tritt eine Exception auf.

Ist auch klar, weil es nach den offnen von der DatenBank um einen oder auch mehrere DatenSätze weniger sind und der Bookmark ins nichts greift.

Kann mir jemand einen Tipp geben wie ich das Problem beheben kann.

mfg.
Tau

PS. aus der Hilfe bin ich leider auch nicht schlau geworden.
( oder ich sehe den Wald vor lauter Bäume nicht mehr ) :wall:

woki 5. Nov 2003 06:13

Re: Bookmark
 
Hi,

eine Bookmark ist ein Pointer, sich da auf eine Gültigkeit nach close open des Datasets zu verlassen, halt ich für riskant. Ich würde in dieser Situation die ID des Datensatzes speichern, und dann den Zeiger über löcate wieder auf dem richtigen Datensatz plazieren.

Grüsse
Woki

Tau 5. Nov 2003 08:31

Re: Bookmark
 
Hallo woki

Die Idee mit der Laufenden ID und Locate ist nicht schlecht. Aber nach
dem Löschen in der DB ( close, open ) ist die ID auch nicht mehr
vorhanden und der DB Zeiger bleibt auf dem ersten DatenSatz.

Was noch dazukommt ist das die ID nicht durchgehend
nummeriert ist z. B. ( 1, 2, 3, 5, 6, 7, 9, 12 usw. ) entsteht durch das Löschen in der DB :gruebel:


mfg
Tau

choose 5. Nov 2003 09:22

Re: Bookmark
 
Beim Entwickeln eines TDataSet-Descendants, also zB beim Entwickeln der TQuery-Komponente selbst, muss man lediglich Funktionen zum
  • *Erzeugen eines Bookmarks und Rückgabe eines Pointers auf ihn,
    *Löschen eines Boockmarks hinter einem Pointer und
    *Platzieren des Cursors, auf den der Bookmark hinter einem Pointer zeigt
für die äußere Schnittstelle implementieren.
Das Speichermanagement der internen Daten obliegt vollständig dem Erben von TDataSet (hier: TQuery).
Du kannst Dich daher nicht darauf verlassen, dass die Lösung funktioniert; ich kenne Implementierungen, die so definitiv nicht funktionieren sondern, im Gegenteil, zum Absturz führen würden.

Verwende stattdessen einen künstlichen Schlüssel, um die Daten wiederzufinden. Wenn er in der Anzeige stören sollte, verberge die Spalte mit TField.Visible (oder direkt im Grid?).

MrSpock 5. Nov 2003 09:30

Re: Bookmark
 
Hallo Tau,

Woki meinte einen eindeutigen Verweis auf einen Datensatz, dass kann eine ID sein oder ein anderer Primärschlüssel. Es ist ja kein Problem, wenn dieser nicht fortlaufend ist. Und wenn der Datensatz tatsächlich gelösct wurde, ist es doch OK, dass per default der erste Datensatz angezeigt wird, oder? Ansonsten ginge auch noch FindNearest.

Tau 5. Nov 2003 10:06

Re: Bookmark
 
Hallo MrSpock

Wenn ich davon ausgehe das ich nehmen wir mal an auf den DatenSatz 1550 Stehe und nach dem Löschen auf den ersten dann macht es sehr wohl sinn das der nächste oder der vorhergehende DatenSatz angezeigt wird.

FindNearest habe ich bei der ADOQuery Componente leider nicht gefunden.

mfg
Tau

MrSpock 5. Nov 2003 10:22

Re: Bookmark
 
Hallo Tau,

je nach Aufbau des Schlüssels könnte in diesem Fall auch Locate mit der Option loPartialKey funktionieren.

Ansonsten könntest du den Satz auch über eine Query finden:

SQL-Code:
SELECT Max(ID) FROM myTable WHERE ID <= :gemerkteID

Tau 5. Nov 2003 13:59

Re: Bookmark
 
Hallo MrSpock

habe loPartialKey ausprobiert leider ohne erfolg. Mir persönlich gefällt
die Lösung mit dem Select am besten und ist auch für andere Verwendungszwecke sehr geeignet. :witch:

besten Danke für den Tipp

mfg
Tau


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 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 by Thomas Breitkreuz