Thema: Delphi Baum löschen

Einzelnen Beitrag anzeigen

Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#1

Baum löschen

  Alt 21. Jan 2008, 13:12
Datenbank: Interbase • Version: 6.5 • Zugriff über: BDE
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é
  Mit Zitat antworten Zitat