Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatz in verknüpften Tabellen löschen (https://www.delphipraxis.net/82008-datensatz-verknuepften-tabellen-loeschen.html)

manfred_h 6. Dez 2006 16:36

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

shmia 6. Dez 2006 18:11

Re: Datensatz in verknüpften Tabellen löschen
 
Es müsste doch auch die Klausel
SQL-Code:
FOREIGN KEY (ID_AREA) REFERENCES NURSING_H (ID) ON UPDATE CASCADE ON DELETE NO ACTION
möglich sein. (Bitte genaue Syntax in FB Hilfe nachschauen)

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.

manfred_h 7. Dez 2006 09:55

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

Hansa 7. Dez 2006 10:48

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 ?

manfred_h 7. Dez 2006 12:15

Re: Datensatz in verknüpften Tabellen löschen
 
Zitat:

Zitat von Hansa
:shock: Ich sage nur : besser Finger weg von Master/Detail. Willst Du die Detailsätze etwa später einzeln von Hand löschen ?

Hallo Hansa

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:
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;
Dadurch liegt nichts "lose" rum.
Was hälst Du davon?

Manfred

Hansa 7. Dez 2006 12:26

Re: Datensatz in verknüpften Tabellen löschen
 
Zitat:

Zitat von manfred_h
..Was hälst Du davon?

Wer ? Ich ? Ehrlich gesagt : nichts. :mrgreen: Shmia hat doch gesagt, was zu tun ist. Die Mastersätze werden erst gar nicht gelöscht, sondern nur als gelöscht gekennzeichnet. Ich verstehe allerdings immer noch nicht, warum die Detailsätze vorhanden sein müssen, wenn der zugehörige Mastersatz gar nicht mehr exist. oder eben unsichtbar gemacht werden soll.

manfred_h 7. Dez 2006 14:07

Re: Datensatz in verknüpften Tabellen löschen
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von manfred_h
..Was hälst Du davon?

Wer ? Ich ? Ehrlich gesagt : nichts. :mrgreen: Shmia hat doch gesagt, was zu tun ist. Die Mastersätze werden erst gar nicht gelöscht, sondern nur als gelöscht gekennzeichnet. Ich verstehe allerdings immer noch nicht, warum die Detailsätze vorhanden sein müssen, wenn der zugehörige Mastersatz gar nicht mehr exist. oder eben unsichtbar gemacht werden soll.

Ja dich habe ich gemeint Hansa :wink:

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