[ mpaja @ 12.02.2011. 13:36 ] @
Da li se nako bavio ispisivanjem stabla (tree) u access2003. Da poblize objasnim:

postoji tabela sledece strukture

Id ParentId Name

1 0 Root
2 0 Root1
3 1 Pera
4 1 Mika
5 2 Joca
6 3 Djoka

Potrebno je napraviti VB kod koji će ipisati sva imena slično kao stablo u Exploreru. Dubina stabla je prozvoljna!

Pozdrav.
[ Zoran.Eremija @ 12.02.2011. 14:19 ] @
Ako sam dobro razumeo reci ispisivanje stabla onda imate ovde primer http://www.elitesecurity.org/t303936-1#2548275
[ mpaja @ 12.02.2011. 14:46 ] @
Da, video sam to! To je tree view kontrola i to odlicno radi. Meni treba da se to ispise na papir (grubo receno) odnosno da se iz te tabele koja predstavlja onsovu za tree view kontrolu napravi report. Meni se cini da se to moze uraditi samo preko koda. Slazezem se sa onim sto kaze Zidar, to se ne uci ali znam da su neki matematicari razvijali f/ju gde se zada pocetni cvor i od tog cvora ona dalje krece u "obilazak stabla" i ispisivanje elemenata. Radi se o rekurziji!
[ izonic @ 14.02.2011. 09:23 ] @
Tebi u stvari treba da uvuces pasus za svaku podgrupu koja pripada nekoj grupi.
Jedino to ima smisla u izvjestaju. Neka manipulacija sa grupama kao sto ima tree kontrola znas da nije moguca jer to je samo izvjestaj.
[ mpaja @ 14.02.2011. 13:31 ] @
Da, upravo to.

Ideja je da se napravi report iz access-a sa klasičnim zaglavljem i samo jednim unbound text poljem. Na on format bi se aktivirao VB kod koji bi popunio to polje tako da izgleda slicno kao expandirana tree view kontrola. Svaki red bi bio uvucen za n*space gde je n nivo-dubina. Na kraju svakog reda bi se dodavao LF za prelazak na novi red a samo formatiranje stranice bi odradio access.

To je ideja i jos se radi na njoj. Vise je matematicki problem obilaska grafa iz nekog pocetnog cvora, bar mi se tako cini.

Pozdrav svima
[ mpaja @ 14.02.2011. 13:52 ] @
Da pojasnim još malo

Uzima se prvo koren stabla odnosno početni čvor i stavi u neki string sa LF. To bi u ovom slučaju bilo Id nekog od članova a dubina n=1. Zatim se za taj koren nalazi prvo dete - niži čvor i stavi u string (strng+LF+string+ls , stringovi se nastavljaju!), tada je dubina n=n+1. Proveri se da li taj niži čvor ima decu, ako ima n=n+1, ispisuje se i ponavlja postupak sve dok se ne nadje neki čvor koji nema dete. Ako nema čvor nema dece, tada se prelazi na prvi susedni - čvor brat i ceo postupak provere za decu čvora brata se ponavlja. Kada čvor nema više braće ili drugačije rečeno čvorova istog ranga, tada je n=n-1. Ako se dogodi da je n=1 to znači da smo obišli celo stablo i da je to kraj rada.

Naravno moguće da postoji više polaznih čvorova, donosno čvorova koji su istog ranga (u primeru su to čvorovi kojima je ParentId = 0, Root1 i Root2)



[ Zidar @ 14.02.2011. 14:58 ] @

Dobro protumacen zahtev je pola resenja:
Citat:
Tebi u stvari treba da uvuces pasus za svaku podgrupu koja pripada nekoj grupi.


Evo druga polovina resenja:

Trebace ti pomocna lokalna tabela koja izgleda otprilike ovako: Drvo (Id, Roditelj, Nivo, Rb) Id je onaj ID iz tvoje tabele, nivo je nivo na kome se nalazi posmatrani ID i RB je redosled u kome zelis da vidis odrdjeni ID na izvestaju. Ond aprimenis algoritam koji si opisao-
1 krenes d korena (Root), Nivo = 0, Rb=1, 2)
2) za svako dete imaces novi red utabeli, Novo = Nivo + 1, Rb = kako vec ide
3) sada za svaki ID koji imas na nivou 1 (nivo 0 ne diras) ponovis korak 2
4) posmatras sledeci nivo (poslednji koji is uneo) i pobnavlajs korak 2
Postupak s eprekida kada nijedna cvor na poslednjem unetom nivo vise nema dece.

Onda za RowSource reporta uzmes tabelu drvo. Ako hoces da sve izgleda po nivoima, kad ispisujes svaki red iz tabele Drvo, dodas SPaces (Nivo*4) na pocatak teksta.

I to je to. Svaki put kad zapocnes ovaj postupak, svakako obrisis sve redove iz tabele Drvo, koji su mozda zaostali od prosli put.

Drugog nacina nema da se napsie kveri nad hijererhijskim podacima. Kazani algoriatm mozes da primenis kroz ADO, DAO ili pak da gradios INESR statement i sa db.EXECUTE da dodajes redove u tabelu, sta ti je najlakse. Sustina ostaje ista.

Nadam se da je pomoglo.

[ mpaja @ 14.02.2011. 18:12 ] @
Hvala Zidar

to je moguće rešenje, doduše nije matematika ali je prilično elegantno. Pokušaću to da implementiram i da okačim primer, pošto vidim da je dosta interesantna tema i da to članovima treba samo da malo prezdravim.
[ izonic @ 15.02.2011. 11:07 ] @
Izvjestaj tree
[ Zidar @ 15.02.2011. 19:43 ] @
@Izonic: briljantno!

Trik je dakle u kveriju:
Code:
SELECT Tree.ID
FROM Tree
ORDER BY slaganje([ID]);
koji poziva funkciju Slaganje
Code:
Public Function Slaganje(ByVal ID As Variant) As String
'*******************************************
'Ime:      Slaganje   (Function)
'Sadržaj:
'Autor:     ZXZ
'Datum:      01 10, 2012, 11:12:22
'Adresa: Tuzla BiH
'Email:     [email protected]
'Ulazni parametri:
'Izlazni parametri:
'*******************************************
Dim Parentni As Variant
On Error GoTo Greska
Start:
Parentni = DLookup("Pripadnost", "Tree", "ID=" & ID)
If IsNull(Parentni) Then
        GoTo Kraj
    Else
        Slaganje = Str(Parentni) & "." & Str(ID) & "." & Slaganje
        ID = Parentni
        GoTo Start
    End If
Izlaz:
Exit Function
Greska:
'GreskaB (Err.Number)
Resume Izlaz
Kraj:
End Function


Funkcija se izvrsava sve dok ima sta da radi, za svaki ID, i radi onako stosmo rekli - ispise svu decu tog cvora. Posto se poziva iz kverija, izvrsi se za svaki cvor.

Kod vecih tabela, ovo moze biti sporo, ali st da se radi, kompjuter je tu da radi a mi da pijemo kafu dok se ne zavrsi.

[ Zoran.Eremija @ 15.02.2011. 20:20 ] @
Pridruzujem se komenatrima kolege @Zidar-a. Ideja je originalna i jednostavna...
[ banem @ 15.02.2011. 20:37 ] @
To iz budućnosti? Piše datum 1.10.2012. :)
[ mpaja @ 16.02.2011. 09:06 ] @
Sjajna ideja

Na vecim tabelama performanse nisu bas vrhunske ali radi. Mislim da se sama funkcija moze malo i optimizovati ali to je to.

Hvala svima