Poslao: 07 Okt 2014 20:35
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Napisano: 07 Okt 2014 20:31
Već u tri - četri teme razglabamo o osnovnim stvarima. Da si to proučio kako treba prvo bi tebi bilo mnogo lakše da skapiraš sve to, a zatim bi bilo mnogo lakše da se međusobno razumemo.
Nema ljutiš, ali ti je stvarno već dosta servirano. Ne smeš ni da pomisliš da ne želimo da ti pomognemo, a kamo li da tako nešto kažeš.
Na pitanje kako da sklopiš string za naredbu si dobio odgovor. Ja mogu i da ti napišem to, ali će biti mnogo korisnije da to sam naučiš nego da koristiš gotov primer. Dakle, treba sam da pretražiš malo o tome i da izučiš to. Ako ti treba literatura, pa kaži, naći će se nešto. Nećemo mi uvek biti tu da rešavamo situaciju kada ti zapneš.
Na kraju, stvarno treba da se podsetiš spojeva, barem INNER JOIN-a. Da si načisto sa tim kako on funkcioniše poslednja pitanja ne bi ni pitao, već bi ti sve bilo jasno i do sada bi već sredio problem koji je pred tobom.
Dopuna: 07 Okt 2014 20:35
Na kraju, jedan od temelja pri radu sa bazom podataka jeste jednoznačna identifikacija entiteta (događaja, korisnika, spoja između njih itd). Ime definitivno ne određuje korisnika jednoznačno, što će reći da bi trebalo pored imena prikazati i redni broj (koje je primarni ključ u toj tabeli). To nosi sa sobom određene pogodnosti. U tom slučaju ne bi morao da vršiš pretragu i tražiš ID korisnika u bazi jer bi ti on bio dostupan u samom programu...
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 07 Okt 2014 20:56
|
offline
- tomislav91
- Počasni građanin
- Pridružio: 31 Maj 2008
- Poruke: 885
|
Mislim da sam sada okej spojio?
SELECT Tomislav.korisnik_ID, Tomislav.dogadjaj_ID, Tomislav.Datum
FROM dogadjaji INNER JOIN (korisnici INNER JOIN Tomislav ON korisnici.ID = Tomislav.korisnik_ID) ON dogadjaji.ID = Tomislav.dogadjaj_ID;
Time dobijem da sam spojio iz dogadjaji ID(njegov primaryKey) i korisnici(njegov PK) sa tomislav tabelom i kolonama korisnikID i dogadjajID. To je ok?
A ovako sa dodatim korisnik i dogadjaj iz njihovih tabela, odnosno ta imena.
SELECT Tomislav.korisnik_ID, Tomislav.dogadjaj_ID, Tomislav.Datum, dogadjaji.dogadjaj, korisnici.korisnik
FROM dogadjaji INNER JOIN (korisnici INNER JOIN Tomislav ON korisnici.ID = Tomislav.korisnik_ID) ON dogadjaji.ID = Tomislav.dogadjaj_ID;
|
|
|
|
Poslao: 07 Okt 2014 21:30
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Napisano: 07 Okt 2014 21:23
Ajde izvrši tu naredbu, pa uporedi njen rezultat sa tabelom Tomislav. Isto, jel da?
Svrha spoja je spajanje informacija. Ako si spojio informacije koje su ti potrebne, što si te iste informacije uklonio u projekciji (izboru kolona nakon select klauzule)? Koja je svrha ove komande? Generalno, spoj je dobar, ali si ukolnio potrebne informacije, tako da je beskoristan.
Ajmo da probamo da pojednostavimo. Tabele Korisnik i Događaj su zasebne i nezavisne. Kada ti treba informacija o događaju, tu informaciju tražiš u tabeli Događaj. Analogno je i za korisnike. Međutim, ako ti treba informacija o akciji (nazovimo je tako, misli se na događaj koji je izvršio korisnik), tu informaciju tražiš u spoju prve dve tabele. Kako spajaš? Tako što koristiš tabelu Tomislav kao posrednika u spoju (pošto je u pitanju MxN spoj, no da ne komplikujemoy to ćeš već razjasniti). Pored toga, tabela Tomislav čuva i sve informacije vezane za akciju (datum kod tebe). Dakle, spoj koristiš samo onda kada su ti potrebne sve informacije o akciju (recimo kod prikaza svih akcija, kao u formi na prethodnoj strani).
Ako želiš da dodaš korisnika, dodaješ ga u tabelu Korisnik. Analogno je i za događaj. Ako pak želiš da dodaš akciju, moraš da odabereš ID korisnika, ID događaja i da to zajedno sa datumom upišeš u tabelu spoja, tj. u tabelu Tomislav.
Dopuna: 07 Okt 2014 21:25
Ovo drugo je bolje, i to je ono što ti zapravo treba.
Jedna stvar - kad se tema otegne ovako na više strana ne bi bilo loše da imaš jedan post u kome ćeš da prikazuješ aktuelno stanje baze i programa. Ovako je teško da se isprati koja tabela ima koje atribute, šta, kako itd.
Dopuna: 07 Okt 2014 21:30
I da, još jedna stvar. Ako korisnik može da izvršava neki događaj više puta, onda primarni ključ (PK) ne može da bude samo skup ID_KOR, ID_DOG (kao na skici), već mora uključiti i datum, ili nešto drugo (recimo AutoNumber kolonu).
|
|
|
|
Poslao: 07 Okt 2014 21:59
|
offline
- tomislav91
- Počasni građanin
- Pridružio: 31 Maj 2008
- Poruke: 885
|
Okej, sada kada sam to uradio, primetio sam da kod dogadjaj i korisnik tabela sam dobio plusic
sto mi ustvari znaci da sam okej spojio to, msm da je uspelo tako kako sam napisao.
E sad, ono sto mi je zadatak jeste da u c# umesto string komande napisem nesto drugo? Jer ovo vise ne pije vodu, imena su druga, a i ne mogu string da upisujem. E to me malo buni, taj deo...Ja sam u bazi odradio sto sam hteo, samo taj upis u istu me buni..
string tekstKomande = "insert into Tomislav (korisnik, dogadjaj, Datum) values('" + this.comboBox1.SelectedItem + "','" + this.comboBox2.SelectedItem + "','" + s + "') ;";
P.S. Sad tek vidim da mi u tabelama dogadjaji i korisnici kod plusica stoje obrnute ifnromacije? Zasto to, dobar je sql koliko vidim, ne kontam u cemu je tu greska? Sad sam prema slici video.
|
|
|
|
Poslao: 07 Okt 2014 22:29
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Umesto this.comboBox1.SelectedItem treba da kreiraš upit koji će da ti vrati ID korisnika na osnovu selektovanog imena (još jednom, i po poslednji put, ime u ovom slučaju mora da ti bude jedinstveno!). Isto tako je i sa drugim atributom, tj. sa događajem. To je vrlo jednostavno, siguran sam da to znaš. Možeš da odradiš kao zaseban upit, ali možeš da odradiš i kao ugnježden upit.
tomislav91 ::P.S. Sad tek vidim da mi u tabelama dogadjaji i korisnici kod plusica stoje obrnute ifnromacije? Zasto to, dobar je sql koliko vidim, ne kontam u cemu je tu greska? Sad sam prema slici video.Ne stoje nikakve obrnute informacije, već je + tu da dodaš akciju za tog korisnika, odnosno za taj događaj. Dakle, na ID događaja (korisnika) se referencira tabela Tomislav, pa se to prikazuje na kvaj način. Sve je u redu.
|
|
|
|
Poslao: 08 Okt 2014 08:14
|
offline
- tomislav91
- Počasni građanin
- Pridružio: 31 Maj 2008
- Poruke: 885
|
Znaci fora je u c# samo u tom queriju "string tekstKomande" promeniti stvari? opet me to buni, dje to staviti
znam da treba nekako pomocu
displayMember i valueMember....u comboBoxu podesit, da display budu imena, a value ID-evi..i onda cu ja da vidim imena, ali ce stavljati id umesto imena...
samo jos ne znam DataSource koji da stavim, tj kako da stavim, probao sam path do baze, nece.
|
|
|
|
Poslao: 08 Okt 2014 08:52
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Uzmimo za primer korisnike. Pošto sad u tabeli Tomislav imaš korisnik_ID, a ne samo njegovo ime, to znači da u to polje moraš da upišeš ID jednog od zapisa iz tabele korisnici. Da bi dobio sve korisnike iz tabele, prvo moraš da ih pročitaš. Napiši komandu koja selektuje polja ID i naziv korisnika (verovatno si tom polju dao ime korisnik), a zatim ih ubaci u svoj combobox tako da do tih podataka možeš da dođeš. Recimo ovako:
public class ComboboxItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Text;
}
}
ComboboxItem item = new ComboboxItem();
item.Text = "Korisnik";
item.Value = 12;
comboBox1.Items.Add(item);
Kad budeš sklapao komandu za upis, pročitaj izabrani ID iz polja Value:
(comboBox1.SelectedItem as ComboboxItem).Value.ToString()
To isto treba da uradiš i sa događajima.
Inače, ovako kako ti radiš nije pogrešno, ali je prilično teško i postoji velika šansa da ćeš napraviti grešku. Predlažem ti da malo pogledaš Entity Framework i Data binding.
|
|
|
|
Poslao: 08 Okt 2014 09:05
|
offline
- tomislav91
- Počasni građanin
- Pridružio: 31 Maj 2008
- Poruke: 885
|
Da, ali zasto ja upisujem nove u combobox? Zar to sve ne bi trebalo da bude procitano? inace kad krenem da kucam comboBox1 ne izbaci mi ga kao ponudjeno.
ComboboxItem item = new ComboboxItem();
item.Text = "Korisnik";
item.Value = 12;
comboBox1.Items.Add(item);
I to iscitavanje, ja sam to stavio u form_load
string query="SELECT korisnik from korisnici";
string query2 = "select dogadjaj from dogadjaji";
OleDbCommand command = new OleDbCommand(query, connection);
command.Connection = connection;
OleDbDataReader reader = command.ExecuteReader();
while(reader.Read())
{
comboBox1.Items.Add(reader["korisnik"].ToString());
}
command = new OleDbCommand(query2, connection);
reader = command.ExecuteReader();
while (reader.Read())
{
comboBox2.Items.Add(reader["dogadjaj"].ToString());
}
ako na to mislis?
|
|
|
|
Poslao: 08 Okt 2014 10:28
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Mislim da se ne razumemo. Ti već sad u form_load funkciji dodaješ podatke u comboBox1, ali trenutno upisuješ samo ime korisnika/događaja. Umesto da dodaješ samo string, dodaj objekat ComboboxItem koji sadrži i ime i ID onako kako sam ti gore napisao.
Ako si sve dobro napisao, onda ne bi trebalo da bude greške. Moraš da dodaš klasu ComboboxItem čiji kod imaš gorei umesto da ovako dodaješ podatke u comboBox1:
comboBox1.Items.Add(reader["korisnik"].ToString());
Dodaj ih ovako:
ComboboxItem item = new ComboboxItem();
item.Text = reader["korisnik"].ToString();
item.Value = pročitaj ID polje iz readera za korisnika;
comboBox1.Items.Add(item);
|
|
|
|
Poslao: 08 Okt 2014 10:50
|
offline
- tomislav91
- Počasni građanin
- Pridružio: 31 Maj 2008
- Poruke: 885
|
Napisano: 08 Okt 2014 10:42
Ovako?
public class ComboBoxItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Text;
}
}
private void Form1_Load(object sender, EventArgs e)
{
dtpOd.Format = DateTimePickerFormat.Custom;
dtpOd.CustomFormat = " dd/MM/yyyy hh:mm:ss tt";
dtpDo.Format = DateTimePickerFormat.Custom;
dtpDo.CustomFormat = " dd/MM/yyyy hh:mm:ss tt";
dtpRucno.Format = DateTimePickerFormat.Custom;
dtpRucno.CustomFormat = "dd/MM/yyyy hh:mm:ss tt";
connection.Open();
string query="SELECT ID, korisnik from korisnici";
string query2 = "select ID,dogadjaj from dogadjaji";
OleDbCommand command = new OleDbCommand(query, connection);
command.Connection = connection;
OleDbDataReader reader = command.ExecuteReader();
while(reader.Read())
{
ComboBoxItem item = new ComboBoxItem();
item.Text = reader["korisnik"].ToString();
item.Value = reader["ID"];
comboBox1.Items.Add(item);
}
command = new OleDbCommand(query2, connection);
reader = command.ExecuteReader();
while (reader.Read())
{
ComboBoxItem item = new ComboBoxItem();
item.Text = reader["dogadjaj"].ToString();
item.Value = reader["ID"];
comboBox2.Items.Add(item);
}
connection.Close();
}
Dopuna: 08 Okt 2014 10:50
I sto se tice upisivanja komande za upis sto si napisao
(comboBox1.SelectedItem as ComboboxItem).Value.ToString()
To je sve u redu, ali on ne prihvata to, on meni prihvati kod rucnog, ali kod random nece
|
|
|
|