![]() |
DeleteQuery abbrechen?
Hallo,
ich möchte realisieren, dass wenn man einen Kunden löscht dieser nicht wirklich gelöscht wird sondern dessen Vertrag mit einem Endedatum versehen wird. Mein Vorgehen ist wie folgt:
Delphi-Quellcode:
Ich schreibe also in das Beforedelete-Ereignis ein Aufruf zum canceln des Löschauftrages und schreibe ein neues Endedatum in den Vertrag des entsprechenden Kunden.Procedure BeforeDelete(); begin QueryKunde.Cancel; QueryVertrag.UpdateVertrag end; Das Problem: Der Kunde wird trotzdem gelöscht und sein Vertrag upgedated?! Wo liegt mein Denkfehler? Gruß, Barnti |
Re: DeleteQuery abbrechen?
Hallo barnti,
Cancel bei einer Query bewirkt nur, dass Aenderungen, die nach einem Edit oder Insert in die Datenmenge durchgefuehrt wurden, nicht uebernommen werden. Um das Delete abzubrechen, musst du ABORT benutzen (also eine stille Exception ausloesen). |
Re: DeleteQuery abbrechen?
Hi,
das habe ich schon überlegt. Das Problem ist, dass nach dem abort ja der aktuelle Vorgang abgebrochen wird. So kann ich dann nicht erst die KundenQuery abbrechen und anschließend gleich den Vertrag updaten!? Oder gibt es die Möglichkeit beide Vorgänge, KundenQuery abbrechen, Vertrag updaten, in einem Durchgang? Gruß, Barnti |
Re: DeleteQuery abbrechen?
Wenn nicht gelöscht sondern geändert werden soll, wieso wird dann überhaupt das Löschen ausgelöst? Eine ähnliche Anforderung habe ich anders gelöst:
1. es gibt ein Statusfeld das bei Bedarf geändert wird (statt Löschung). 2. die Ergebnismengen aller Querys werden mit Hilfe des Statusfeldes eingeschränkt. Etwa so
Code:
select * from TABELLE where (...bedingung...) [color=#ff005b]and (STATUS = 1)[/color]
Eine Löschung ist eben keine, sondern setzt nur das Statusfeld z.B. auf -1 o.ä. In Deinem Beispiel könnte man sogar das Enddatum dazu benutzen (...ist aber schlechter Stil) |
Re: DeleteQuery abbrechen?
Hallo ihr zwei,
ich benutze den DBNavigator, stelle also die Standardfunktionen für DB-Operationen zur Verfügung. Deshalb auch die "echte" Funktion zum Löschen, die ich dann im "BeforeDelete" Ereignis umgehe, bzw anderweitig umsetze. Dazu: Ich habe es doch mit einem "abort" bewerkstelligen können. Dazu editiere ich zunächst im "BeforeDelete" Ereignis den Vertrag und führe anschließend das "abort" durch. Habe also nur die Reihenfolge geändert. Das mir das jetzt erst ein-(auf)fällt liegt daran, dass ich nicht bedacht habe das die Vertragsänderung bereits direkt nach dem "VertragsQuery.open" auch mit einem "Commit" bestätigt wird. Das neue Datum des Vertrage ist also schon in der DB abgelegt und commited. Anschließend, im "BeforeDelete" rufe ich dann abort auf. So geht es! Danke für die Anteilnahme. Ist doch immer wieder hilfreich sich auszutauschen (und sei es nur um sich einmal vom Coden abzulenken)! Gruß, Barnti |
Re: DeleteQuery abbrechen?
Du musst auch mit dem DBNavigator nicht einfach alles zur Verfügung stellen, was Delphi anbietet ;-)
Du kannst entweder - über DBNavigator.VisibleButtons Funktionen verbergen. Dann müsstest Du einen zusätzlichen eigenen Button mit der Löschfunktion anbieten. Oder - (besserer Vorschlag) Du schreibst einen Eventhandler für DBNavigator.BeforeAction. In diesem kannst Du abfragen, welcher Button gedrückt wurde. wenn es der Löschbutton war, dann kannst Du eben das veränderte Verhalten programmieren und mit Abort abbrechen. Grüße Urs |
Re: DeleteQuery abbrechen?
Wenn Deine DB das unterstützt, wäre ein DeleteTrigger die sauberste Lösung, weil der dann auch Deletes von ausserhalb Deines Programmes abfängt (z.B. Datenbankoberfläche oder ISQLW oder QueryAnalyzer)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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