• Apgrejdovali smo forum na XenForo 2.1.1, ukoliko imate predloga vezanih za izgled ili funkcionalnost foruma, ili ukoliko naletite na neki problem, javite nam OVDE

    DEFINISALI SMO PRAVILA FORUMA. Pročitajte ih, pojaviće se automatski kada krenete da čitate nešto!

SQL + VB u Visual Studiu

boka003

PCAXE Apprentice
Učlanjen(a)
21.01.2016.
Poruka
64
Rezultat reagovanja
2
Moja konfiguracija
Pozdrav,

Radim "programcic" za ispit na fakultetu.
Radim ga u VB u Visual Studiu. Program je povezan sa bazom.
Nadam se da sam postavio temu na pravo mjesto, posto se problem vise odnosi na bazu nego na VB.

Pokusao sam da napravim filtere za pretragu baze, kao sto je to odradjeno na sajtovima za kupovinu.
Primjer pretraga automobila: Izbor marke auta, izbor boje, pogonskog goriva, broja vrata... i onda se izlistaju podaci koji odgovoaraju svim gore navedenim kriterijumima.

- Medjutim nije islo, sa combobox-ovima pa sam se odlucio za text field.
Video "programa":
Kao sto je prikazano na videu, problem se javlja prilikom pretrage vrste bicikla 'M' (Muski).
Ne prikazuje sve podatke iz baze (imaju 3 artikla sa 'M' , ali pretraga prikazuje samo 1).

SQL upit koji sam koristio:
Kod:
SELECT        ID, Vrsta, VelicinaRama, Proizvodjac, Tip, BrojBrzina, Status, Cijena, Napomena
FROM            Bicikla
WHERE        (Vrsta LIKE @Vrsta) AND (VelicinaRama LIKE @VelicinaRama)
2. Da li postoji opcija da u text filed unesem default value ako je polje prazno ?
Iz razloga da kada zelim da ostavim polje prazno ne moram svaki put da kucam '%'

3. Da li mi mozete preporuciti neko upustvo za visual studio kako bi mogao da uradim denormalizaciju baze ?
NPR. normalizacija je uradjena na tabelu proizvodjac, gdje je:
1 - CUBE
2 - APLINA
3 - BOOSTER
4 - FOKUS....

U tabeli se prikazuju samo id-ievi umjesto imena marke, da li postoji mogucnost da se narpavi da se prikazuje marka umjesto id-a ?

Hvala svima na citanju.
Lijep Pozdrav
Boris
 

bokinet

PCAXE Apprentice
Učlanjen(a)
24.06.2018.
Poruka
7
Rezultat reagovanja
0
Moja konfiguracija
3. Koristi relaciono povezivanje tabela u bazi, gde je jedna tabela tkz. katalog (sifarnik) po sistemu ID (jedinstvena sifra koja moze biti numercivka i alfanumericka vrednost - preporuka numericka) i ostala prateca polja tipa naziv, opis i sl. U drugoj tabeli bi za svaki zapi koji odgovara u toj tabeli umesto da belezis sve vrednosti iz prve tabele imao samo jedno polje koje ustvari ID.

Primer:
Tabela 1 - Sifarnika kategorija (Kategorije)
Polje 1 - KategorijaID - int -> jedinstvena sifra kategorije artikla (PK)
Polje 2 - Naziv - varchar(100)
Polje 3 - Opis - varchar(500)
Polje 4 - Status - tinyint

Tabela 2 - Artikli
Polje 1 - ArtikalID - int -> jedinstvena sifra artikla (PK)
Polje 2 - KategorijaID - int -> kategorija kojoj pripada artikal
Polje 3 - Naziv varchar(100) -> naziv artikla
Polje 4 - Opis (500)
Polje 5 - Cena
Polje 6 - Status -> tinyint

Posto sad imas dve tabele iste kada zelis da imas tkz. celokupni pregled spajas relacionim upitima (trebalo bi malo da pogledas SQL)

Primer SQL upita koji pravi relacioni odnos izmedju tabele 2 (Artikli) i tabele 1 (Kategorije artikla)

SELECT
`artikli`.*
, `kategorije`.`naziv` AS `kategorija_naziv`
, `kategorije`.`opis` AS `kategorija_opis`
, `kategorije`.`status` AS `kategorija_status`
FROM
`artikli`
LEFT JOIN `kategorije`
ON (`artikli`.`kategorijaid` = `kategorije`.`kategorijaid`);

