AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Baum löschen

Ein Thema von ibp · begonnen am 21. Jan 2008
Antwort Antwort
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, 14: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz