You are on page 1of 6

Dobar dan ja sam Ivan Trnski te idem u 4.C razred Tehničke škole Ruđera Boškovića.

Danas ću vam pokazati svoj završni rad na temu izrade baze podataka u SQL-u. Prvobitno
ću nešto reći o SQL-u i o samim bazama podataka zatim ću objasniti dizajn baze
podataka za vođenje zalihe po prosječnoj nabavnoj cijeni koju sam kreirao te ću na
kraju unijeti testne podatke koji će ukazati na funckionalnost i djeltvornost
baze.SQL kratica zapravo znaci " Structured Query Language" sto bi se moglo
prevesti kao strukturirani jezik za upite. Njegova povijest počinje 1970 godine
kad je razvijen u IBM Research Laboratory u San Jose-u u Californiki. Do
80-tih godina nije bio komercijalno razvijen zbog slabih karakteristika
tadašnjih računala, ali 1981. IBM je predstavio prvi komercijalni SQL
proizvod SQL/DS, iza njega su se pojavili sustavi baza podataka Oracle i
Reational Technology. Do 1989 postojalo je oko sedamdesetak različitih
verzija SQL sustava. ANSI (American National Standards Institute) i ISO
(International Standards Organization) su objavili prve inačice standarda
1986-e odnosno 1987-e. Zatim su skupa prihvatili proširenje standarda
1989 pod nazivom SQL-89 gdje je najvažnije proširenje bilo uvođenje
referencijskog integriteta. Onda su 1992 godine objavili SQL-2 ili SQL-
92 gdje imamo proširenje standarda u pisanoj formi (broj stranica) više
od 4 puta nego u ranijoj verziji. Na kraju objavljen je SQL-99 ili SQL-3 s
novim mogućnostima. U pogledu fizičkog zapisa podataka trebalo bi
napomenuti da je on razlicit od logičke strukture ili onog načina na koji
mi to vidimo u svojim glavama. Logička organizacija podataka
predstavlja organizaciju sa stanovišta korisnika baze podataka te se
odnosi na vrste podataka i njihove međusobne logičke veze. Sam SQL
kao sto ćemo vidjeti opisuje sto želimo dobiti kao rezultat, a ne kako doci
do toga što ga svrstava u neproceduralne jezike za razliku od npr. C
programskog jezika. Ideja tehnologije baza podatka jest da aplikacije ne stvaraju
vlastite datoteke na disku već koriste zajedničku kolekciju podataka. Treba napomenuti
da aplikacija ne pristupa izravno podacima na disku. Umjesto toga, ona posredno barata
s nima služeći se uslugama specijaliziranog softvera koji je zadužen za održavanje
zajedničke kolekcije. Spomenuta kolekcija se naziva bazom podataka, a spomenuti
softver se naziva sustavom za upravljanje bazom podataka. Tablice su objekti u kojima
se čuvaju podaci. Procedura je upit koji se čuva u bazi podataka. To su objekti baze
podataka koji sadrže kod koji se izvršava kao zasebna cjelina.
U SQL-u je dizajnirana baza podataka za vođenje zalihe po prosječnoj nabavnoj cijeni.
Osmišljene su tablice s potrebnom strukturom, definirani su PK i postavljeni su odnosi
između tablica (constraints). Kreirane su procedure za unos, ispravak i brisanje
podataka te funkcije s poslovnom logikom. Svrha izrađene baze jest da se može voditi
zaliha više skladišta kroz više godina. Korištena su dva dokumenta, primka i
izdatnica. Kod izlaza će biti korištena prosječna nabavna cijena. Tablice koje ću
koristit će biti artikl,grupa, artikl_grupa (za grupaciju artikala),
partner,grad,skladište, godina, dokukment_zaglav, document_stavka, priv_stavka,
priv_zaglav i stanje.
Kreiramo bazu TRNSKI4C te ju koristimo kako bi svi objekti bili kreirani u toj bazi.
Tablica artikl predstavlja podatke svih artikala.Tablica mjera predstavlja mjerne
jedinice .tablica artikl_grupa će služiti za grupaciju artikala.. Partneri su pravne
i fizičke osobe s kojima imamo poslovni odnos. U našem slučaju, dobavljači od koje
kupujemo robu i kupci kojima prodajemo. tablica SKLADISTE
- skladišta po kojima se evidentira zaliha robe
tablica GODINA
- godine za koje se evidentira zaliha

