[ cl3v3r @ 24.04.2013. 22:16 ] @
Zdravo živo, dobri moj narode! :)

Već neko vrijeme me muči pravljenje izvještaja koji se zasniva na podacima koji su organizovani u hijerarhiju proizvoljne dubine, t.j. jednom običnom, najobičnijem stablu.

Najbolje ću objasniti problem na primjeru. U prikačenoj bazi nalazi se tabela tblVrstaUslova koja čuva podatke o nekakvim uslovima koji imaju svoju hijerarhiju. Ova tabela referencira samu sebe, čime se omogućava pravljenje hijerarhije proizvoljne dubine. tblLice sadrži podatke o licima a tblPotrebniUslovi povezuje lica i uslove koje ta lica moraju ispuniti da bi dobila šarenu lažu. :) Sve je to lijepo prikazano na sledećoj slici:



Hijerarhija se uspostavlja preko polja IdNadredjeneVrste, s tim što jedan uslov može istovremeno imati nadređeni uslov i biti nadređeni uslov drugim uslovima. Uz pomoć date tabele i malo koda dobije se sledeća forma koja uslove prikazuje u stablu:




Ono što ja nikako ne mogu da prokljuvim je kako da napravim izvještaj koji će biti fleksibilan, u smislu da neće imati problem sa bilo kojom dubinom stabla, a koji će prikazivati koja lica treba da zadovolje koje uslove. Recimo nešto ovakvo:



Znam da je ova situacija da Ojdanić treba da ide na "Kurs jezika" i "Kurs engleskog jezika" >> "Engleski jezik (nivo 2)", koji je njegovo "dijete" malo glupa, ali je moguća. U realnom sistemu, korisnik kao uslov može izabrati samo list u stablu (dakle, onaj koji je poslednji u hijerarhiji i nema "djece"), ali vrlo lako se može desiti da je "Kurs jezika", u vrijeme kada je postavljen kao uslov, bio poslednji u hijerarhiji a tek kasnije su mu dodata djeca. Dakle, kada je "Kurs jezika" bio list korisnik ga je mogao izabrati kao uslov koji lice mora da zadovolji. Ali pretpostavimo da su nakon toga "Kursu jezika" dodata djeca "Kurs engleskog jezika" i "Kurs njemačkog jezika". Od tog trenutka, korisnik više "Kurs jezika" ne može postaviti kao uslov, već samo njegovu djecu, t.j. listove, ali raniji unosi u koima je "Kurs jezika" bio izabran kao uslov i dalje se nalaze u bazi i validni su. Prema tome, potrebno je da izvještaj izgleda kao što je na slici prikazano.

Ima li ideja? Sve dolazi u obzir: i privremene tabele i kombinovani upiti i VBA - sve. Pucajte! :)
[ Getsbi @ 26.04.2013. 06:55 ] @
Mislim da ti je rešenje problema u korišćenju Sorting and Grouping alata kod dizajniranja izveštaja. Ja sam ostavio da su oba uslova Ascendig tako da ako hoćeš da prvo bude Odlično usavršavanje pa onda Fenomenalno, promeni Sort Order na drugom uslovu ovog alata. Ako želiš uvlačenje kao na slici postavi Group Header na Yes i popuni novootvorenu sekciju onim što želiš da se nalazi u takozvanom Promote nivou. Detail sekcija će ti onda biti Demote nivo.


Naravno da ova j moj primer urađen na brzinu i nije reprezentativan, ali ćeš ga ti doterati.
[ cl3v3r @ 26.04.2013. 09:00 ] @
E, hvala ti na odgovoru. Kako sam postavio problem, mislio sam da ga niko nikada neće raskučiti. :)

Elem, ovo što si predložio je OK, ali meni je potrebno da "Engleski jezik (nivo 2)" bude prikazan na putanji "Kurs >> Kurs jezika >> Kurs engleskog jezika >> Engleski jezik (nivo 2)", sa sve indentacijom pri svakom demote nivou, kako si ga ti zgodno nazvao. S tim što bi se ovaj jedan lik koji iz nekog razloga treba da ispuni uslov "Kurs jezika" takođe pojavio na odgovarajućem nivou, kao što je na slici prikazano.
[ Getsbi @ 26.04.2013. 16:37 ] @
Postojeći način iskazane hijerarhije u tabeli tblVrstaUslova ne može da zadovolji tvoj zahtev za izveštajem. Probaj sledeće.
U tabeli tblVrstaUslova bi trebalo da bude onoliko nivoa (kolona) koliko imaš koraka u putanji.
Familija -> Grupa -> Podgrupa -> Tip -> Vrsta......
Probaj tako da organizuješ tu tabelu i povežeš je sa licem preko tblPotrebni uslovi, koristeći postojeće ID-ove. Query nad takvim sklopom tabela će ti omogućiti izveštaj koji želiš, uz korišćenje alata za sortiranje i grupisanje koji sam pominjao.
[ cl3v3r @ 26.04.2013. 17:17 ] @
Eh, da je život tako prost...

Tvoj predlog je vrlo pragmatičan i u praksi (na konkretnom tekućem projektu) bi mogao da se iskoristi. Svakako bi bio najlakši izlaz. Ali zbog čisto akademske radoznalosti želim da pronađem način da ne određujem unaprijed broj nivoa u hijerarhiji. Kad već idemo akademski, uzmimo za primjer čuvenu sastavnicu. Tu ne možemo predvidjeti od koliko će se djelova sastojati neki proizvod, a svaki od zapisa u tabeli može biti i gotov proizvod i dio nekog složenijeg proizvoda-sistema. Dakle, savršen slučaj za ovakvu postavku tabela.

