TreeView için Sorgu Tasarımı
Bu doküman, nesnelerde kullanılan TreeView (ağaç görünümü) özelliği için gereken sorgu setinin nasıl hazırlanacağını açıklar. Ekte iletilen örnek, departmanlara bağlı kullanıcıları ağaç yapısında listeleyen bir TreeView için hazırlanmış üç sorguyu temel alır.
1. Genel Mantık
Bir TreeView tanımı için toplam 3 sorgu hazırlanır. Bu üç sorgu birlikte çalışarak ağacın kök (root) düğümlerini, bu düğümlerin alt elemanlarını (childs) ve gerektiğinde tüm yapının tek seferde getirilmesini (genel/ana sorgu) sağlar. Üç sorgunun isimlendirmesi, ana sorgunun adına göre belirlenir. Ana sorgunun adı ne ise, diğer iki sorgu bu isme aşağıdaki eklerle devam eder:
• Ana sorgu (Genel sorgu): <SORGUADI>
• Kök (Root) sorgusu: <SORGUADI>Root
• Alt eleman (Childs) sorgusu: <SORGUADI>Childs
Örneğin ekte iletilen örnekte ana sorgunun adı DEPTUSER olduğu için diğer sorgular DEPTUSERRoot ve DEPTUSERChilds olarak adlandırılmıştır. Kendi TreeView'ınızı tasarlarken ana sorgunuza uygun bir isim seçtiğinizde, diğer iki sorguyu aynı isimle, sadece Root ve Childs ekleriyle oluşturmanız gerekir.
Not: Sorgu isimlerindeki bu isimlendirme kuralı, nesne özelliklerinde TreeView tanımlanırken sorgunun otomatik olarak tanınması ve doğru şekilde eşleştirilmesi için gereklidir. İsimlendirme kuralına uyulmazsa TreeView düzgün çalışmaz
2. Sorgu Yapısı ve Zorunlu Alanlar
Üç sorgunun her biri, aşağıdaki dört alanı aynı sırada döndürmelidir:
ID: Ağaçtaki düğümün benzersiz kimliği. Detay forma bağlanacaksa, bu alan ilgili formun kayıt ID'si ile aynı olmalıdır.
PARENTID: Düğümün bağlı olduğu üst (parent) düğümün ID'si. Kök seviyedeki düğümler için NULL döner
DESCRIPTION: Ağaçta kullanıcıya gösterilecek metin (etiket).
CHILDCOUNT: Düğümün alt eleman sayısı. 0 ise düğümün altında genişletilecek bir dal olmadığını belirtir.
Not: Bu dört alan tüm sorgularda bulunmalı ve alan adları (ID, PARENTID, DESCRIPTION, CHILDCOUNT) birebir bu şekilde yazılmalıdır.
3. Üç Sorgunun Görevleri
3.1 Ana Sorgu — SORGUADI
Ağacın tüm seviyelerini (hem kök düğümleri hem de bunların altındaki elemanları) tek bir sorgu içinde, genellikle UNION ile birleştirerek döndürür. Nesne özelliğinde TreeView etkinleştirildiğinde varsayılan/genel sorgu olarak bu kullanılır.
Örnek: DEPTUSER
select OSUSERS.ID, OSDEPARTMENTS.ID PARENTID, OSUSERS.FIRSTNAME + ' ' +
OSUSERS.LASTNAME DESCRIPTION,
0 CHILDCOUNT
from OSUSERS, OSDEPARTMENTS
where OSDEPARTMENTS.ID=OSUSERS.DEPARTMENT and OSDEPARTMENTS.ID <> 'system'
union
select D.ID, null as PARENTID, D.DESCRIPTION,
(select count(U.ID) from OSUSERS U where U.DEPARTMENT=D.ID) CHILDCOUNT
from OSDEPARTMENTS D
where D.ID <> 'system'
3.2 Root Sorgusu — SORGUADI Root
Ağacın en üst (kök) seviyesindeki düğümleri döndürür. PARENTID alanı bu sorguda her zaman NULL'dur, çünkü bu düğümlerin bir üst seviyesi yoktur. TreeView ilk açıldığında görünen düğümler bu sorgudan gelir.
Örnek: DEPTUSERRoot
select D.ID, null as PARENTID, D.DESCRIPTION,
(select count(U.ID) from OSUSERS U where U.DEPARTMENT=D.ID) CHILDCOUNT
from OSDEPARTMENTS D
where D.ID <> 'system'
3.3 Childs Sorgusu — SORGUADI Childs
Kullanıcı bir düğümü genişlettiğinde (üzerine tıkladığında) çalışır ve seçilen düğümün doğrudan alt elemanlarını döndürür. Bu sorgu, tıklanan düğümün ID'sini parametre olarak alır ve where koşulunda kullanır.
Örnek: DEPTUSERChilds
select OSUSERS.ID, OSDEPARTMENTS.ID PARENTID, OSUSERS.FIRSTNAME + ' ' +
OSUSERS.LASTNAME DESCRIPTION,
0 CHILDCOUNT
from OSUSERS, OSDEPARTMENTS
where OSDEPARTMENTS.ID=OSUSERS.DEPARTMENT and OSDEPARTMENTS.ID <> 'system'
and OSDEPARTMENTS.ID = '<?=PARENTID>'
Buradaki <?=PARENTID> ifadesi, kullanıcının genişlettiği düğümün ID değeri ile çalışma
zamanında otomatik olarak değiştirilen bir parametre yer tutucusudur.
4. Detay Forma Bağlantı
TreeView, bir düğüme tıklandığında ilgili kaydın detayını bir forma açacak şekilde kullanılacaksa, sorgudaki ID alanı, açılacak formun ilişkili olduğu kaydın kimliği ile birebir aynı olmalıdır. TreeView, seçilen düğümün ID değerini kullanarak detay formunu bu kayda göre açar.
Örnek senaryoda kullanıcı düğümlerinin ID alanı OSUSERS.ID, departman düğümlerinin ID alanı ise OSDEPARTMENTS.ID olarak ayarlanmıştır. Böylece bir kullanıcı düğümüne tıklandığında, ilgili kullanıcının detay formu doğru ID ile açılabilir
Not: Ağaçta birden fazla farklı tipte düğüm varsa (örnekte hem departman hem kullanıcı) ve her tip farklı bir detay formuna gidecekse, ID alanlarının çakışmaması ve her tip için doğru formun açıldığının ayrıca kontrol edilmesi gerekir.
5. İsimlendirme Özeti
Kendi TreeView'ınız için sorgu hazırlarken izleyeceğiniz isimlendirme şablonu:
SORGUADI : Ana sorgu — tüm ağacı (root + childs) UNION ile döndürür.
SORGUADI Root : Sadece kök seviyedeki düğümleri döndürür (PARENTID = NULL).
SORGUADI Childs : Seçilen bir düğümün alt elemanlarını döndürür (where ...ID =
'<?=PARENTID>').
Bu üç sorgu hazırlandıktan sonra nesne özelliklerinde TreeView tanımı açılırken ana sorgu
(<SORGUADI>) seçilir; sistem Root ve Childs sorgularını isimlendirme kuralına göre otomatik
olarak ilişkilendirir.