[ ik0 @ 27.07.2010. 22:18 ] @
Nisam znao kako krstiti temu pa sam stavio to sto sam stavio :)...Ovako, napravio sam neki programcic za arhiviranje nekakvih clanova...E sada korisnik treba napraviti neki NASTAN i da obelezi clenove koi su prisustvovali...i to da se doda u nekom "dosijeu" korisnika...Koristim ADOQuery...Ne trebami kod nego samo ideje kako to da resim kako bi bilo najednostavnije...
[ Mihajlo Cvetanović @ 27.07.2010. 22:45 ] @
Za one koji ne znaju makedonski i ne koriste automatske prevodioce "nastan" je "događaj". Evo moguće rešenje: imaš tabelu članova, tabelu događaja, i relaciju "prisustvovao" između njih. Ova relacija se u bazi isto realizuje kao jedna tabela. Dakle tabela PRISUSTVOVAO sadrži dve kolone, ID člana i ID događaja, i u toj tabeli jedan događaj sadrži onoliko redova koliko je bilo članova.
[ ik0 @ 28.07.2010. 00:36 ] @
To znaci da napravim "relationship" medju obe tabele...stim sta ova druga tabela ima samo dve kolone IDClan i IDPrisustvovao...
[ Mihajlo Cvetanović @ 28.07.2010. 09:13 ] @
IDClan i IDNastan...
[ ik0 @ 17.08.2010. 13:35 ] @
Evo tek sada sam probao ovo da resim i neje mi uspelo. Znaci ovako, imam bazu sa dve tabele Clanovi (ID, Ime itd) i Dogadjaj (ID ,IDCLAN, ime dogadjaja itd). Kako zapisati clanove koje su bile na tom dogadjaju, i kako izlistati clanove iz nekog dogadjaja. Radim sa ADOQuery1.

Probao sam da resim kako mi Mihajlo reko ama neide. Postavio sam relationship medju ID (iz tabele clanovi) i IDCLAN (iz tabele Dogadjaj) probam da ocitam i neke. Hvala
[ Mihajlo Cvetanović @ 17.08.2010. 13:50 ] @
Tabela Dogadjaj ne treba da ima kolonu IDCLAN, jer događaj može da ima više od jednog člana. Umesto kolone IDCLAN u tabeli Dogadjaj treba ti nova tabela-relacija, Prisustvovao, koja ima kolone IDCLAN i IDDOGADJAJ. IDCLAN ima vrednost ID iz tabele Clanovi. IDDOGADJAJ ima vrednost ID iz tabele Dogadjaj.
[ ik0 @ 17.08.2010. 15:13 ] @
tabela-relacija to ustvari relationship ili? Bazu radim u mc access
[ Mihajlo Cvetanović @ 17.08.2010. 15:29 ] @
Da, Relationship (relacija) se u bazama implementira kao još jedna tabela. Te tabele obično nemaju sopstveni primarni ključ, i često nemaju ništa drugo do primarne ključeve drugih tabela. Svrha takve tabele je samo da poveže elemente iz drugih "pravih" tabela. Ime takve tabele je obično glagol, u našem slučaju "prisustvovao". I taj glagol označava relaciju, u našem slučaju taj-i-taj član je prisustvovao tom-i-tom događaju.
[ ik0 @ 17.08.2010. 16:13 ] @
Vidi dali je ovo dobro...
[ Mihajlo Cvetanović @ 17.08.2010. 17:34 ] @
Da, to je to.
[ ik0 @ 17.08.2010. 18:27 ] @
ovo mi nije jasno kako citati sada...kako ucitati naprimer koi clanovi su bili na nekom dogadjaja? Recimo imam dva dbgrida...jedan je sa dogadjaje a drugi prazan...kako kada odaberem neki dogadjaj u drugi dbgrid da ocita te clanove koje su zapisani u taj dogadjj?
[ Mihajlo Cvetanović @ 17.08.2010. 19:16 ] @
Ja sad ne znam kako se radi sa tim dbgridovima, ali tu negde mora da može da se postavi SELECT upit koji će da popuni taj dbgrid podacima. E pa taj SELECT bi trebao da glasi nekako ovako (pričam napamet, SQL mi nije jača strana):

