TTreeView generowane z bazy danych

0

Witam,

Mam taki problem, o którym pisano już nie raz. Otóż muszę wygrnerować drzewo z Itemów z bazy danych w TreeView.
W bazie mam następujące dane:
id_kat, id_korzenia, nazwa. Kod, który napisałem do robienia tego wygląda następująco:

procedure TForm1.BudujDrzewoKategorii(Sender: TObject);
var
  i,j:integer;
  TreeViewer: TTreeView;
begin
TreeViewer:=(Sender as TTreeView);
TreeViewer.Items.Clear;
QueryKat.SQL.Clear;
QueryKat.SQL.Add('select * from kategorie order by id_korzenia, id_kat');
QueryKat.Open;

QueryKat.Tag:=Max(QueryKat.RowsAffected,QueryKat.RecordCount);

Kategorie:=nil;
SetLength(Kategorie,QueryKat.Tag);

if QueryKat.Tag>0 then
begin
  for i:=0 to QueryKat.Tag-1 do
  begin
  Kategorie[i]:=QueryKat.FieldByName('id_kat').AsInteger;
  if QueryKat.FieldByName('id_korzenia').AsInteger=0 then
    begin
    TreeViewer.Items.Add(nil,QueryKat.FieldByName('nazwa').AsString);
  end
  else
  begin
              for j:=0 to Length(Kategorie)-1 do
                begin
                if Kategorie[j]=QueryKat.FieldByName('id_korzenia').AsInteger then
                    TreeViewer.Items.AddChild(TreeViewer.Items[j],QueryKat.FieldByName('nazwa').AsString);
                end;
  end;
  QueryKat.Next;
  end;
  end;
end;   

Gdzie Kategorie[] to globalna tablica w której przechowuję id_kat i-tego węzła w drzewie.
No i problem polega na tym, że jeśli w bazie wszystko jest po kolei to ładnie śmiga, ale problem zaczyna się w momencie kiedy w bazie najpierw jest child który ma parenta dodanego później. Wtedy po prostu takie dane liście nie są dodawane. (To jest zresztą logiczne na podstawie kodu). Wiem, że rozwiązaniem jest tutaj rekurencja ale od dwóch dni się z nią męczę i nie mogę dojść do strzału. Czy ktoś może mi podpowiedzieć jak to zrobić rekurencyjnie?

Pozdrawiam i dziękuję za pomoc.

0

idParent, id - tworzysz taki indeks wtedy będzie posortowane jak należy.

0

No nie do końca, bo muszę mieć możliwość edycji drzewa takich kategorii. Kategorie mogą mieć zmieniane hierarchie. Przez to może zdażyć się tak, że child będzie miał niższe id niż jego parent. Oto przykład z mojej bazy, który przez to nie działa:

1 0 kat1
2 0 kat2
7 0 kat3
8 3 kat4
3 5 kat5
5 7 kat6

Jak widać sortowanie zastosowałem właśnie takie jak zaproponowałeś.
Pozdrawiam

0

id - to numer - klucz (np. autoincrement)
idParent - to id rodzica, czyli korzenia

Te kategorie i inne dane nie mają z tym nic wspólnego

0

Oczywiście, że nie mają z tym nic wspólnego. Napisałem tylko aby dokładnie było widać jak u mnie wygląda to w bazie danych. Kombinuję teraz żeby najpiwer wszystkie dane pobrać do trzech tablicy i potem z nich budować drzewo ale ciągle nie wiem jak napisać rekurencję.

0

Przeczytałem z grubsza .. może daj tak : przed dodaniem sprawdź czy dany 'parent' istnieje, jeśli tak to dodajesz.. jeśli nie - odsuwasz na później. Gdy lista dojdzie do końca zabierasz się za pozostałe itemy ... Nie wiem czy taki sposób Ci odpowiada...

0

jak chcesz to zrobić jednym zapytaniem to powodzenia ...

moja rada:
zał: jeśli dana krotka jest korzeniem (tzn nie ma parenta) to idParent = 0
pierwsze zapytanie

SELECT id, idParent FROM drzewko WHERE idParent = 0

bierzesz pierwszy, dodajesz go do treeview i robisz

SELECT id, idParent FROM drzewko WHERE idParent = idPierwszegoZPoprzedniegoZapytania

bierzesz pierwszy, dodajesz go do treeview i robisz

SELECT ...

i tak aż do końca, a potem drugi, trzeci i aż zrobisz całe drzewo. Bardzo ładnie to zrobisz rekurencyjnie, tylko sobie musisz procedurkę napisać dobrze

1 użytkowników online, w tym zalogowanych: 0, gości: 1