AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensatz in verknüpften Tabellen löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Datensatz in verknüpften Tabellen löschen

Ein Thema von manfred_h · begonnen am 6. Dez 2006 · letzter Beitrag vom 7. Dez 2006
Antwort Antwort
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#1

Datensatz in verknüpften Tabellen löschen

  Alt 6. Dez 2006, 16:36
Datenbank: Firebird • Version: 1.5 • Zugriff über: Fibplus
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Datensatz in verknüpften Tabellen löschen

  Alt 6. Dez 2006, 18:11
Es müsste doch auch die Klausel
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.
Andreas
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#3

Re: Datensatz in verknüpften Tabellen löschen

  Alt 7. Dez 2006, 09:55
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Datensatz in verknüpften Tabellen löschen

  Alt 7. Dez 2006, 10:48
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. Sonst würden ja abhängige als Datensatz-Leichen in der DB rumliegen und die referentielle Integrität der DB wäre hinüber. Und genau das willst Du haben ? Ich sage nur : besser Finger weg von Master/Detail. Willst Du die Detailsätze etwa später einzeln von Hand löschen ?
Gruß
Hansa
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#5

Re: Datensatz in verknüpften Tabellen löschen

  Alt 7. Dez 2006, 12:15
Zitat von Hansa:
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Datensatz in verknüpften Tabellen löschen

  Alt 7. Dez 2006, 12:26
Zitat von manfred_h:
..Was hälst Du davon?
Wer ? Ich ? Ehrlich gesagt : nichts. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: Datensatz in verknüpften Tabellen löschen

  Alt 7. Dez 2006, 14:07
Zitat von Hansa:
Zitat von manfred_h:
..Was hälst Du davon?
Wer ? Ich ? Ehrlich gesagt : nichts. 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

womöglich habe ich ein klein wenig Verwirung gestiftet.

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.
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 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