Autor Beitrag
funky.w
Hält's aus hier
Beiträge: 4

Win XP
D 7 Prof.
BeitragVerfasst: Fr 11.04.08 21:58 
Hi all,

ich stehe vor einem scheinbar unlösbaren und nirgens dokumentierten Problem:

Unter Verwendung von Delphi 7 arbeite ich an einer Datenbankanwendung, die die BDE verwendet. Ich lasse die notwendigen Tabellen und zugehörigen Indizes per Quellcode erstellen.

Bei den Master/Detail-Tabellen lässt sich zwar eine Relation erstellen, aber ich habe noch nicht herausgefunden, wie ich eine referentielle Integrität per Quellcode erzeugen kann.

Wie kann ich also einen Löschvorgang eines Datensatzes in der Mastertabelle an alle Detailtabellen weitergeben?

Mit der Datenbankoberfläche ist dies kein Problem - aber nur manuell und nicht dynamisch.

Es wäre schön, wenn mir irgendjemand einen Tipp geben könnte.

Funky.W
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Fr 11.04.08 23:30 
Welches DMBS verwendest du? Falls es dBase oder Paradox ist könnte ich mir vorstellen das Aufgrund der hoffnungslosen Veraltung dieser Desktopdatenbanken dies dort nicht möglich ist auf Datenbankebene zu definieren.
funky.w Threadstarter
Hält's aus hier
Beiträge: 4

Win XP
D 7 Prof.
BeitragVerfasst: Fr 11.04.08 23:47 
user profile iconBernhard Geyer hat folgendes geschrieben:
Welches DMBS verwendest du? Falls es dBase oder Paradox ist könnte ich mir vorstellen das Aufgrund der hoffnungslosen Veraltung dieser Desktopdatenbanken dies dort nicht möglich ist auf Datenbankebene zu definieren.


Es basiert auf Paradox 7 und das DBMS ist in diesem Fall durchaus dazu in der Lage, referentielle Integrität mit Löschweitergabe zu erzeugen. Es ist, wie schon erwähnt, mit der von Borland mitgelieferten Datenbankoberfläche manuell möglich. Das funktioniert nur nicht, wenn ich die Tabellen/Datenbank dynamisch zur Laufzeit erstelle.

...


Zuletzt bearbeitet von funky.w am Sa 12.04.08 09:53, insgesamt 1-mal bearbeitet
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Sa 12.04.08 08:52 
Wäre da nicht ein einfacher SQL string im query angebracht:

Delete From Tabelle2 Where Tabelle2.ArtikelNummer=Tabelle1Artikelnummer

oder mit einem Table Artikelnummer aus Tabelle1 merken in LArt dann einen Find auf Artikelnummer in Tabelle2 und den Datensatz löschen, dann in einer Schleife mit Find solange suchen und löschen bis nichts mehr gefunden wird.
funky.w Threadstarter
Hält's aus hier
Beiträge: 4

Win XP
D 7 Prof.
BeitragVerfasst: Sa 12.04.08 09:40 
user profile iconSmileySN hat folgendes geschrieben:
Wäre da nicht ein einfacher SQL string im query angebracht:

Delete From Tabelle2 Where Tabelle2.ArtikelNummer=Tabelle1Artikelnummer

oder mit einem Table Artikelnummer aus Tabelle1 merken in LArt dann einen Find auf Artikelnummer in Tabelle2 und den Datensatz löschen, dann in einer Schleife mit Find solange suchen und löschen bis nichts mehr gefunden wird.



Danke, sicherlich eine Möglichkeit, jedoch zu langsam.

Meine eigene Lösung ist dann doch deutlich schneller:

procedure TDatenModul.DB_1BeforeDelete(DataSet: TDataSet);
begin
DB_2.First;
While not DB_2.Eof do
begin
If DB_2.FieldValues['DB_1_Verkn'] = DB_1.FieldValues['Idx_DB_1'] then
begin
DB_2.Delete;
end;
end;
end;

Aber das ist ja nicht der Kern der Sache (meiner Frage):

Kann man referentielle Integrität zwischen Haupt- und Detailtabellen zur Laufzeit so erzeugen, wie es mit der Datenbankoberfläche von Borland manuell machbar ist?!

Damit ist es ja auch per Programm ralisierbar!

...