Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DeleteQuery abbrechen? (https://www.delphipraxis.net/8994-deletequery-abbrechen.html)

barnti 16. Sep 2003 14:12


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:

Procedure BeforeDelete();
begin
  QueryKunde.Cancel;
  QueryVertrag.UpdateVertrag
end;
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.

Das Problem: Der Kunde wird trotzdem gelöscht und sein Vertrag upgedated?!

Wo liegt mein Denkfehler?

Gruß,

Barnti

MrSpock 16. Sep 2003 21:26

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).

barnti 17. Sep 2003 07:08

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

Billa 17. Sep 2003 07:48

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)

barnti 17. Sep 2003 08:00

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

urs.liska 17. Sep 2003 11:52

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

Leuselator 18. Sep 2003 01:58

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