Banyak sistem memiliki struktur tabel yang mirip dengan berikut (tabel1):
IDNama ParentID
--------------------------------------------------- -------
001 Elektronik0
002 Logam 0
003 Kapasitor Elektronik001
004 Perlawanan Elektronik001
005 Logam bukan besi002
Dan semua orang terbiasa menggunakan pohon (TreeView) untuk menampilkan, sehingga klasifikasi seluruh tabel dapat ditampilkan dengan baik. Namun jika jumlah datanya besar maka pembuatan pohonnya akan lebih lambat, apalagi jika menggunakan rekursi untuk mengimplementasikannya, jumlah akses database akan banyak (tergantung jumlah layer), dan efeknya akan lebih besar. jelas bila digunakan dalam tiga lapisan. Berikut adalah cara yang baik untuk menghasilkan struktur pohon.
Algoritma ini hanya mengakses database satu kali. Implementasi spesifiknya adalah sebagai berikut:
1. Ambil semua data dari database sekaligus dan urutkan berdasarkan kolom ParentID, untuk memastikan bahwa node induk dari setiap bagian data ada di depannya.
2. Keluarkan potongan data pertama dan gambarkan ke dalam pohon. Saat menambahkannya ke pohon, cari dulu simpul induk dari data ini. Jika tidak ada simpul induk, gunakan catatan ini secara langsung sebagai simpul tingkat pertama pohon.
3. Jika masih ada data, keluarkan dan lakukan langkah ke 2 hingga tidak ada data lagi.
Implementasi program:
Program ini akan menggunakan variabel TStringList dari stlID untuk menyimpan nilai ID setiap node di pohon yang sesuai, dan menggunakan fungsi FindParent untuk menemukan node induk.
fungsi FindParent(ID:String):TTreeNode;
var
saya:Bilangan Bulat;
mulai
hasil:=nihil;
untuk i:=TreeView1.Items.Count-1 hingga 0 lakukan
jika stlID.Strings[i]=ID maka
mulai
hasil:=TreeView1.Item[i];
merusak;
akhir;
akhir;
// Pohon merentang
Prosedur Buat Pohon;
var
tmpNode:TTreeNode;
mulai
Query1.close;
Query1.SQL.Text:='pilih * dari tabel1 diurutkan berdasarkan ParentID';
Kueri1.Buka;
Kueri1.Pertama;
sementara bukan Query1.Eof lakukan
mulai
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//ID Catatan
Kueri1.Berikutnya;
akhir;
akhir;