많은 시스템에는 다음과 유사한 테이블 구조가 있습니다(table1).
ID이름 부모 ID
------------------------------------- -------
001 전자제품0
002 메탈 0
003 커패시터 전자장치001
004 저항전자공학001
005 비철금속002
그리고 모두가 트리(TreeView)를 사용하여 표시하는 데 익숙하므로 전체 테이블의 분류가 잘 표시될 수 있습니다. 그러나 데이터의 양이 많으면 트리 생성 속도가 느려지며, 특히 재귀를 사용하여 구현할 경우 데이터베이스 액세스 횟수가 많아지고(레이어 수에 따라) 효과가 더 커집니다. 세 개의 레이어로 사용하면 분명합니다. 트리 구조를 생성하는 좋은 방법은 다음과 같습니다.
이 알고리즘은 데이터베이스에 한 번만 액세스합니다. 구체적인 구현은 다음과 같습니다.
1. 한 번에 데이터베이스에서 모든 데이터를 가져오고 ParentID 필드에 따라 정렬하여 각 데이터 조각의 상위 노드가 앞에 오도록 합니다.
2. 첫 번째 데이터 조각을 꺼내 트리에 추가합니다. 이를 트리에 추가할 때 먼저 이 데이터의 상위 노드를 찾습니다. 상위 노드가 없으면 이 레코드를 직접 1단계 노드로 사용합니다. 나무.
3. 그래도 데이터가 남아 있으면 꺼내어 데이터가 없어질 때까지 2단계를 수행하세요.
프로그램 구현:
이 프로그램은 stlID의 TStringList 변수를 사용하여 해당 트리에 있는 각 노드의 ID 값을 저장하고 FindParent 함수를 사용하여 부모 노드를 찾습니다.
함수 FindParent(ID:String):TTreeNode;
var
i:정수;
시작하다
결과:=nil;
i:=TreeView1.Items.Count-1에서 0까지 수행
stlID.Strings[i]=ID인 경우
시작하다
결과:=TreeView1.Items[i];
부서지다;
끝;
끝;
// 스패닝 트리
절차 CreateTree;
var
tmpNode:TTreeNode;
시작하다
쿼리1.닫기;
Query1.SQL.Text:='상위 ID별로 table1 순서에서 * 선택';
쿼리1.열기;
쿼리1.첫 번째;
Query1.Eof가 아닌 동안
시작하다
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//레코드 ID
쿼리1.다음;
끝;
끝;