Hallo,
ich bin mir grade nicht sicher, ob ich hier in den richtigen Unterbereich des Forums poste, aber mein Problem hat mit Datenbanken zu tun *g*
Es stellt sich mir das Problem, dass ich eine gewisse Anzahl an Tabellen in einer Datenbank habe, welche durch Fremdschlüsselbeziehungen miteinander verbunden sind. Möchte ich nun aus einer Tabelle einen Datensatz kopieren, so sollen alle Datensätze welche mit diesem DS via FK-Beziehung verbunden sind, ebenfalls kopiert werden und die Datensätze welche in der FK-Tabelle widerrum mit einer FK-Beziehung verbunden sind ebenso, etc...
Um die Reihenfolge herauszubekommen, in welcher die Datensätze kopiert werden sollen schreibe ich alle Tabellen mit FK-Beziehung in ein Array mit folgendem Aufbau:
Delphi-Quellcode:
Timp = record
col: string;
r_tn: string;
r_col: string;
end;
Texp = record
col: string;
r_tn: string;
r_col: string;
end;
TTables = record // Tabellen mit FK-Beziehung
tn: string;
arr_i: array of Timp; // Tabellen, auf die referenziert wird
arr_e: array of Texp; // Tabellen, von denen aus referenziert wird
end;
Mittels folgender compare-Funktion wird dann ermittelt, werden 2 Tabellen verglichen. Referenziert Tabelle 1 auf Tabelle 2, so ist das Ergebnis = 1, referenziert Tabelle 2 auf Tabelle 1, so ist das Ergebnis -1:
Delphi-Quellcode:
function Timport_form.TableCopyCompare(object0, object1: TTables) : integer;
var
rv, i, j: integer;
left, right: TTables;
refs: string;
begin
rv := 0;
left := object0;
right := object1;
if rv = 0 then
begin
if left.arr_i <> nil then
begin
for i := 0 to Length(left.arr_i) - 1 do
begin
refs := left.arr_i[i].r_tn;
if refs = right.tn then
rv := 1;
end;
end;
if right.arr_i <> nil then
begin
for i := 0 to Length(right.arr_i) - 1 do
begin
refs := right.arr_i[i].r_tn;
if refs = left.tn then
rv := -1;
end;
end;
end;
result := rv;
end;
Um nun die Reihenfolge herauszubekommen, möchte ich das Array mit den Tabellen untereinander mittels Quicksort und obiger Comparefunktion so ordnen, wie am Anfang beschrieben. Aber dafür bin ich irgendwie zu blöd. Könnte mir einer beim Aufbau meines QS helfen? ^^
So weit bin ich bis jetzt:
Delphi-Quellcode:
procedure Timport_form.QuickSort(
var arr:
array of TTables; inf, sup: Integer);
var
i, j, z: Integer;
pivot: TTables;
aux: TTables;
sl: TStringlist;
begin
i := inf;
j := sup;
sl := TStringlist.Create;
if inf < sup
then
begin
pivot := arr[(inf + sup)
div 2];
while i <= j
do
begin
while (i < sup)
and (TableCopyCompare(arr[i], pivot) < 0)
do
Inc(i);
while (j > inf)
and (TableCopyCompare(arr[j], pivot) > 0)
do
Dec(j);
if i <= j
then
begin
aux := arr[i];
arr[i] := arr[j];
arr[j] := aux;
Inc(i);
Dec(j);
for i := 0
to Length(arr_tables) - 1
do
sl.Add(arr_tables[i].tn + '
: ' + IntToStr(Length(arr_tables[i].arr_i)) + '
, ' + IntToStr(Length(arr_tables[i].arr_e)));
ShowMessage(sl.Text);
end;
end;
end;
if j > inf
then
QuickSort(arr, inf, j);
if i < sup
then
QuickSort(arr, i, sup);
end;
Gruß