------------------- tablica DOKUMENT_ZAGLAV


- zaglavlja (opći podaci) svih ulaznih i izlaznih dokumenata
- ulazni dokument je primka i koristi se VRSTA_DOKUMENTA - PR
- izlazni dokument je izdatnica i VRSTA_DOKUMENTA je IZ
- polje DATUM je datum dokumenta
- polje BROJ_RACUNA se koristi samo kod ulaznih dokumenata (broj ulaznog računa)
tablica DOKUMENT_STAVKA
- stavke dokumenata, veza na DOKUMENT_ZAGLAV
- svaka stavka primke i izdatnice ima podatke
ARTIKL - šifra artikla
KOLICINA_ULAZ - količina koja povećava zalihu
KOLICINA_IZLAZ - količina koja smanjuje zalihu
CIJENA - nabavna cijena
- kod primki nabavna cijena je definirana od strane našeg dobavljača - piše na
ulaznom računu
- kod izdatnica nabavna cijena je prosječna nabavna cijena naše zalihe
- tablica nema primary key jer nema izmjene pojedinačne stavke te nema potrebe za
dohvaćanjem pojedinačne stavke
- ako se želi dohvatiti pojedinačnu stavku koristimo unikatne kombinacije i
potencijalni PK je (BROJ_DOKUMENTA, VRSTA_DOKUMENTA, GODINA, SKLADISTE, REDNI_BROJ)
Tablica stanje koja će prikazivati trenutno stanje na temelju dobivenih ulaznih i
izlaznih vrijednosti.

tablica PRIV_ZAGLAV
- privremena tablica u koju se upisuje zaglavlje dokumenta
- obradom se podaci brišu za dokument koji je obrađen (PR / IZ)
tablica PRIV_STAVKA
- privremena tablica u koju se upisuje stavke dokumenta
- obradom se podaci brišu za dokument koji je obrađen (PR / IZ)
umjesto PK (VRSTA_DOKUMENTA, REDNI_BROJ) biti će kreiran UNIQUE INDEX s istim poljima
zato što se kod brisanja retka mora mijenjati REDNI_BROJ, a to nije moguće ukoliko je
REDNI_BROJ dio PK
--------------------------------------------------------------------
kreiranje foreign keyeva
- nazivi su u obliku FK_child-tablica_parent-tablica
- to je standardni oblik naziva foreign keyeva
- FK je od foreign key
- parent tablica mora imati primary key na poljima nad kojima želimo napraviti
foreign key
-- nisu kreirani foreign keyevi na GODINA i SKLADISTE jer te foreign keyevi već ima
parent tablica DOKUMENT_ZAGLAV
kreiranje indexa
*********************************************************/
-- ovo je unikatni index i kreiran je umjesto PK na istoj tablici
-- omogućava da se može mijenjati redni broj (kod brisanja redaka) što bi PK
onemogućio

Time smo kreirali potrebne baze i objekte. Sada krećemo s izradom procedura. Prvo
izrađujemo jednostavne tablice koje imaju direktan zapis u bazu bez FK. To su sljedeće
tablice : mjera, grad, artikl_grupa i godina te će obuhvatiti naredbe insert, update,
delete i exists. Princip je jednak za sve četiri tablice pa ću dati primjer na tablici
mjera.
Sada ćemo obuhvatiti tablice koje imaju foreign key. To su tablice artikl, partner i
skladište i imat će iste naredbe kao i tablice bez FK. Princip je jednak za sve tri
tablice pa ću dati primjer na tablici artikl.
tablice s artiklima
- tablice koje imaju zapis u pomoćnu tablicu i nakon toga se radi "obrada" koja
zapisuje u prave tablice
DOKUMENT_ZAGLAV - insert
DOKUMENT_STAVKA - insert
STANJE - insert (kompleksna procedura)
privremene tablice
PRIV_ZAGLAV - insert
PRIV_STAVKA - insert, delete

