![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: Fibplus
Datensatz in verknüpften Tabellen löschen
Hallo zusammen
in meiner DB verwende ich mehrere Tabellen die miteinander Verknüpft sind. Das Problem ist nun das ich die Tabellen NURSING_H_D + NURSING_H_DD auch für Statistische Zwecke brauche. Wenn jetzt ein Eintrag in NURSING_H gelöscht wird der verknüpfungen in den Tabellen NURSING_H_D + NURSING_H_DD hat und diese auch gelöscht würden stimmt die Statistik am ende nicht mehr. Da kam mir die überlegung das wenn ein Datensatz in der Tabelle NURSING_H gelöscht wird das dieser nicht gelöscht sondern nur als gelöscht markiert wird und dann nicht mehr sichtbar ist. Hat jemand eine andere Idee?
SQL-Code:
CREATE TABLE NURSING_H
( "ID" "ID", < PRIMARY KEY "C_NR" "T30" NOT NULL, "U_NR" "T30" NOT NULL, ); CREATE TABLE NURSING_H_D ( "ID" "ID", "C_NR" "T30" NOT NULL, "U_NR" "T30" NOT NULL, "ID_AREA" "ID", < FOREIGN KEY (ID_AREA) REFERENCES NURSING_H (ID) ON UPDATE CASCADE; ); CREATE TABLE NURSING_H_DD ( "ID" "ID", "C_NR" "T30" NOT NULL, "U_NR" "T30" NOT NULL, "ID_D" "ID", < FOREIGN KEY (ID_D) REFERENCES NURSING_H_D (ID) ON UPDATE CASCADE; ); Shalom Manfred |
Re: Datensatz in verknüpften Tabellen löschen
Es müsste doch auch die Klausel
SQL-Code:
möglich sein. (Bitte genaue Syntax in FB Hilfe nachschauen)
FOREIGN KEY (ID_AREA) REFERENCES NURSING_H (ID) ON UPDATE CASCADE ON DELETE NO ACTION
Damit wird das Löschen des Masterdatensatzes von der Datenbank verhindert. Ansonsten ist das Markieren des Masterdatensatzes (Löschkennzeichen) der übliche Weg. Statt eines Boolean-Feld würde ich hier ein Smallint oder Tinyint-Feld verwenden und das Feld "Status" oder so ähnlich taufen. Dann kann man später leichter erweitern, falls es ausser "aktiv" und "gelöscht" noch weitere Zustände gibt. |
Re: Datensatz in verknüpften Tabellen löschen
Hallo Shmia
danke für den Tipp. Das Problem ist im moment nur das wenn ich den Hautdatensatz lösche bekomme ich eine Fehlermeldung wenn noch detaildaten bestehen. ( Ist klar ) Die Frage ist jetzt nur wie kann ich die Fehlermeldung von Fibplus abfangen und darauf reagieren. Ich schau mich mal nach anpassungen des DBNavigators um. Sahlom Manfred |
Re: Datensatz in verknüpften Tabellen löschen
Das CASCADE ist immer so eine Sache. Bei ON DELETE CASCADE gehts doch darum, beim Löschen eines Stammdatensatzes auch alle die zu löschen, die Abhängigkeiten dazu haben. :gruebel: Sonst würden ja abhängige als Datensatz-Leichen in der DB rumliegen und die referentielle Integrität der DB wäre hinüber. :zwinker: Und genau das willst Du haben ? :shock: Ich sage nur : besser Finger weg von Master/Detail. Willst Du die Detailsätze etwa später einzeln von Hand löschen ?
|
Re: Datensatz in verknüpften Tabellen löschen
Zitat:
Das Problem ist das wenn ich die Detailtabellensätze ( das sind Verteilungen ) lösche stimmt die Statistik am schluss nicht mehr. Das heisst wenn mal was verteilt wurde und der Hauptdatensatz gelöscht wird dann wird normalerweise auch der Dateilsatz gelöscht. Ich dachte mir ich löse es so:
Delphi-Quellcode:
Dadurch liegt nichts "lose" rum.
procedure TDM_nursingh.NursingHBeforeDelete(DataSet: TDataSet);
begin if Nursingh_D.FieldByName('ID').IsNull then Exit else with Nursingh do begin Edit; FieldByName('STAT_DEL').AsInteger := 1; Post; FullRefresh; SysUtils.Abort; //cancel the delete action end; end; Was hälst Du davon? Manfred |
Re: Datensatz in verknüpften Tabellen löschen
Zitat:
|
Re: Datensatz in verknüpften Tabellen löschen
Zitat:
womöglich habe ich ein klein wenig Verwirung gestiftet. :pale: Den Vorschlag von Shmia habe ich übernommen. Die Daaten werden doch im Obigen Code gar nicht mehr gelöscht. >> Die Mastersätze werden erst gar nicht gelöscht, sondern nur als gelöscht gekennzeichnet. Genau das wird doch gemacht. Habe mich nur gefragt ob das auch nco eleganter geht. :roll: Ich fange ja den löschbefehl des Masterdatensatztes ab und überprüfe ob ein Detaildatensatz vorhanden ist, wenn ja dann setzte Stat_del auf 1 wenn nein dann komplett löschen. Sorry für die Verwirrung. Manfred Bin immer bereit was zu lernen. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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