Delphi Can
Treeview ile iç içe sonsuz gösterim - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Treeview ile iç içe sonsuz gösterim (/showthread.php?tid=6656)



Treeview ile iç içe sonsuz gösterim - YILDIRIMBEY - 16-03-2022

Merhaba arkadaşlar, malzeme yönetimi için ürün reçete listelerinin saklı olduğu iki çeşit tablom var.
birisi malzeme listesinin bilgilerinin olduğu BOM tablosu,
diğeri ise bu liste içerisinde yer alan malzemelerin referans alındığı BOMLIST tablosu,

ayrıca bir de malzemelerin kayıtlı olduğu ITEMS tablom var.

aşağıdaki gibi sonsuz iç içe girebilen bir treeview gösterimini nasıl yapabilirim.

MODEL1
MODEL1-yarımamül1-malzeme1
MODEL1-malzeme1
MODEL2-yarımamül2-yarımamül3-malzeme2
MODEL2-yarımamül2-yarımamül3-malzeme3
MODEL2-yarımamül2-yarımamül3-malzeme4

fdquery ile kullandığım sorgu şu şekilde,

Kod:
SELECT BOMLINE.BOMMASTERREF, ITEMS.Malzeme_adi, BOM.NAME FROM BOMLINE INNER JOIN BOM ON (BOMLINE.BOMMASTERREF = BOM.LOGICALREF) INNER JOIN ITEMS ON (BOMLINE.ITEMREF=ITEMS.ID) WHERE BOMLINE.LINETYPE=2 ORDER BY BOM.NAME, ITEMS.Malzeme_adi

tüm kodlarım ise şu şekilde,
Kod:
procedure TMalzemelerForm.Button2Click(Sender: TObject);
var
 CurrentDeptID, RecordDeptID: Integer;
 RootNode, DeptNode: TTreeNode;
begin
 CurrentDeptID := 0;
 Treeview1.Items.Clear;
 RootNode := Treeview1.Items.Add(nil, 'RECETE');
 DeptNode := nil;
 FDQuerym.SQL.Text := 'SELECT BOMLINE.BOMMASTERREF, ITEMS.Malzeme_adi, BOM.NAME FROM BOMLINE INNER JOIN BOM ON (BOMLINE.BOMMASTERREF = BOM.LOGICALREF) INNER JOIN ITEMS ON (BOMLINE.ITEMREF=ITEMS.ID) WHERE BOMLINE.LINETYPE=2 ORDER BY BOM.NAME, ITEMS.Malzeme_adi';
 FDQuerym.Open;
 try
   FDQuerym.First;
   while not FDQuerym.Eof do
   begin
     RecordDeptID := FDQuerym.FieldByName('BOMMASTERREF').AsInteger;
     if (DeptNode = nil) or (RecordDeptID <> CurrentDeptID) then
     begin
       DeptNode := Treeview1.Items.AddChild(RootNode, FDQuerym.FieldByName('NAME').AsString);
       CurrentDeptID := RecordDeptID;
     end;
     Treeview1.Items.AddChild(DeptNode, FDQuerym.FieldByName('Malzeme_adi').AsString);
     FDQuerym.Next;
   end;
 finally
   FDQuerym.Close;
 end;
end;

bu komutlar ile 1 adet child oluşturabiliyorum ama sonsuz child olmuyor. nasıl yapabilirim

şimdiden teşekkür ederim.


Cvp: Treeview ile iç içe sonsuz gösterim - RAD Coder - 17-03-2022

Merhaba,
Bu yapı için öncelikle tablonuzda id (primary key olmalı), parent_id ve bir başlık alanınız olmalı.
İç içe geçecek tüm kayıtlar aynı tabloda olmalı.
örnek
[attachment=1990]

Parent_id başlığın hangi ana gruba bağlı olduğunu gösterir.
Parent_id -1 verirseniz (yada herhangi bir id de olabilir.) bu doğrudan ana dizin (root) olur. 

O kadar koda da gerek kalmaz. 
Tek satırda sonsuz adet içe içe kayıt oluşturup listeleyebilirsiniz. 
Düzeltme:  tabloyu design time da open ederseniz o tek satır koda da gerek kalmaz. Shy

örnek uygulama
[attachment=1992]

Kullanılan bileşen, dxDBTreeView
Ayarlanan özellikleri
[attachment=1991]