![]() |
Datenbank: MySQL • Version: 5.x • Zugriff über: Unidac
Baumstruktur kopieren - Ansatz gesucht
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:
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 :gruebel:
id (autoinc)
parent level position Viele Grüße ... |
AW: Baumstruktur kopieren - Ansatz gesucht
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) |
AW: Baumstruktur kopieren - Ansatz gesucht
Hi,
danke für deine Antwort. Leider steige ich da nicht 100% durch :stupid:. 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? |
AW: Baumstruktur kopieren - Ansatz gesucht
Ja, wobei sich ein rekursiver Ansatz anbieten würde..
|
AW: Baumstruktur kopieren - Ansatz gesucht
Hi,
versuche mich gerade an einer rekursiven Prozedur. Leider werden die Parents nicht korrekt zugeordnet :gruebel:
Delphi-Quellcode:
Hilfe!
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; |
AW: Baumstruktur kopieren - Ansatz gesucht
|
AW: Baumstruktur kopieren - Ansatz gesucht
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? |
AW: Baumstruktur kopieren - Ansatz gesucht
Hi,
das Thema ist erledigt. Der Fehler lag hier:
Delphi-Quellcode:
copyTree(machineId, tmpId, startnode.getNextSibling);
muss aber heißen:
Delphi-Quellcode:
copyTree(machineId, parent, startnode.getNextSibling);
Viele Grüße ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 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