[ ventura @ 09.02.2002. 22:49 ] @
Problem u Delphiju:

Imam tabelu u bazi koja igleda odprilike recimo ovako:

Proizvodjac...Proizvod......Boja..........Kolicina
Levis.............501..............Crvena.....xxxxxx
Levis.............501..............Crna........xxxxxxx
Levis.............501..............Plava.......xxxxxxx
Levis.............501..............Zelena....xxxxxx
Dizel..............Majica..........Zuta........xxxxx
Dizel..............kosulja.........Crna.......xxxxxxxx

Kako od ovakve tabele napraviti nesto poput tree-ja da bude u fazonu:

Levis
.|...|__501
.|...........|___Crvena(100)
.|...........|___Crna(0)
.|...........|___Plava(12)
.|...........|___Zelena(34)
.Dizel
....|____Majica
....|.............|____Zuta(3)
....|____Kosulja
..................|____Crna(55)


I da se naravno ovaj tree automatski generise prema bazi... A baza se kreira perma list boxovima tako da su pocetni proizvodjaci definisani.


[ overflow @ 10.02.2002. 09:17 ] @
Evo ti kako to moze manuelno da se uradi.
Mozes da kreiras prvo strukturu baze pomocu dinamicke liste.

Napravi glavnu listu koja ce kao elemente imati slog sa poljima:

prec = ^TRec;
TRec = record
Marka:String;
Model:String;
Boja:PBoja;
sled:prec;
end;

i ogranak svakog elementa te liste:

PBoja = ^TBoja;
TBoja = record
BojaIKol : String;
sled : pb;
end;

Prodji kroz bazu i radi sledece: ubacuj u glavnu listu marku i model samo ako vec nije u glavnoj listi a Boja ostavi na NIL.
Kada napunis glavnu listu svim markama i modelima prodji kroz nju od pocetka samo sada u bazi trazi boju i kolicinu koja odgovara toj marci i modelu ubacujuci u pomocnu listu tu boju i kolicinu i povezivajuci sada tu novoformiranu (malu) listu boja i kolicina sa glavnom listom preko Boja:PBoja.

Evo kako bi to izgledalo u memoriji racunara:

Levis 501 -------sled:prec---- Diesel Kosulja ------------------
|................................................. |
| Boja:Pboja .............................. | Boja:Pboja
| .................................................|
bela(100) ............................... plava(100)
| sled:pb ...................................| sled:pb
crvena(100).............................zuta(11)
| sled:pb
zuta(10)

Mislim da je koncept jasan ...

Posle samo prodjes kroz kompleks lista i formiras Tree u programu.
[ Riste Pejov @ 10.02.2002. 15:03 ] @
ja mislim da ti prvo ne valja tip tabele,
uradi dve tabele koje ce biti vezane uz pomoc jednog Key fielda
jednu za firme, (levis, diesel, itn) i drugu za proizvode
primer:
[code]

tabela firme:
------------------------------
firma_ID ime
------------------------------
1 Levis
2 Diesel
3 Adidas
4 Reebok
............
----------------------------

tabela proizvodi
-------------------------------------
firma_ID opis kolicina
-------------------------------------
1 501 10
1 maica 2
2 kosulja 2
.............................................
-------------------------------------

onda uz dva selecta dobijes Tree

uz prvi: SELECT * FROM firma
dobijes root node-ove za tree

a onda za svaki node uradis jos po jedan select: SELECT * FROM PROIZVODI WHERE firma_ID=1
i dobijes child nodove za svaku firmu

pozdrav
[ overflow @ 10.02.2002. 16:50 ] @
Da, Pejov je upravu, ali ... ako vec imamo strukturu tabele koju ti imas morali bi smo da uradimo ono sto sam naveo.
A da ne pricam gluposti, ili da nije tacno kako mi Ventura rece da moj kod "ne pije vodu" evo screen shot-a programa kao i sam program uradjen po onom konceptu.

[ Riste Pejov @ 11.02.2002. 13:27 ] @
Ali ja ipak ne bih rasipao procesorsko vreme
i memoriju na linkovane liste,
moze se to isto sto sam rekao simulirati i sa vec postojece tabele
primer:
Code:

//Query1 - Select za root node-ove 
SELECT DISTINCT proizvodjac FROM tabela;
//Query2 - onda ponovis Query za svakog proizvodjaca (Select za subnodove )
SELECT DISTINCT proizvod FROM tabela WHERE proizvodjac=Query1.fieldbyname('proizvodjac').asString
//Query3 - Query za svakog proizvoda (subnodove za proizvod)
SELECT DISTINCT boja,kolicina FROM tabela WHERE proizvodjac=Query1.fieldbyname('proizvodjac').asString
AND proizvod=Query2.fieldbyname('proizvod').asString


evo jos jedno resenje problema
[ overflow @ 13.02.2002. 13:59 ] @
Jos jedna vazna napomena - resenje koje si ti predstavio prolazi BAR 3 (tri) puta kroz kompletnu tabelu, dok moje savrseno resenje samo 1 (jedan) put ubrzavajuci znatno ceo postupak. :P
[ Riste Pejov @ 13.02.2002. 21:44 ] @
Epa sad vidi ovako,
tvoje resenje je brze, ali u slucaju kad tabela ima do 100 rekorda
ali kad bi tabela imala 4000+ rekorda, onda garantiram da ce moje
resenje brze proci
[ overflow @ 13.02.2002. 23:15 ] @
Citat:
Riste Pejov:
Epa sad vidi ovako,
tvoje resenje je brze, ali u slucaju kad tabela ima do 100 rekorda
ali kad bi tabela imala 4000+ rekorda, onda garantiram da ce moje
resenje brze proci :D


'ajde u sta da nece? ;)
[ Riste Pejov @ 14.02.2002. 14:16 ] @
Vidi sad ovako, ako prva dva polja su indexirana,
onda prve dve Query prolaze kroz bazu samo onoliko puta koliko
koliko ima razlicnih firma i modela, a treca isto tako prolazi samo za one modele i firme koje vec postoje , tako da sigurno da moj pristup nece ucitati celu bazu u nikom slucaju, a tvoj ce imati sa garancijom

(RowCount-Broj_razlicitih_firma)*Velicina_Firma_Field +
(RowCount-Broj_razlicitih_modela)*Velicina_model_Field
vise IO sa diska.

Kad bi u igri bila tabela sa 4000+ rekorda onda vise taj IO nije zanemarljv i producira vise vremena za presmetku.

Analiziraj bolje dva algoritma i videces da sam u pravu