Ovde ce se kreirati recordset koji vraca sve zapise iz tabele ARTIKLI i odgovarajuce zapise iz tabele KATEGORIJE ako isti postoje i odgovaraju.
Veza je polje kategorijaid i na osnovu istog polja se vrsi povezivanje ove dve tabele.

Ovo je samo primer kako sta i na 'suvo' sam odradio bez provere ali je bitna sustina i logika.

Sto se tice podrzumevanih vrednosti, moze da se uradi i resis to vrlo prosto.
Ako polje nije uneto onda je to neka podrazumevana vrednost koju si definisao neposredno u aplikaciji kroz neku promenljivu ili konstantu.

Prilikom upita u bazu, pravi IF uslov i gledas da li je nesto uneto ili ne. Ako vrednost nije uneta ili je unet znak za podrazumevanu vrednost onda uzimas unapred definisanu vrednost.

Preporuka je da kroz kod (dinamicki) generises SQL upit iz tog razloga posto onda imas mogucnosti da vrsis i provere ili da koristis neke napredne tehnike kao sto su STORED PROCEDURE i funkcije na server strani gde se nalazi DBMS.

To znaci, na primer, na gornjem upitu bi moglo da se doda WHERE deo SQL upita i potom dodaju polja za uslov ali i ostale stvari tipa ORDER BY za sortiranje kao i sam nacin sortiranja.

SELECT
`artikli`.*
, `kategorije`.`naziv` AS `kategorija_naziv`
, `kategorije`.`opis` AS `kategorija_opis`
, `kategorije`.`status` AS `kategorija_status`
FROM
`artikli`
LEFT JOIN `kategorije`
ON (`artikli`.`kategorijaid` = `kategorije`.`kategorijaid`)
WHERE (`artikli`.`kategorijaid` = '1010' AND `artikli`.`naziv` LIKE '%deonaziva%' AND `artikli`.`status` = 1);

Ovde je receno upitom daj mi sve zapise koji u bazi artikli imaju kategoriju sa ID 1010 (nije znaci tabela kategorije) i imaju naziv artikla koji SADRZI 'deonaziva' i imaju status artikla 1.

Ovo lako moze da modifikujes i da preradis posto je samo dat primer kako.

Znaci na dogadja neki tipa na unos karaktera ili klik na command button kod bi bio nesto poput

dim Query as string
dim KategorijaID as integer
dim Naziv as string
dim Status as integer

' Podrazumevane vrednosti
KategorijaID = 0
Naziv = ""
Status = 1

' Pocetni upit
Query = "
SELECT
`artikli`.*
, `kategorije`.`naziv` AS `kategorija_naziv`
, `kategorije`.`opis` AS `kategorija_opis`
, `kategorije`.`status` AS `kategorija_status`
FROM
`artikli`
LEFT JOIN `kategorije`
ON (`artikli`.`kategorijaid` = `kategorije`.`kategorijaid`)
"
' KategorijaID
if val(txtKategorijaID) > 0 then kategorijaid = val(txtKategorijaID.text)

' Sadrzi u nazivu artikla
if len(trim(txtNaziv.text)) > 0 then naziv = txtnaziv.text

' StatusID
if val(txtStatus.text) <> 1 then status = val(txtStatus.text)

if kategorijaID <> 0 OR naziv <> "" OR status <> 0 then

query = query & " WHERE "

if kategorijaid <> 0 then
query = query & " artikli.kategorijaid = kategorijaid "
end if

if naziv<> "" then
if kategorijaid<>0 then query = query & " AND "
query = query & " artikli.naziv LIKE '%" & naziv & "%' "
end if

if status<> 0 then
if kategorija<>0 or naziv <> "" then query = query & " AND "
query = query & " artikli.status = " & status
end if

end if

' Dodatno ako hoces sortiranje - primer sortiraj sve zapise kao rezultat upita i to prvo po nazivu kategorije pa onda po nazivu artikla
query = query & " ORDER BY kategorije.naziv ASC, artikli.naziv ASC "

... dalje izvrsava SQL upit i prosledjujes tabeli ili gde vec zelis....

Sto se tice spajanja tabela koristeci SQL postoje INNER JOIN, LEFT JOIN, RIGHT JOIN kao osnovne relacije i ne bi bilo lose da ovladas njima posto se one stalno ponavljaju.

Navedeni kod je dat isto uproscen i dovoljan za neki pocetni rad ali sve ovo sutra moze totalno drugcije i mnogo bolje da se odradi.
 
Vrh