![]() |
ON CASCADE DELETE etc.
Hi,
es geht um folgendes :
SQL-Code:
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 ?
ALTER TABLE ARTIKEL ADD FOREIGN KEY (ID_LIEFNR) REFERENCES LIEFERANT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
|
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 |
Zitat:
Zitat:
|
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 |
Zitat:
|
Auf den Seiten 67/68.
Gruß Delorion |
Uff, das ist ja fast am Anfang. Muß mir das mal abgewöhnen Bücher von hinten nach vorne durchzulesen. :mrgreen:
|
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 |
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 |
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 |
Zitat:
|
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 |
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:
|
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. |
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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