Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ON CASCADE DELETE etc. (https://www.delphipraxis.net/2918-cascade-delete-etc.html)

Hansa 13. Feb 2003 17:35


ON CASCADE DELETE etc.
 
Hi,

es geht um folgendes :

SQL-Code:
ALTER TABLE ARTIKEL ADD FOREIGN KEY (ID_LIEFNR) REFERENCES LIEFERANT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
Mit dem CASCADE will ich eben alles was mit einem Artikel zusammenhängt löschen / updaten. Jetzt die Frage : Geht das nur, wenn auf einem Artikel ein Foreign Key liegt ?

delorion 14. Feb 2003 07:30

Hallo Hansa

Ja, ich denke der Foreign Key ist hier notwendig.
Allerdings sehe ich noch andere Probleme.
Ich sehe bei Deinem Beispiel die Verknüpfung zum
Lieferanten. Was ist aber mit dem Kunden ?
Ich empfehle Artikel nur zu löschen wenn dafür keine
Bewegungsdaten vorhanden sind.

Gruß Delorion

Hansa 14. Feb 2003 07:42

Zitat:

Zitat von delorion
Ja, ich denke der Foreign Key ist hier notwendig.

Ab und zu denke ich auch, aber das da muß ich genauer wissen. :mrgreen:

Zitat:

Zitat von delorion
Ich empfehle Bewegungsdaten nur zu löschen wenn dafür keine Bewegungsdaten vorhanden sind.

Du meinst jetzt Stammdaten zu löschen, falls keine Bewegungsdaten vorhanden sind. Aber genau um das geht es. In diesem Punkt kommt nach der Abfrage "Wollen sie den Artikel und alle damit zusammenhängende Daten löschen ?" dann noch "Meinen Sie das wirklich ernst ?" :spin:

delorion 14. Feb 2003 07:59

Ja dann mal genauer :coder:

Die Schlüssel verschiedener, miteinander zu verknüpfenden Tabellen müssen sich einander über Fremdschlüssel zuordnen lassen.

Der Fremdschlüssel stellt sicher, dass aufgrund der Entsprechungen zu den Werten im Primärschlüssel einer anderen Tabelle die in mehreren Tabellen gespeicherten Daten wieder zusammengeführt werden können.

Das vorstehende Satzmonster stammt nicht von mir sondern:

"Interbase Datenbankentwicklung mit Delphi" (Andreas Kosch)

Gruß Delorion

Hansa 14. Feb 2003 08:09

Zitat:

Zitat von delorion
Das vorstehende Satzmonster stammt nicht von mir sondern:

"Interbase Datenbankentwicklung mit Delphi" (Andreas Kosch)

Satzmonster :shock: Dieses Wort muß ich mir merken. Habe das Buch auch. Auf welcher Seite steht denn das Satzmonster ? :lol: Intuitiv habe ich das auch so gesehen, aber nun habe ich die gewünschte Klarheit. So ganz sicher war ich mir nämlich nicht.

delorion 14. Feb 2003 08:15

Auf den Seiten 67/68.


Gruß Delorion

Hansa 14. Feb 2003 08:22

Uff, das ist ja fast am Anfang. Muß mir das mal abgewöhnen Bücher von hinten nach vorne durchzulesen. :mrgreen:

Lemmy 14. Feb 2003 08:29

Hi Hansa,

was passiert eigentlich in Deinem Beispiel bei folgendem Fall:

Lieferant L hat über Jahre hinweg Artikel A geliefert, den Du verkauft hast. Lieferant L schließt jetzt wegen Reichtum und macht mit 35 Frührente auf Jamaica. Jetzt löscht Du den Lieferanten L, gleichzeitig den Artikel A. Aber genau da klemmt es jetzt, denn Artikel A ist bei einigen Lieferungen an Kunden in der Rechnung, d.h. Du musst jetzt diese Rechnungen/Auslieferungen ändern! Dann stimmt doch Dein Datenbestand hinten und vorne nicht mehr!!!

Geh lieber wie folgt vor: Wenn Lieferant L nicht mehr im Angebot ist, dann setz bei ihm ne Markierung "inaktiv". Über eine StoredProceudre kannst Du dann auch alle Artikel auf "inaktiv-Stufe-1" setzen, d.h. sie können nicht mehr nachbestellt werden. Sobald der letzte Artikel verkauft ist, wird auf der Artikel auf "inaktiv" gesetzt (z.B. über nen Trigger), d.h. er kann auch nicht mehr verkauft werden.
Zusätzlich kannst Du immer noch eine Löschen-Funktion einbauen, für diese Lieferanten/Artikel die nicht in Bestellungen / Lieferungen aufgeführt sind.

Grüße
Lemmy

Hansa 14. Feb 2003 08:41

Hi Lemmy,

das ist schon richtig was Du sagst, da ein Artikel von mehreren Lieferanten kommen kann, wird das aber nicht kaskadiert. Zumindest nicht ON DELETE. Ich bin halt mit umfangreichen Baumaßnahmen an der DB dran. Und zwar vom Keller bis zum Dach. Deshalb ist das Thema hier schon wichtig, wegen Foreign-Keys usw.

Der konkrete Fall, wo das ganze aber schon komplett durchgezogen werden kann, ist folgender : Rechnung löschen. Dann soll die Rechnung selbst, die Rechnungspositionen, Rabattpositionen usw. auf einen Schlag ohne großen Aufwand gelöscht werden, allerdings auch wiederum nur, sofern sie bezahlt ist. :P

delorion 14. Feb 2003 08:52

Hoppla, jetzt wirds aber ernst :shock:

Hansa Du kannst doch keine bezahlte Rechnung aus ner Warenwirtschaft löschen !!!

Das ist rechtlich nicht zulässig.
Dein Kunde würde in so einem Fall vom Finanzamt notgeschlachtet.
Schon eine Lücke in laufenden Rechnungsnummern macht die Mißtrauisch.

Gruß Delorion

Hansa 14. Feb 2003 09:06

Zitat:

Zitat von delorion
Dein Kunde würde in so einem Fall vom Finanzamt notgeschlachtet.Schon eine Lücke in laufenden Rechnungsnummern macht die Mißtrauisch.

Jo, die Penner fehlen natürlich auch noch. :wall: Wieso muß ich immer Beispiele wählen, die irgendwie nicht passen. :corky: Aber gut, daß Du mich an so was erinnerst. Lemmys Vorschlag mit inaktiv setzen ist ja auch noch da. An anderer Stelle mache ich das nämlich genau so. Werde das ganze trotzdem mal mit meinem Steuerberater besprechen, die Deppen ändern ja jede Woche irgend einen Mist.

delorion 14. Feb 2003 09:17

Hi Hansa

Lemmys Vorschlag mit den Artikeln halte ich für Optimal.
Ansonsten macht das Löschen von Vorgängen eigentlich keinen Sinn.
Ist doch eigentlich egal wieviel Belege in der Wawi schlummern.
Sofern die Datenbank sauber indiziert ist und die SQL Abfragen clever formuliert sind ist die Größe der Datenbank doch nur ein Problem der Festplatte :mrgreen:

Gruß Delorion

Hansa 14. Feb 2003 09:32

Es gibt schon Sachen, die man ruhig löschen kann. Das Problem ist auch nicht die Festplatte, sondern das Sicherungsmedium oder wie man damit umgeht. Dazu kommt, daß ein Programm, in dem nichts gelöscht werden kann (ob richtig oder nur unsichtbar machen), auf Unverständnis stoßen würde. Vermutlich wäre das den meisten Leuten unheimlich. :witch:

delorion 14. Feb 2003 09:42

Nö Hansa

Ich bin seit mehr als 20 Jahren mit sowas beschäftigt, und ich habe noch keine professionelle Warenwirtschaft gesehen in der man Belege löschen kann. Auch unsichtbar machen, wüsst ich jetzt erst mal keine.

Ich vermute Du hättest mit so einer Option eher schlechte Karten.

Gruß Delorion

Eine Einschränkung: Daten deren gesetzliche Aufbewahrungsfrist abgelaufen ist können gelöscht werden.

Alternative Vorgehensweise: Daten die Älter als x sind in eine separate Datenbank so ausgliedern, das Sie auch weiterhin bei Bedarf eingebunden werden können.

Lemmy 14. Feb 2003 12:03

Zitat:

Zitat von delorion
Hansa Du kannst doch keine bezahlte Rechnung aus ner Warenwirtschaft löschen !!!

Das ist rechtlich nicht zulässig.
Dein Kunde würde in so einem Fall vom Finanzamt notgeschlachtet.

***roftl****


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz