FireBird & TTreeView

0

Witam, potrzebuję za pomocą JEDNEGO zmyślnego zapytania do bazy FireBird otrzymać listę rekordów powiązanych ze sobą jako Parent-Child a później przypisać to np. do TTreeView.

Tabela z bazie ma m.in. pola:
ID, Parent_ID, ....
2450, null
2458, 2450
2741, 2458
2910, 2741

Drzewo zależności wyglądać ma tak:
2450
∟2458
∟2741
∟2910

Będę wdzięczny za wskazówkę jak zrobić takie zapytanie za pomocą jednego zapytania, ewentualnie wskazówkę jak zabudować procedurę która zwróci mi listę zależnych rekordów.

Z góry dziękuję.

0

może tak:

select TEST.id as parent, a.id as child from TEST,TEST a where TEST.id=a.parent_id
0

Niestety z tego co szukałem to coś takiego nie było wykonalne w Firebirdzie. Dlatego ja rozwiązałem to w ten sposób, że u mnie funkcja budująca drzewko dodawała po kolei elementy pobrane za pomocą
select * from TEST
Przed dodaniem nowego elementu wyszukuję rodzica i dodaję go jako element potomny.

0

dlaczego nie było wykonalne ?? testowałem zapytanie własnie na bazie Firebird

0

@grzegorz_so moja pomyłka. Nie do końca przeczytałem Twoje zapytanie. Sam miałem kiedyś podobny problem. Ale ja chciałem aby zapytanie od razu zwracało strukturę hierarchiczną. Twoje zapytanie zadziała jak najbardziej.

0

wydaje mi się że chcąc w jednym zapytaniu uzyskać całą treść drzewka należało by założyć na sztywno maksymalną głębokość struktury drzewa , wtedy można by pewnie spróbować zbudować zapytanie lub funkcję zwracającą w tabeli wszystkie ścieżki od korzenia do liści. A naprawdę to najprostsze i chyba najlepsze jest rozwiązanie takie jak podałeś

0

Sprawdziłem, pomysł @grzegorza_so jest szybki i prosty, ale jako wynik otrzymujemy zestaw wszystkich zależności jakie występują w całej bazie, czyli cały "las". A mnie np. zależy aby klikając w gałązkę otrzymać 1 drzewo - od korzeni do liści. Pomyślę nad procedurą , która odfiltruje wszystkie nie potrzebne rekordy i pozostanie mi właściwe drzewo.

Pomysł Mr.Yahoo muszę przetrawić, jakoś nie widzę jeszcze jak to zrobić.

0

baza nigdy nie zwróci "drzewa", to może być co najwyżej dwuwymiarowa tabela , zapisanie treści tej tabeli do drzewa musi być po stronie aplikacji , baza tego nie zrobi. Nie znam dobrze komponenty Ttreeview , ale odpowiednio oprogramowując zdarzenie 'onclick' można by dynamicznie tworzyć zapytanie do bazy które ograniczy wynik zapytania do wybranej "podgałęzi".
Jeżeli baza nie jest zbyt wielka (liczba wierszy) , to zawsze można odczytywać z bazy wszystkie powiązania i na ich podstawie modyfikować 'drzewo'

0

Tak, wiem, z tym nie mam problemu lecz z wyodrębnieniem właściwych danych. Podstawowy problem to że głębokość struktury nie jest znana, a mogą być różne drzewka, a nawet takie, które nie mają ani rodzica ani dziecka.
Wersja Mr.Yahoo wymaga specyficznego zapętlenia w procedurze. Musze pomyśleć jeszcze.

Dzięki za wskazówki.

0

w 'dzrzewie' każdy obiekt oprócz "root'a" musi mieć rodzica , natomiast nie musi mieć dziecka, a jeśli masz inne obiekty bez rodzica to muszą być "root'em" ale w odrębnym 'drzewie'

0
jarek265 napisał(a):

Wersja Mr.Yahoo wymaga specyficznego zapętlenia w procedurze. Musze pomyśleć jeszcze.
Niczego zapętlać nie musisz. Wystarczy mądrze napisać i będziesz miał np. takie drzewko:
3d16f8019a.png
Wystarczy raz pobrać wszystkie elementy drzewka i dodawać po kolei, ale przed dodaniem wyszukać rodzica i dodać jako dziecko.

0

@jarek265,
problem nie wymaga żadnego zapętlenia tak jak już napisał @mr.Yahoo. Prawdziwym problemem jest wyszukanie w drzewie odpowiedniego obiektu który ma być rodzicem dla kolejnego odczytanego z bazy obiektu

0

W zasadzie nie jest to problemem. Pod C++ Builderem/Delphi znalezienie odpowiedniego rodzica to są jakieś 3 linie kodu. Samo dodawanie do TTreeView też niewiele więcej.

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