Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
Delphi 7 Enterprise
|
Re: [MsSQL] Stored Proc für Baum Zusammenstellung
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
|
|
Zitat
|