多くのシステムには、次のようなテーブル構造があります (表 1)。
ID名親ID
-------------------------------------------------- -------
001 エレクトロニクス0
002 メタル0
003 コンデンサエレクトロニクス001
004 抵抗エレクトロニクス001
005 非鉄金属002
そして、誰もがツリー(TreeView)を使用して表示することに慣れているため、テーブル全体の分類をうまく表示できます。ただし、データ量が多い場合、ツリーの生成は遅くなり、特に再帰を使用して実装する場合、データベースのアクセス数が多くなり(階層数に応じて)、効果が大きくなります。 3層で使用すると明らかです。ここではツリー構造を生成する良い方法を紹介します。
このアルゴリズムはデータベースに 1 回だけアクセスします。具体的な実装は次のとおりです。
1. データベースからすべてのデータを一度に取得し、ParentID フィールドに従って並べ替えて、各データの親ノードがデータの前にあることを確認します。
2. 最初のデータを取り出してツリーに追加するとき、まずこのデータの親ノードを見つけます。親ノードがない場合は、このレコードをそのまま第 1 レベルのノードとして使用します。木。
3. データが残っている場合は、それを取り出し、データがなくなるまで手順 2 を実行します。
プログラムの実装:
このプログラムは、stlID の TStringList 変数を使用して、対応するツリー内の各ノードの ID 値を格納し、FindParent 関数を使用して親ノードを検索します。
関数 FindParent(ID:String):TTreeNode;
変数
i:整数;
始める
結果:=nil;
for i:=TreeView1.Items.Count-1 を 0 まで実行します
stlID.Strings[i]=ID の場合
始める
結果:=TreeView1.Items[i];
壊す;
終わり;
終わり;
// スパニングツリー
手順 CreateTree;
変数
tmpNode:TTreeNode;
始める
クエリ1.close;
Query1.SQL.Text:='select * from table1 order by ParentID';
クエリ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.次へ;
終わり;
終わり;