Znao bih kako da napravim stablo, znao bih kako da pronađem sve djelove-listove od kojih se sastoji određeni priozvod, izračunam potrebne količine i napravim porudžbenicu ili nalog za trebovanje, ali nikako ne bih znao da napravim izvještaj na kom će svaki demote nivo biti blago indentiran i formatiran na određeni način.

Na pamet su mi padale razne ideje: dinamičko kreiranje posebnih subreporta za svaki top level član stabla, u kom bi dinamički bio kreiran subreport za niže elemente u kojima bi dinamički bio kreiran subreport za niže elemente itd, itd, itd - rekurzija. Ali to bi bio ravno samoubistvu i ne znam da li bih mogao da realizujem u VBA kodu.

Mora da postoji neki način sa nekom temp tabelom ili nešto slično, samo ga još nisam pronašao. Nadao sam se da ćemo ovdje zajedno uspjeti. U stvari, još uvijek se nadam.
[ Getsbi @ 26.04.2013. 18:21 ] @
Citat:
cl3v3r: .....
Tvoj predlog je vrlo pragmatičan i u praksi (na konkretnom tekućem projektu) bi mogao da se iskoristi. Svakako bi bio najlakši izlaz. Ali zbog čisto akademske radoznalosti želim da pronađem način da ne određujem unaprijed broj nivoa u hijerarhiji. Kad već idemo akademski, uzmimo za primjer čuvenu sastavnicu. Tu ne možemo predvidjeti od koliko će se djelova sastojati neki proizvod, a svaki od zapisa u tabeli može biti i gotov proizvod i dio nekog složenijeg proizvoda-sistema. Dakle, savršen slučaj za ovakvu postavku tabela......


U realnom svetu svaka hijerarhija je konačna unapred određena. Znači tačno se zna broj nivoa (crkva, vojska, država, taksonomske kategorije u biljnom i životinjskom svetu...). Ovo sa sastavnicom i nije baš dobar primer jer "od koliko će se djelova sastojati neki proizvod" se rešave asocijativnom tabelom između tabele repromaterjala i tabele proizvoda (slično tvojoj tabeli tblPotrebniUslovi) ili pak mrežnom vezom nad dve tabele (slika u prilogu). Dakle, broj sastojaka, delova... nema konkretno veze sa hijerarhijom.
Nepoznavanje broja nivoa u hijerarhiji govori o nepoznavanju poslovnog problema. Reći ćeš možda da nisu svi sistemi istraženi (svemir i sl.) ali niko ne pokušava da napravi hijerarhiju od neistraženog sistema već samo od njegovog istraženog dela.

Pošto odgovor ne znam za neodređeni broj nivoa u hijerarhiji, ja ću kao u kvizu slagalica reći: "dalje".


[ cl3v3r @ 26.04.2013. 19:21 ] @
Unaprijed određena - možda, ali konačna? Teško. Tačno se zna trenutni broj nivoa, ali ko može tvrditi da se neće promijeniti? Konkretno, ako govorimo o vojsci, uobičajeno je da se formacija mijenja s vremena na vrijeme. Za crkvu ne znam, ali i država često mijenja svoju organizaciju. Dakle, iako znamo kako izgleda sada, ne možemo sa sigurnošću reći da se neće promijeniti u dogledno vrijeme.

U pravu si, izabrao sam loš primjer za ovaj problem, pošto se u sastavnici jedan sklop može sadržavati u više nadsklopova, dok u konkretnom slučaju jedan uslov može imati samo jednog roditelja. Dakle, klasična struktura stabla.

U svakom slučaju, ja na ovo gledam kao na neku vrstu intelektualne vježbe - i to prilično zanimljive, pa rekoh da iznesem pred pametne ljude.
[ izonic @ 27.04.2013. 00:53 ] @
Evo moj primjer.
Za dodavanje linijski taster insert a sledeci ispod tasteri sift+insert

[ Getsbi @ 27.04.2013. 04:28 ] @
@ Izonic, nedostajala je kontrola mscomm32.ocx. Zakačio sam je.

Posle dodavanja elementa kroz stablo ili direktno u tabeli dolazi do grešeke Run-Time 35601 (Element not found).

Tkođe puca na taster Insert kad se nalaziš na najvišem nivou hijerarhije.
Run-Time 91 (Object variable or With block variable not set).

Ostalo mogu samo da pohvalim.


PS. ovde imate uputstvo kako da priključite .ocx ili .ddl : http://www.elitesecurity.org/t419020-0#2778374

[Ovu poruku je menjao Getsbi dana 27.04.2013. u 06:16 GMT+1]
[ Getsbi @ 27.04.2013. 12:43 ] @
Pošto je Izonic postavio ispravljen fajl na forumu iCentar, ja ću ga samo preneti ovde.

Lep primer. Zahvaljujem na pomoći.

[Ovu poruku je menjao Getsbi dana 27.04.2013. u 13:55 GMT+1]
[ cl3v3r @ 16.02.2014. 14:17 ] @
Izonic, svaka čast, vrlo kreativan pristup!

Hvala vam!