Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Baum löschen (https://www.delphipraxis.net/107049-baum-loeschen.html)

ibp 21. Jan 2008 13:12

Datenbank: Interbase • Version: 6.5 • Zugriff über: BDE

Baum löschen
 
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é


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz