Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: [MsSQL] Stored Proc für Baum Zusammenstellung

  Alt 18. Aug 2006, 02:05
Hier mal ein Beispiel wie man einen Baum in einen TreeView einlesen kann, mit nur einer Datenbankabfrage...

Dafür sind allerdings noch ein paar kleine Änderungen an obiger Struktur nötig...
SQL-Code:
CREATE PROCEDURE proc_node (@ParentID INT, @Level INT, @NurBlaetter BIT) AS

DECLARE @id INT
DECLARE @bezeichnung VARCHAR(1000)

DECLARE cursor_nodes CURSOR LOCAL FOR
  SELECT id, bezeichnung
  FROM nodes
  WHERE COALESCE(parentid, 0) = @ParentID
  ORDER BY reihenfolge

SET @level = @level + 1

OPEN cursor_nodes
FETCH NEXT FROM cursor_nodes INTO @id, @bezeichnung
WHILE @@FETCH_STATUS = 0 BEGIN
  IF (SELECT COUNT(*) FROM nodes WHERE parentid = @id) = 0
     OR @NurBlaetter = 0
  BEGIN
    INSERT INTO ##temp (ID, Level, Bezeichnung) VALUES (@id, @level, @bezeichnung)
  END
  EXEC proc_node @id, @level, @NurBlaetter

  FETCH NEXT FROM cursor_nodes INTO @id, @bezeichnung
END

CLOSE cursor_nodes
DEALLOCATE cursor_nodes
SQL-Code:
CREATE PROCEDURE proc_main (@ParentID INT, @NurBlaetter BIT) AS

CREATE TABLE ##temp (
  ID INT,
  Level INT,
  Bezeichnung VARCHAR(1000)
)

EXEC proc_node @ParentID, 0, @NurBlaetter
SELECT *
FROM ##temp

DROP TABLE ##temp
Datenbankzugriff über DBExpress...
Delphi-Quellcode:
procedure fillTreeview(Tree:TTreeview; SQLConnection:TSQLConnection);

  procedure fill(Level:byte; ANode:TTreeNode; SDS:TSimpleDataSet);
  var abbruch:boolean;
      Node:TTreeNode;
  begin
    abbruch:=false;
    while not SDS.Eof and not abbruch do begin
      Node:=Tree.Items.AddChild(
        ANode,
        SDS.FieldByName('bezeichnung').AsString
      );
      SDS.Next;
      if SDS.FieldByName('level').AsInteger > Level then
        fill(Level+1, Node, SDS);
      if SDS.FieldByName('level').AsInteger < Level then
        abbruch:=true;
    end;
  end;

var SDS:TSimpleDataSet;
begin
  Tree.Items.Clear;
  SDS:=TSimpleDataSet.Create(nil);
  try
    SDS.Connection:=SQLConnection;
    SDS.DataSet.CommandType:=ctStoredProc;
    SDS.DataSet.CommandText:='proc_main';
    SDS.DataSet.ParamByName('parentid').AsInteger:=0;
    SDS.DataSet.ParamByName('nurblaetter').AsBoolean:=false;
    SDS.Open;
    fill(SDS.FieldByName('level').AsInteger, nil, SDS);
    SDS.Close;
  finally
    SDS.free;
  end;
end;
Aufruf...
Delphi-Quellcode:
procedure TForm.ButtonClick(Sender: TObject);
begin
  fillTreeview(TreeView, SQLConnection);
end;
Gruss
Thorsten
Miniaturansicht angehängter Grafiken
baum_107.png  
  Mit Zitat antworten Zitat