SELECT c.ID, c.IME FROM Clan c, Prisustvo p WHERE c.ID = p.IDCLAN AND p.IDDOGADJAJ = 'id_dogadjaja_koji_se_trazi'
[ ik0 @ 18.08.2010. 02:26 ] @
Nisam uspeo nikako da resim ovaj problem...ako nekom nije tesko i ako moze da uradi neki primer sa onom bazom sto sam okacio...u pm do sada sam probo sve i svasta i nikako ne mogu...dobijem samo ID-ove clanove koje su posetile taj dogadjaj a ne celu kolonu kao sto treba...Hvala vam svima sta ste pokusali da mi pomognete...
[ Mihajlo Cvetanović @ 18.08.2010. 08:39 ] @
Stavi ovde kod koji ne radi kako bi ti želeo, i napiši šta se dešava i šta bi ti želeo da se desi.
[ ik0 @ 18.08.2010. 10:30 ] @
postavio sam to na button kao kad kliknem da izadju u neki grid...


Code:


void __fastcall TForm6::Button1Click(TObject *Sender)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit ="SELECT * FROM TPrisustvo WHERE IDNastan=1";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->Open();
}


Po nekoju moju logiku tu treba da se pojave svi zapisi (dogadjaji) za tog korisnika. Eto to je ono sto hocu...od jedan grid odaberes neki dogadjaj....kliknes na button i u drugi grid dade sve clanove koje su tamo upisane...
[ Mihajlo Cvetanović @ 18.08.2010. 14:03 ] @
Za kog korisnika? Naveo si WHERE IDNastan=1, ali gde je tu korisnik?

Nisam te lepo razumeo. Šta želiš da se desi? Šta se zapravo dešava?
[ itf @ 18.08.2010. 15:23 ] @
Zapravo, riječ je o više->više relaciji gdje se iz međutabele filtriraju traženi podaci.
[ ik0 @ 18.08.2010. 15:46 ] @
ja il ne znam sta hocu il ne znam da objasnim...evo jedan proekat kako ja to zamisljam jer ne znam vise da objasnim....ima i baza...ako moze neko neka dotera to kako valja jer sam prso sa ovim vise...

evo proekat ko moze nek pomogne...
[ Mihajlo Cvetanović @ 18.08.2010. 16:01 ] @
Meni je rapid trenutno zauzet. Ako hoćeš da odabereš jedan događaj iz leve liste i klikom na dugme prikažeš u desnoj listi sve članove koji su prisustvovali tom događaju, onda umesto one jedinice u WHERE IDNastan=1 mora da stoji ID tog događaja. Moraš taj string da praviš dinamički.

Recimo da sad samo testiramo, i da zato koristimo baš 1. Da li trenutno imaš u bazi neki događaj kome je ID=1, i da li imaš neke članove koji su prisustvovali tom događaju (u tabeli Prisustvo ima redova kojima je IDNastan=1)?

Šta dobiješ kao rezultat kad klikneš na dugme?
[ ik0 @ 18.08.2010. 16:19 ] @
brate ja sam se izgubio totalno i sve zivo sam ispobrko ako mi verujes...2 dana probujem sve zivo i divo....evo ti drugi link...dole desno ima Save file to u pc....
evo ti link
[ Mihajlo Cvetanović @ 18.08.2010. 16:48 ] @
Stranica me baca na travian sajt kad kliknem na download. Moraš da se opustiš malo da bi mogao da koristiš svoju glavu kako valja. Odmori malo, meditiraj, odgledaj neku komediju. Takođe moram da te upozorim da ja imam samo Visual Studio, a ovo mi smrdi malo na C++ Builder. To znači da ne mogu da debagujem, niti da menjam kod. Mogu samo gledam kod, i da ukažem na ono što mi je sumnjivo.

U međuvremenu hajde da se vratimo korak u nazad, i da lepo smisliš rečenicu koja je odgovor na pitanje: šta se trenutno dešava u tvom kodu? Šta je problem?
[ ik0 @ 18.08.2010. 16:56 ] @
Evo sacemo korak po karoak i radicu screenshot...sacu da kreiram bazu i relacije...Kreiranje baze i relacije treba ovako da izgleda jer da?