obrada primke
obrada izdatnice
*/
--1 ulazni parametar, definiranje ulaznog parametara je ujedno i njihova deklaracija
--2 izlazni parametar jer ima OUT, definiranje izlaznog parametara je ujedno i njihova
deklaracija
--3 set nocount on se setira kako se kod izvršavanja procedure ne bi pokazivale poruke
o izvršenju odnosno o broju zahvaćenih slogova
4
za sve _exists procedure

- provjeravaju postojanje sloga u određenoj tablici


- uvijek se provjerava vrijednost primary key-a
-5 u varijablu @out_ima selektiramo broj (COUNT(*)) slogova koji zadovoljavaju uvjet
6 u ovom slučaju je to provjera u tablici MJERA, a provjerava koliko slogova ima isti
broj u polju MJERA koji je i primary key
-7 kako smo u parametrima definirali da je @out_ima izlazni parametar (OUT), kod
poziva te procedure moramo prihvatiti vrijednost tog izlaznog parametra
8 deklaracija varijable @ima
9 pozivanje procedure odnosno izvršavanje (EXEC)
--10 potrebno je svakom obaveznom parametru procedure dodijeliti vrijednost odnosno
varijablu za izlazne parametre procedure
--11 vrijednost može biti konstanta (broj, string, datum,...) ili varijabla, u našem
slučaju šalje se varijabla @mjera za parametar procedure @mjera
--12za izlazne parametre mora biti varijabla, u našem slučaju šalje se varijabla @ima
za parametar procedure @out_ima

12.1 ulazni parametar


12.2 izlazni parametar jer ima oznaku OUT, ukoliko se ne navede pozvana procedura neće
vratiti vrijednost

