Hallo,
stehe derzeit vor einer Aufgabe, vielleicht hat ja jemand einen Lösungsvorschlag. Ist ei wenig kompliziert, ich versuche es klar darzustellen.
Aufgabenstellung:
Es existiert ein Baum definiert durch pkey und parentkey und einem linkkey!
Jeder Datensatz zeigt mit recKey auf einen Pkey einer Tabelle TabKey!
Der linkkey ist eine Verknüpfung der Baumstruktur. D.h. ihm ist kein "originaler" Datensatz zugeordnet, dieser verweist auf den original pkey.
Man benutz ihn um gleiche Baumsequenzen/Datensätze auch an anderen Vaterknoten darstellen zu können.
Das problem ist nun das löschen von Baumzweigen, durch die verlinkungen. Bisher war es einfach indem die löschprozedur einfach iterativ durch den baum gegangen ist.
Pseudocode...
Code:
loesche ( pkey,reckey,tabkey)
begin
..
// rekursiver baumdurchlauf...
query.sql.text:='select pkey,reckey,tabkey from baumtab where parkey=:apkey';
query.parambyname('apkey').asinteger=pkey;
query.open
while not
query.eof do
begin
loesche(
query.fieldbyname(pkey),
query.fieldbyname(reckey),
query.fieldbyname(tabkey));
query.next;
end
..
// baueintrag löschen
query.sql.text:='delete from baumtab where pkey=:apkey';
query.parambyname('apkey').asinteger=pkey;
query.execsql
..
// tabelleneintrag löschen
query.sql.text:='delete from tabelle(tabkey) where pkey=:rpkey';
query.parambyname('rpkey').asinteger=reckey;
query.execsql
..
end;
so weit so gut funz alles wunderbar.
so nun die abgeänderte struktur mit den verlinkungen...
Code:
loescheNeu (pkey,linkkey,reckey,tabkey)
begin
..
// rekursiver baumdurchlauf...
query.sql.text:='select pkey,linkkey,reckey,tabkey from baumtab where parkey=:apkey';
// wenn es ein originalknoten ist, dann können auch links vorhanden sein
if linkkey=nil then
query.sql.add('or linkkey=:apkey');
query.parambyname('apkey').asinteger=pkey;
query.open
while not
query.eof do
begin
loescheNeu(
query.fieldbyname(pkey),
query.fieldbyname(linkkey),
query.fieldbyname(reckey),
query.fieldbyname(tabkey));
query.next;
end
..
// baueintrag löschen
query.sql.text:='delete from baumtab where pkey=:apkey';
// wenn es ein originalknoten ist, dann können auch links vorhanden sein
if linkkey=nil then
query.sql.add('or linkkey=:apkey');
query.parambyname('apkey').asinteger=pkey;
query.execsql
..
// tabelleneintrag löschen nur wenn Knoten kein Link ist
if linkkey=nil then
begin
query.sql.text:='delete from tabelle(tabkey) where pkey=:rpkey';
query.parambyname('rpkey').asinteger=reckey;
query.execsql
end;
..
end;
hier ist nun das problem, dass die linkzweige mehrfach durchgangen werden. wenn man einen link erstellt, dann werden automatisch von allen kindknoten links erstellt, also von der gesamten nachkommenstruktur. das bedeutet aber beim rekursivern duchgang vom baum, dass die links durch die verknüpfung zu den originalen mehrfach durchlaufen werden. zumal es auch sein kann, dass an den links noch andere links von einem anderen originalzweig hängen können!
hat da jemand eine idee, wie man per
sql-abfragen dort stopbedingungen einfügen könnte, so dass gewisse baumzweige nicht mehr durchlaufen werden müssen?
danke schon mal
grüße rené