Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Baumstruktur kopieren - Ansatz gesucht (https://www.delphipraxis.net/156593-baumstruktur-kopieren-ansatz-gesucht.html)

Grolle 8. Dez 2010 08:31

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:
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 :gruebel:

Viele Grüße ...

Bummi 8. Dez 2010 09:01

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)

Grolle 14. Mär 2011 10:37

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?

Bummi 14. Mär 2011 14:11

AW: Baumstruktur kopieren - Ansatz gesucht
 
Ja, wobei sich ein rekursiver Ansatz anbieten würde..

Grolle 25. Mär 2011 09:42

AW: Baumstruktur kopieren - Ansatz gesucht
 
Hi,

versuche mich gerade an einer rekursiven Prozedur. Leider werden die Parents nicht korrekt zugeordnet :gruebel:
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!

Grolle 26. Mär 2011 10:55

AW: Baumstruktur kopieren - Ansatz gesucht
 
Putsch :stupid:

Edit: Crosspost Stack Overflow

alzaimar 29. Mär 2011 06:52

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?

Grolle 29. Mär 2011 07:48

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 12:04 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