13 IF petlja
--14 dodjeljivanje nove šifre za novi slog odnosno izmjena podataka postojećeg sloga
--15 dodjeljuju se šifre od broja 1 na dalje, šifra ne može biti 0 jer se od
korisničkog sučelja očekuje da pošalje 0 za novi slog
--16 ako je @ima = 0 znači da nije pronađen slog koji zadovoljava uvjet u mjera_exists
proceduri
--17 to znači da se radi o novom slogu, u našem slučaju o novoj mjeri / mjernoj
jedinici
18 imamo novi slog i potrebno je pronaći prvi idući najmanji broj
19u varijablu @mjera selektiramo najveći zapisani broj u polju MJERA
20 kod prvog zapisa nema postojećih slogova i kao rezultat se dobije NULL vrijednost
--21 funkcijom ISNULL svodimo moguću NULL vrijednost na 0
--22 za prvu iduću šifru dodajemo 1
23 kako se radi o novom slogu potrebno je napraviti INSERT sloga
--24 kod INSERT-a definiramo polja koja zapisujemo i po istom redoslijedu
šaljemo vrijednosti koje su u varijablama
--25 ukoliko se ne definira redoslijed polja onda se vrijednosti moraju
slati po stvarnom redoslijedu polja u tablici kako je kreirana
26 izmjena postojećeg sloga
27 u našem slučaju radimo izmjenu samo jednog polja (NAZIV) jer tablica ima samo dva
polja
-28 brisanje sloga
--29 uvijek se briše unikatna vrijednost (po primary key-u)
30 ulazni parametar koji ima defaultnu vrijednost, ukoliko se izostavi kod poziva
parametar/varijabla @broj_dokumenta dobija defualtnu vrijednost (u ovom slučaju je 0)
31ulazni parametar koji ima defaultnu vrijednost
32 potreban je jer je sastavni dio FK za tablicu DOKUMENT_STAVKA
PRAVILA
-33 nema ispravka postojećeg dokumenta
-34 ispravci se rade kreiranjem novih dokumenata s negativnom količinom i istom
cijenom
-35 uvijek se dodaje novi dokument
-36 ulazna vrijednost @broj_dokumenta je na temelju gornjih pravila uvijek 0
37 izlaznom parametru dodjeljujemo vrijednost @broj_dokumemta
38 pozivamo proceduru stanje_insert koja će po potrebi zapisati novi redak i onda
napraviti ažuriranje potrebnih podataka
39 prvo treba provjeriti da li postoji redak za PK (ARTIKL, GODINA, SKLADISTE)
40 ako nema retka, zapisuje se redak za PK, a sve ostale vrijednost su 0
-41 sada imamo redak i potrebno je napraviti UPDATE polja
--42 odvojena polja za ulaz i izlaz omogućuju jednostavno ažuriranje
43 kada bi postojala transakcija provjerili bi stanje, ukoliko je stanje < 0 podigli
bi
--44 grešku i signalizirali transakciji da je neuspješna i da napravi roll back
45 podatka ne postoji kod izdatnice
46 - cijela logika je "singl-user" jer nisu odvjeni podaci po radnim stanicama
- ako više radnih stanica unosi istu vrstu dokumenta doći će do miješanja jer ne
postoji polje koji ih odvaja
- ako se želi "multi-user" rad, potrebno je dodati polje npr. RADNA_STANICA u koje će
biti upisano unikatno ime radne stanice
- @godina je godina od @datum - YEAR(@datum)
- vrijednosti za @partner i @skladiste se ne provjeravaju jer postoji FK na
pripadajuće tablice
- važno je provjeriti @vrsta_dokumenta jer su vrijednosti unaprijed određene (PR / IZ)

47 potrebno je provjeriti da li postoji neobrađeni dokument za vrstu


48 ukoliko je kroz korisnički unos poslana neprepoznata vrsta dokumenta, javlja se
greška i zapis neće biti napravljen
49 16 je severity parametar - ozbiljnost greške
50 1 je state, defaultno je 1
51 default vrijednost je 0, ako izostavimo taj parametar kod pozivanja procedure
smatra se da je 0 odnosno novi redak
52 korisničko sučelje treba brinuti da pošalje ispravan podatak, za PR @kolicina_ulaz
i obrnuto za IZ
*53
- ako je @redni_broj = 0 onda se radi o novom zapisu, novom retku i potrebno je
odrediti idući redni broj
- ako je @redni_broj <> 0 onda se radi o postojećem retku kojeg treba izmjeniti
*/
54 novi redak, moramo dohvatiti prvi idući redni broj
55 uzimamo najveći redni broj za vrstu dokumenta
56 ako nema niti jednog retka onda umjesto dohvaćene vrijednosti null stavlajmo 0 kao
zadnji dohvaćeni redni broj i sve povećavamo za 1
57 ispravak postojećeg retka
58
- brisanje retka te preslagivanje rednih brojeva kako bi išli po redu
- nije dozvoljen redni broj <= 0 jer takav ne može postojati, provjera
59 redak postoji i treba napraviti brisanje
60 moramo umanjiti za 1 sve redne brojeve veće od rednog broja koji je obrisan
61 ako redak (nekim slučajem) ne postoji može se prikazati poruka
62 nema ulaznih parametara jer se svi potrebni podaci već nalaze u privremenim
tablicama PRIV_ZAGLAV i PRIV_STAVKA
*63
tijek obrade primke:
- ako ih ima, napraviti potrebne provjere
- preuzeti važne podatke
- zapisati zaglavlje
- kod zapisa zaglavlja preuzimamo @broj_dokumenta kojeg koristimo za zapis stavaka
- kada sve zapišemo, brišemo podatke iz privremenih tablica
*/
64 provjera postoje li stavke primke
65 ima stavaka primke tako da se obrada nastavlja
66 selektiramo vrijednosti iz PRIV_ZAGLAV kako bi ih mogli zapisati u DOKUMENT_ZAGLAV
67 zapis zaglavlja
--68 uvijek je zapis novog doumenta, slanje parametar se može izostaviti jer je
definirana default vrijednost
--69 obrađujemo primku i to je konstantna vrijednost
--70 od sada na dalje znamo broj dokumeta, do ovog časa je bio 0

