AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Baumstruktur kopieren - Ansatz gesucht

Baumstruktur kopieren - Ansatz gesucht

Ein Thema von Grolle · begonnen am 8. Dez 2010 · letzter Beitrag vom 29. Mär 2011
Antwort Antwort
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#1

Baumstruktur kopieren - Ansatz gesucht

  Alt 8. Dez 2010, 09:31
Datenbank: MySQL • Version: 5.x • Zugriff über: Unidac
Hallo,

ich verwende eine Datenbank um verschiedene Artikellisten in einer Baumstruktur (Treeview) zu verwalten. Das klappt auch problemlos. Die Tabelle hat grob den folgenden Aufbau:
Delphi-Quellcode:
id (autoinc)
parent
level
position
Das Problem: Ich suche einen Ansatz um den kompletten Baum zu kopieren und in die DB zu schreiben. Dazu müssen alle Artikel erneut in die DB eingefügt werden. Der Knackpunkt ist das sich natürlich alle id's und parent Werte ändern, ich diese aber wissen muss - irgendwie

Viele Grüße ...

  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 8. Dez 2010, 10:01
Ich kenne mich mit MySQL nicht aus, unter MSSql habe ich es so gelöst:
Code:
ALTER Procedure [dbo].[P_CopyUebungsbaum] (@FromID int,@ToID int) as
/*
20080227 by Thomas Wassermann
Problem Cursorname bei Recursionen daher EXEC(@SQL)
*/
Declare @SQL Varchar(8000)
Select @SQL=
'
Declare @NewID int
Declare @x int
Insert Into Uebungsbaum (Beschreibung,ParentID,Sort) Select Beschreibung,@ToID,Sort from Uebungsbaum where ID=@FromID

Select @NewID=Ident_Current(''Uebungsbaum'')
INsert into Uebungsbaum_Uebungen (Uebungsbaum_id,Uebungen_IDX) select @NewID,Uebungen_IDX from Uebungsbaum_Uebungen where Uebungsbaum_id=@FromID
DECLARE My_Cursor CURSOR FOR
SELECT ID FROM Uebungsbaum WHERE ParentID=@FromID
OPEN My_Cursor

FETCH NEXT FROM My_Cursor
INTO @x
WHILE @@FETCH_STATUS = 0
BEGIN
   EXEC P_CopyUebungsbaum @x,@NewID
   FETCH NEXT FROM My_Cursor
   INTO @x
END

CLOSE My_Cursor
DEALLOCATE My_Cursor
'
Select @SQL=Replace(@SQL,'My_Cursor','My_Cursor'+Cast(@FromID as Varchar(10)))
Select @SQL=Replace(@SQL,'@FromID',Cast(@FromID as Varchar(10)))
Select @SQL=Replace(@SQL,'@ToID',Cast(@ToID as Varchar(10)))

EXEC(@SQL)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 14. Mär 2011, 11:37
Hi,

danke für deine Antwort. Leider steige ich da nicht 100% durch . Die erste Frage, die sich mir stellt, ob ich das ganze in SQL oder auch mit id's im Programm zwischenspeichern lösen könnte?

Viele Grüße ...

//Edit: Eine erste Überlegung war, ersten Knoten nehmen, in DB schreiben, ID bekommen, ersten Childknoten nehmen, parent id eintragen, in DB schreiben, wenn dieser Children hat tiefer, sonst nächsten Childknoten nehmen. Ist dieser Weg gehbar?


Geändert von Grolle (14. Mär 2011 um 11:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 14. Mär 2011, 15:11
Ja, wobei sich ein rekursiver Ansatz anbieten würde..
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 25. Mär 2011, 10:42
Hi,

versuche mich gerade an einer rekursiven Prozedur. Leider werden die Parents nicht korrekt zugeordnet
Delphi-Quellcode:
procedure Tlft.copyTree(machineId, parent : integer; startNode : TTreeNode);
var
  tmpId : integer;
  tmpData : TAssignmentData; // Record
begin
  if assigned(startNode) then
  begin
    {Daten des bestehenden Knotens auslesen}
    tmpData := data.getAssignment(integer(startnode.Data));
    {Knoten neue Maschine zuweisen}
    tmpData.machine := machineId;
    {Knoten liegt auf der obersten Ebene}
    if tmpData.parent <> 0 then
      tmpData.parent := parent;
    tmpId := data.insertAssignment(tmpData);

    copyTree(machineId, tmpId, startnode.getFirstChild);
    copyTree(machineId, tmpId, startnode.getNextSibling);
  end;
end;
Hilfe!


Geändert von Grolle (25. Mär 2011 um 12:52 Uhr)
  Mit Zitat antworten Zitat
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 26. Mär 2011, 11:55
Putsch

Edit: Crosspost Stack Overflow


Geändert von Grolle (26. Mär 2011 um 23:22 Uhr)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 29. Mär 2011, 07:52
Bei der Fülle an Informationen weiss man gar nicht, wo man anfangen soll.

Wie sieht der Baum aus?
Kann man den Code nicht aufs Wesentliche beschränken?
Was soll MaschinenId?
Was ist Parent?
Benötigt man die wirklich, um das Problem zu beschreiben?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Baumstruktur kopieren - Ansatz gesucht

  Alt 29. Mär 2011, 08:48
Hi,
das Thema ist erledigt. Der Fehler lag hier:
  copyTree(machineId, tmpId, startnode.getNextSibling);
muss aber heißen:
  copyTree(machineId, parent, startnode.getNextSibling);
Viele Grüße ...

  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 02:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf