![]() |
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:
so weit so gut funz alles wunderbar.
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 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