--71 zapis svih stavaka (redaka) iz PRIV_STAVKA


--72 ovaj način se koristi kako bi se izbjegli cursori
--74 moramo prvo uzeti podatke iz privremene tablice
--75 pozivamo proceduru za zapis u DOKUMENT_STAVKA
-- 76brišemo redak iz privremene tablice kako bi mogli uzeti slijedeći redak
--77 nema ulaznih parametara jer se svi potrebni podaci već nalaze u privremenim
tablicama PRIV_ZAGLAV i PRIV_STAVKA
*78
tijek obrade izdatnice:
- ako ih ima, napraviti potrebne provjere
- preuzeti važne podatke
- zapisati zaglavlje
- kod zapisa zaglavlja preuzimamo @broj_dokumenta kojeg koristimo za zapis stavaka
- kada sve zapišemo, brišemo podatke iz privremenih tablica
*/
-79 deklaracija temp tablice u koju ćemo zapisati sumu količine za svaki artikl
80 ima stavaka izdatnice tako da se obrada nastavlja
-81 provjera - moramo provjeriti zalihu prije nego što počne obrada
82 kako možemo imati više redaka istog artikla, potrebno je sumirati sve stavke istog
artikla

-83 sve je OK, nema artikala koji će imati negativno stanje nakon obrade izdatnice
84 zapis zaglavlja
--85 uvijek je zapis novog doumenta, slanje parametar se može izostaviti jer je
definirana default vrijednost
86 obrađujemo primku i to je konstantna vrijednost
87 od sada na dalje znamo broj dokumeta, do ovog časa je bio 0
88 zapis svih stavaka (redaka) iz PRIV_STAVKA
89 ovaj način se koristi kako bi se izbjegli cursori
-90 dummy vrijednost kako bi ušli u petlju
91 moramo prvo uzeti podatke iz privremene tablice
važno je uočiti da se CIJENA ne preuzima iz privremene tablice nego se računa
prosječna nabavna cijena
94 ne očekujemo null vrijednosti
95 pozivamo proceduru za zapis u DOKUMENT_STAVKA
--96 brišemo redak iz privremene tablice kako bi mogli uzeti slijedeći redak

I za kraj ću se osvrnuti na testne podatke koje sam umetnuo pomoću kreiranih


procedura. Dakle podaci su nasumični te su izrađeni kako bi poslužile kao materijal s
kojim bih ukazao na funckionalost i djelotvornost podatke. Obradom bilo kojih
zaprimljenih dokumenata vrijednosti u tablici stanje se mjenjaju. Trenutno stanje samo
ispisao na sljedećoj datoteci uporabom naredbe select

Rad u SQL-u se na prvi pogled se čini teškim i neizvedivim no u današnjici je sve


dostupno na internetu. Postoje stranice na kojima ima raznih web developera uvijek
spremnih pomoći. SQL je jedan od najčešće korištenih programskih jezika te se smatra
vrlo poželjnom vještinom; njegovo poznavanje otvara jasne puteve za pronalaženje novog
posla i mogućnosti zapošljavanja. Mislim da je moj put učenja baza podataka tek
započeo te se radujem usvajanju novih vještina i prilika za primjenu stečenog znanja.

You might also like