[Ovu poruku je menjao ik0 dana 18.08.2010. u 18:08 GMT+1]
[ pecav @ 19.08.2010. 10:13 ] @
Po mom misljenju tabela Relacija treba da bude bez polja ID, samo polja IDClan i IDDogadjaj i sa ta dva atributa treba kreirati slozeni kljuc.
[ mmix @ 19.08.2010. 10:46 ] @
Ja uvek drzim taj ID tu, leba ne jede i ne razbija 3NF a jedinstvenost ionako moze da se odradi preko unique indeksa. Ako nista olaksava ti kasnije retrofitovanje novih funkcionalnosti vezanih za m2m link (npr eksterna kategorizacija).
[ ik0 @ 19.08.2010. 11:11 ] @
Znaci ta relacija t.e cela baza je ok za tu namenu?
[ ik0 @ 19.08.2010. 12:00 ] @
ako je to bilo to onda evo rezultat togga....

Code:

ADOQuery2->Close();
ADOQuery2->SQL->Clear();
AnsiString Upit = "SELECT* FROM Relacija where IDDogadjaj=1";
ADOQuery2->SQL->Add( Upit );
ADOQuery2->Open();




Znaci za neki dogadjaj koi ima ID=1 mi je dao sve clanove koje su upisane tamo...u ovom slucaju clan sa ID=1 i ID=2...Usustini to je to sta meni treba...ali zasto ne da celu kolonu tog clana (ime prezime.....) nego samo ID? Kako to da sredim....da ocita celu kolonu ne samo ID njegovo?

[ ik0 @ 19.08.2010. 12:49 ] @
evo sta je bilo celo vreme zajebancija....upit...

ovako sam resio select Ime, Prezime, Grad from Clan where IDC in (select IDClan from Relacija where IDDogadjaj = 1 )";

Hvala svima sta su mi pomogli.
[ Mihajlo Cvetanović @ 23.08.2010. 15:25 ] @
Select unutar selecta je najčešće neefikasno rešenje. Trenutno radi brzo, zato što imaš malo podataka u bazi, ali kad baza naraste upit će se sporo izvršavati. Za sada ne moraš ništa da menjaš, ali imaj ovo na umu kad aplikacija počne da usporava, jer ovde imaš mesta za ubrzanje.
[ ik0 @ 23.08.2010. 19:21 ] @
Onda to je veliki problem...Baza spored planova korisnika bi imalo najmanje 5000-10000 clanova ako ne i vise (radi se o arhiviranju clanove politicke partije). Ima li resenje to da se izbegne a i dalje da se radi sa adoq?
[ Mihajlo Cvetanović @ 23.08.2010. 19:44 ] @
Izmena nije velika, potrebno je samo da znaš. Upit treba da izgleda drugačije. Treba da ima join, spajanje dve tabele, gde ti tražiš kolone jedne tabele, a imaš vrednost kolone druge tabele (isto kao sad, samo preko joina, a ne preko unutrašnjeg selecta). Nemam Access kod kuće, pa pozivam druge da se ubace. Ako se baš niko ne javi danas videću sutra na poslu.
[ Mihajlo Cvetanović @ 24.08.2010. 11:44 ] @
Evo ovako, ovaj SELECT što si ga dao ne odgovara onoj bazi što si je priložio na početku. Isti takav SELECT koji bi odgovarao toj bazi od ranije je:

SELECT Ime, Prezime, Grad
FROM TClanovi
WHERE ID in (SELECT IDClan FROM TPrisustvo WHERE IDNastan = 1 );

Ovo je bio select-u-selectu. Adekvatni select-sa-joinom je ovo:

SELECT TClanovi.Ime, TClanovi.Prezime, TClanovi.Grad
FROM TClanovi INNER JOIN TPrisustvo ON TClanovi.ID=TPrisustvo.IDClan
WHERE TPrisustvo.IDNastan=1;
[ ik0 @ 24.08.2010. 12:31 ] @
Ne odgovara na onu bazu sto sam ostavio jer to je bio sam primer...a to sto sam ja napiso je bilo konkretan slucaj...ok sacu da probam to ti sta si mi napiso da vidim kako to radi. Hvala ti jos jednom hvala i ostalima...