Professional Documents
Culture Documents
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 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
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)
-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