Frage zu DbDelete() [Erledigt]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Frage zu DbDelete() [Erledigt]

Beitrag von Jan »

Schon wieder etwas, was ich nicht wirklich verstehe. Ich möchte einen Datensatz löschen.

Code: Alles auswählen

orte->(DbSeek(nOrt2, , "ortnum"))
IF orte->(DbRLock())
   orte->(DbDelete())
ENDIF
Der richtige Datensatz wird gefunden. Der wird auch gelockt. Der führt auch die Löschzeile aus im Debugger. Aber es wird nichts gelöscht. Wieso nicht?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von Tom »

Diese Code funktioniert bei mir. Er löscht auch den Datensatz. Gegenfrage: Wie ermittelst Du, ob gelöscht wurde? Prüfst Du einfach nur, ob der Datensatz vorhanden ist? Dann ist möglicherweise SET DELETED OFF. Oder fragst Du mit db->(Deleted()) ab?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von Jan »

Hallo Tom,

ja, eigentlich sollte das löschen. Tut der aber nicht. Ich schau da mit VDBU rein. Aber auch ein anschließendes PACK schmeißt den Datensatz nicht raus. Deswegen bin ich ja so irritiert.

Und jetzt bin ich so richtig perplex: orte->(Deleted()) gibt mir ein .T. zurück! Wer spinnt jetzt? Der Debugger oder VDBU und PACK? Da stimmt doch irgendwas nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von brandelh »

hast du eventuell mit readonly geöffnet ?
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von Tom »

@Hubert: Dann würde DbDelete() einen Laufzeitfehler erzeugen. Pack sowieso. Und Deleted() würde auch nicht .T. zurückliefern. Interessanterweise aber liefert DbRlock() ein .T. zurück.
Herzlich,
Tom
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1931
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von Rolf Ramacher »

was passiert, wenn nicht geblockt werden kann. ??

ich mache dies so

Code: Alles auswählen

do while 123->(!rlock())
enddo
123->(Dbdelete())
123->(Dbunlock())
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von Jan »

Rolf,

sowas werde ich niemals machen. Wenn nicht gelockt werden kann, dann geht der in eine Endlosschleife rein, und kommt da nie wieder raus. Ich empfinde das als extrem unsaubere Programmierung.

Ich locke ja. Und das klappt auch. Sonst würde der niemals in die If-Schleife zum löschen reingehen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Frage zu DbDelete()

Beitrag von AUGE_OHR »

Jan hat geschrieben:Schon wieder etwas, was ich nicht wirklich verstehe. Ich möchte einen Datensatz löschen.

Code: Alles auswählen

orte->(DbSeek(nOrt2, , "ortnum"))
IF orte->(DbRLock())
   orte->(DbDelete())
ENDIF
Der richtige Datensatz wird gefunden. Der wird auch gelockt. Der führt auch die Löschzeile aus im Debugger. Aber es wird nichts gelöscht. Wieso nicht?
schon mal ein orte->(DbCommit()) oder orte->(DbSkip(0)) nach orte->(DbDelete()) versucht ?

kannst du das auch in einem Demo reproduzieren ?
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Frage zu DbDelete()

Beitrag von Jan »

Ein Hinweis von Tom hat mich auf die richtige Spur gebracht. Ich habe jetzt ein Set Deleted On eingebaut, danach läuft es. Mir war schlichtweg nicht bewußt, das diese Einstellung offenbar Thread-Local ist. Und da der ganze Vorgang in einem eigenen Thread abläuft, wurde das vom Mainthread offensichtlich nicht durchgereicht.

Warum der gelöschte Datensatz in VDBU nicht als gelöscht angezeigt wurde, ist dann nur ärgerlich, ich hätte mir einige Verwirrung sparen können.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Frage zu DbDelete() [Erledigt]

Beitrag von Tom »

Hallo, Jan.
sowas werde ich niemals machen.
Ich mache so etwas durchaus, und ich habe noch keine Deadlocks an solchen Stellen erlebt. Meine Applikation hat die Hoheit über die Daten, und gelockt wird nur, wenn auch umgehend geschrieben - und gleich wieder entsperrt - wird. Ich sorge dafür, dass a) Daten überhaupt nicht bearbeitet werden können, wenn das parallel bereits geschieht und b) Datensätze niemals länger als für den unmittelbaren Schreibvorgang gesperrt sind. Der Benutzer bearbeitet i.d.R. Memvars, keine Datenbankfelder. Und wenn man so arbeitet, kann man auch die Sperrungen wie von Rolf gezeigt auslösen, vielleicht noch mit einem Sleep(0) innerhalb der Schleife. Ich habe das mal eine Weile loggen lassen - es gab trotz intensiver Arbeit an zig Arbeitsplätzen niemals die Situation, dass die Schleife mehr als einmal passiert werden musste. Gleichzeitig hat man den Vorteil, dass man beim Schreiben in mehrere Tabellen nicht plötzlich auf ein scheiterndes Lock reagieren muss, indem man irgendeinen Warte- oder Auswahldialog anzeigt. Lock, schreiben und entsperren stellen immer eine zwingend aufeinanderfolgende Einheit dar.

BTW, schön, dass der Fehler gefunden ist. Allerdings: SET DELETED hat keinen Einfluss auf das PACK. Ein gelöschter Datensatz sollte nach einem Pack-Vorgang verschwunden sein, ganz unabhängig davon, wie SET DELETED steht.
Herzlich,
Tom
Antworten