Professional Documents
Culture Documents
3. STRUKTURA DELPHIJA................................................................6
3.1. Elementi Delphija ............................................................................................... 6 3.2. Delphi kao alatka za vizuelno programiranje ..................................................... 8 3.3. Datoteke koje Delphi generie ............................................................................ 9
4. BAZE PODATAKA........................................................................11
4.1. Potreba za standardom pri radu sa bazama podataka........................................ 11 4.2. Terminologija baza podatka.............................................................................. 11 4.3. Komponente za rad sa bazama podataka .......................................................... 13
4.3.1. TABLE I QUERY ................................................................................................15 4.3.1.1. Kretanje kroz tabelu.......................................................................17 4.3.1.2. Odreivanje sadraja polja ............................................................17 4.3.1.3. Pretraivanje tabele........................................................................17 4.3.1.4. Promena vrednosti polja ................................................................18 4.3.1.5. Master - detail relacija ...................................................................19 4.3.2. FIELD KOMPONENTA ........................................................................................20 4.3.3. DATABASE GRID..............................................................................................21
4.4. Pravljenje programa za rad sa bazama podatka ................................................ 21 4.5. Lokalne i client / server aplikacije .................................................................... 22 4.6. Borland database engine (BDE)........................................................................ 23
5. OPIS PROBLEMA..........................................................................25
5.1. ZADATAK ....................................................................................................... 25 5.2. OBJANJENJE STRUKTURE PROGRAMA ................................................. 25
5.2.1. FORMA - UNOS ARTIKLA..................................................................................26 5.2.2. FORMA ZA UNOS ULAZNOG NALOGA ...............................................................28 5.2.3. FORMA ZA PREGLED ZADUENJA.....................................................................30
1. PROGRAMSKI JEZICI
1.1. Razvoj programskih jezika
Programski jezik predstavlja notaciju namenjenu izraavanju algoritma na nain koji moe razumeti i izvriti raunar. To je skup simbola sa zadatim pravilima formiranja od tih simbola pravilnih konstrukcija programskih jezika. Danas postoji nekoliko stotina razliitih programskih jezika. Dosadanji razvoj programskih jezika moemo podeliti na sledei nain : 1. Mainski jezici 2. Simboliki mainski jezici 3. Proceduralni programski jezici 4. Neproceduralni programski jezici 5. Objektno orjentisani jezici 6. Jezici vetake inteligencije Najelementarniji programski jezik je interni jezik raunara, tzv. mainski jezik. On je izgraen nad binarnom azbukom. Svaka mainska naredba predstavlja binarni kod koji raunar moe da prepozna i izvri. Simboliki mainski jezik je nastao iz mainskog zamenom koda operacije simbolikim imenima, jo se zove i mainski orjentisan jezik ili asembler. Proceduralni programski jezici omoguavaju opis algoritma na mnogo prirodniji i jednostavniji nain u poreenju sa simbolikim mainskim jezicima. To su jezici nezavisni od maine i nain zadavanja algoritma je blizak nainu izraavanja ljudi. Neproceduralni programski jezici omoguavaju pisanje programa na znatno veem nivou apstrakcije, teei ka opisnim formalizacijama algoritama proirenjem standarnih operatora kompleksnim operatorima. Ovi jezici specificiraju ta treba uraditi umesto zadavanja kako to treba uraditi, pa se nazivaju i jezici vrlo visokog nivoa. Objektno orjentisani jezici zasnivaju se na objektima. Objekat ili klasa sadre podatke i operacije koje se vre nad tim podacima. Do sada su, u prethodnim opisima programskih jezika, podaci i operacije koje se vre nad tim podacima bili razdvojeni. Objekat je slian strukturi u C-u ili recordu u Pascalu, ali sa dodatkom procedura i funkcija koje obrauju definisane podatke. Ideja je da se napravi klasa koja neto radi i da mi tu klasu moemo koristi u svojim programima, ali da neznamo kako ona radi i bez mogunosti da utiemo na to. Na primer: Imamo klasu Mojstring koja ima promenljivu tekst i funkcije VratiDuinuTeksta, PretvoriUVelikaslova, PretvoriUMalaslova. (sledi definicija klase u Delphiju)
type TMojString = class(TString) private // Private declarations // ovde je def. privatnih procedura i prom. koje ne moemo koristiti van klase 2
public // Public declarationssve prom. definisane kao public text : string; // moemo koristiti van klase function VratiDuinuTeksta : integer; procedure PretvoriUVelikaSlova; procedure PretvoriUMalaSlova; end; // pa sada sledi implementacija svih funkcija i procedura ... // u nekom drugom programu var s : MojString; n : integer; ...
Znai koristimo funkciju VratiDuinuNiza i proceduru PretvoriUVelikaSlova a da ne znamo kako one rade. Bitan nam je samo rezultat. Jezici vetake inteligencije su u fazi razvoja. Osnovu za ove jezike ine funkcionalni jezik lisp, logiki jezik prolog i drugi jezici vetake inteligencije. To su jezici koji e omoguiti predstavljanje znanja i deduktivno zakljuivanje na tom znanju.
32 bitni ceo broj. Dodeljivanje memorije ogranieno je iskljuivo koliinom slobodne memorije koja moe iznositi i vie megabajta. Izvravanje vie niti programa. Potpuna podrka 32 bitnim kontrolama Windowsa. Unapreena podrka za povezivanje i ugraivanje objekata (engl. Object Linking and Embedding OLE). Zahteva Windows 95 ili NT. Unapreen BDE i SQL (struktuirani jezik upita; engl. Structured Query Language) veze.
3. STRUKTURA DELPHIJA
3.1. Elementi Delphija
Kada se startuje Delphi, otvara se nekoliko prozora razliite namene pomou kojih se gradi aplikacija. To su: Glavni prozor Delphija -Ovaj manji prozor je uvek smeten pri vrhu ekrana. Pomou njega se podeavaju parametri programa, organizuju se alati za rad i vri se kompajliranje (generisanje izvrnog koda). Svi ostali elementi sa kojima se radi su sinhronizovani pod kontrolom ovog glavnog prozora. Na njemu se nalaze sledei elementi: Linija menija - Ovde su smetene opcije samog Delphija. Dugmad preica - Tasteri za brz pristup najee korienim opcijama, bez potrebe da se trae u meniju. Slue da ubrza rad sa Delphijem. Paleta komponenti - Na njoj su prikazane ikone standardnih i specifinih Windows komponenata koje se mogu smetati po formi i tako graditi vizuelni izgled aplikacije. Paleta je podeljena na stranice u kojoj su komponente grupisane prema funkciji (Kategorije paleta).
Slika 1. Delphi okruenje Object Inspector Prikaz svih svojstava odabrane komponente i omoguavanje menjanja istih. Kada se klikne miem na bilo koji od objekata, u Object Inspectoru se pojavljuje lista njegovih svojstava koja se mogu menjati podeavajui tako objekat konkretnim potrebama. Kartice Properties i Events Prikaz svojstava komponenata ili prikaz dogaaja vezanih za komponente koje se nalaze na formi. Nalaze se na vrhu object inspektora, gde se nalazi u lista svih komponenti koje se nalaze na formi. Module Explorer Prikaz klasa tekueg modula, promenljivih, objekata, i drugih informacija. Prozor editora koda Mesto za unos i izmenu samog koda aplikacije koju trenutno radimo. Mogue je otvoriti vie datoteka i raditi nezavisno sa svakom od njih (Module explorer prikazuje svojstva za trenutno aktivnu datoteku). Pojedine linije su ve na samom poetku upisane u ovaj prozor. To je kod koji Delphi automatski unosi prilikom inicijalnog kreiranja kostura programa. Kada se pone sa razvijanjem novog projekta, automatski se generie prvi prozor budue aplikacije. Ovaj objekat se u Delphiju naziva forma. Nova forma na poetku nema na sebi nijednu komponentu, ali ima sve osobine standardnog Windows prozora: moe se pomerati po ekranu, smanjivati i uveavati, poseduje naslovnu liniju, okvir i radnu povrinu (Canvas). Delphi automatski generie sav potreban kod aplikacije da bi ona imala ovaj inicijalni prozor, tako da je mogue odmah startovati program - pri izvravanju e se pojaviti ovaj prozor koji e biti prazan jer na njega jo nije postavljena nijedna komponenta. Da bi program radio neto korisno, potrebno je na njega smestiti komponente po potrebi i napisati
7
programski kod za odreene dogaaje. Generisanje inicijanog koda za dogaaje je automatsko. Na formi se nalazi mrea taaka koja se ne vidi prilikom izvravanja programa, ve samo dok se radi u Delphiju. Ova mrea se naziva Grid i ona slui kao pomo pri postavljanju i manuelnom poravnavanju komponenti (mada postoji i automatsko poravnavanje komponenti), dajui vizuelni pregled radne povrine.
Slika 2. TeeChart wizard mogui izgledi grafikona Database Desktop DBD DataBase Desktop (DBD) je alatka za rad sa bazom podataka. Ona nam omoguava kreiranje upita, kreiranje, restruktuiranje, indeksiranje, modifikovanje i kopiranje baze podataka, tabela, ukljuujui datoteke Paradoxa ili dBase, kao i SQL tabele. Nije potrebno da posedujemo Paradox ili dBase da bismo koristi DBD sa desktop datotekama koje su u ovom formatu. DBD moe kopirati podatke i podatke o reniku podataka iz jednog formata u drugi. Npr. mogue je kopirati Paradox-ove tabele u postojeu bazu podataka na udaljenom SQL serveru.
Make (sadri liste zavisnosti modula i prua neophodne komande i informacije za prevoenje i povezivanje viemodulske aplikacije). .dcr datoteke Delphi Component Resource datoteke sadre ikonu komponente u obliku u kojem se pojavljuje na VCL paleti. .dcu datoteke Ove datoteke sadre prevedeni kod i podatke za programske module. .dfm datoteke Ove datoteke sadre tekstualni opis formi. .dof datoteke Ove datoteke sadre opcije projekta (vezano za prevoenje, linkovanje,...) .dpr datoteke Skraenica za Delphi projekt; to je datoteka izvornog koda projekta. .exe datoteke Datoteke izvrnog koda. .pas datoteke Sadre izvorni kod u Pascalu. .res datoteke Sadre binarne resurse koje program koristi (ikone, bitmapirane slike, tekst,...)
10
4. BAZE PODATAKA
4.1. Potreba za standardom pri radu sa bazama podataka
U ranim danima PC-a, programi koji su radili sa bazama podataka, pisani su da bi radili na jednom raunaru i podravali su samo jednu bazu podataka. Poto je tada PC bio na niskom stadijumu razvoja, (veina aplikacija je i dalje bila napisana za vee raunare) baze podataka su retko, ako su uopte i bile menjane. Ovo je zadovoljavalo potrebe dugi niz godina. Meutim kako je sve vie i vie kompanija prihvatalo PC kao platformu na kojoj e raditi njen softver, javilo se nekoliko problema koji nisu mogli biti efikasno reeni bez postojanja standarda : Proirivost (engl. scalability) Kako je PC postajao sve prisutniji na radnim stolovima, dolo je vreme kada je trebalo da aplikacije budu sposobne za rad u mrei. Drugim reima, trebalo je da se aplikacije izvravaju na jednom mestu i da imaju vezu sa bazom podataka koja radi na serveru. Ako je aplikacija bila napravljena za samostalni rad, to je najee znailo da mora biti prilagoena drugoj bazi (onoj koja je omoguavala vie korisnika istovremeno). To je, opet, znailo dodatne trokove oko ponovnog pisanja aplikacija. Interoperabilnost (engl. interoperability) Softverske kompanije su morale da se odlue za odreenu bazu. Ako je kompanija elela vie od jedne ciljne baze, trebalo je razvijati posebnu verziju softvera za svaku eljenu bazu podataka. Oigledno ovo je bilo veoma skupo. Ono to je bilo potrebno jeste mogunost da se softver napie na takav nain da moe da podri vezu ka bilo kojoj bazi podataka, bez potrebe za ponovnim pisanjem programa. Cena razvoja softvera Poto je API (engl. application programming interface) za bazu podataka skoro uvek bio specijalizovan (specifian za bazu), ako je neka kompanija elela da razvije softver za korienje baze podataka A, bio joj je potreban ekspert za A. Dalje, ako je kompanija elela da razvija softver za bazu B, trebao joj je ekspert i za tu bazu podataka. Ovo je imalo za posledicu da je bilo skupo i teko pronai programera. Bio je potreban standard API za baze podataka. Onda su kompanije mogle da trae programera koji je poznavao standardni API koji ima mogunost rada sa vie baza podataka. Na taj nain, bilo bi mnogo lake i pronai programera i sniziti cene odravanja programa.
Zapis (engl.record) Kolekcija polja koja sadre srodne informacije; na primer zapis o radniku u nekoj firmi mogao bi da sadri polja ID_Radnika, Ime_radnika, Prezime_radnika, mat_br, plata,... Tabela (engl.table) Kolekcija zapisa koji svi imaju istu strukturu. Kada se tabela pokazuje u obliku reetke, svaki red je jedan zapis, a kolona je jedno polje (Slika 4)
Baza podataka (engl. database) Kolekcija povezanih tabela, obino odreena direktorijumom koji sadri te tabele (kod paradox tabela koje se najee koriste u radu sa BDE-om) Indeks (engl.index) Indeks je polje koje se koristi za logiko sortiranje slogova tabele. Pri umetanju nekog sloga u sredinu datoteke, morala bi da se preraspodeli cela tabela to je duga operacija. Zbog toga se koriste indeksne datoteke koje uvaju logiki redosled slogova tabele tako da BDE isporuuje slogove u redosledu definisanom u indeksnoj datoteci. Svaka promena stanja tabele reflektuje se u indeksnoj datoteci koja je uvek aurna. Indeksne informacije se najee nalaze u posebnoj datoteci sa ekstenzijom .PX (za Paradox tabele), odnosno .MDX (za dBase tabele). Za neke druge tipove baza podataka podaci o indeksima su smeteni zajedno sa tabelama ili kompletnom bazom podataka u istoj datoteci (na primer MS Access). Primarni indeks (engl. primary index) Kontrolie redosled u kome se zapisi u bazi podataka prikazuju i zahtevaju ga mnoge funkcije za rad sa bazama podataka. Polje primarnog indeksa mora biti jedinstveno; to znai da ne mogu postojati dva zapisa koji imaju istu vrednost u tom polju. Primarni indeks moe da sadri i vie polja, znai ne mogu postojati vie zapisa sa istim vrednostima u tim poljima. Sekundarni indeks (engl.secondary index) Tip indeksa koji moe biti zasnovan na kombinaciji polja i ne mora biti jedinstven. Moe se koristiti pri povezivanju tabela, pri prikazu podataka u rastuem/opadajuem redosledu,... Upit (engl. query) Izraz u SQL-u koji bira zapise i polja iz jedne ili vie tabela. Koristi se da bi se dobile odreene informacije iz jedne ili vie tabela; na primer spisak svih kupaca koji nisu platili raun, ili dugovanja kupca za period vremena. Svaka baza podataka ima fiziku i logiku strukturu.Podaci su smeteni na disku u obliku datoteka. Ove datoteke mogu biti razliite strukture, to zavisi od primenjenog formata zapisa koji je upotrebljen za njihovo kreiranje. Nain na koji su podaci smeteni na disku naziva se fizika struktura podataka.
12
Ono to podaci stvarno predstavljaju nazivamo logikom strukturom baze podataka. Za korisnike je bitna i jedino vidljiva logika struktura baze podataka. Podaci koji se odnose na jednu zajedniku primenu smeteni su u jednu ili vie datoteka na disku. Postoji veliki broj standarda u ovoj oblasti, koje primenjuju razliiti proizvoai i programski paketi, tako da podaci mogu biti smeteni na razliite naine. Vrsta fizike organizacije podataka na disku je jako bitna za programera koji pie aplikaciju kako bi stvorio vezu izmeu samih podataka i njihove logike prezentacije koju vidi korisnik.
BatchMove
Database DataSource
DBChart DBCheckBox, DBComboBox,DBEdi t, DBImage,DBListBox, DBMemo, DBRadioGroup, DBRichEdit Skup redova koji se mogu pomerati i od kojih svaki DBCtrlGrid
Izvodi paketne operacije nad tabelama (kopiranje skupa podataka, dodavanje podataka iz jednog skupa podataka u drugi, auriranje i brisanje,...). Najpre se Source i Destination svojstvima definiu dve tabele, od kojih prva predstavlja izvor odakle se uzimaju podaci, a druga mesto na koje e podaci biti smeteni. Pomou Mode svojstva odreuje se tip operacije. U sluaju da su izvorina i odredina tabela razliitih struktura, svojstvom Mappings se odreuju pravila dodeljivanja vrednosti poljima. Zadata operacija se zatim izvrava metodom Execute. Prijavljivanje na server (obrada lozinki, alijasa, parametri konekcije...) Povezuje nevizuelne komponente koje ostvaruju vezu sa tabelama sa vizuelnim koje prikazuju sadzaj tabela ili SQL upita. Pravljenje grafikona od podataka iz tabele Ovo su komponente prikazuju podatke razliitog tipa iz baze podataka (tekst, brojeve, slike, true/false,...)
DBGrid DBNavigator
predstavlja jedan zapis iz baze podataka. Svaki red moe imati jedan ili vie objekata koji predstavljaju polja zapisa iz baze. Mrea redova i kolona koja u svakom redu prikazuje po jedan zapis iz baze podataka. Obino se korisi zajedno sa objektom DBNavigator. Database navigator vizuelno izgleda kao skup tastera specifine namene. Svaki taster korespondira sa metodom istovetnog naziva table ili query komponente sa kojom je povezan data source komponentom. Korisnik time dobija kontrolu nad operacijama upisa, brisanja izmene i kretanja po slogovima bez potrebe da se piu posebne procedure. Database navigator se najee koristi uz druge database komponente povezane sa istom data source komponentom i u kojima se prikazuju i unose podaci u polja. Upravljanje podacima se zatim obavlja pomou database navigatora. Pojedini tasteri mogu se proglasiti nevidljivima, kako korisnik ne bi mogao da ih koristi. Tasteri database navigator komponente: First Pomera tabelu na prvi slog. Prior Pomera tabelu za jedan slog unazad. Next Pomera tabelu za jedan slog unapred. Last Pomera tabelu na poslednji slog. 14
Query Session
Insert Umee slog u tabelu. Delete Brie slog iz tabele. Edit Omoguava promenu polja tekueg sloga. Post Snima sadraj sloga u tabelu. Cancel Ponitava izmene na slogu. Osveava podatke na Refresh database komponentama. alje SQL komande sistemu BDE ili SQL serveru. Ova komponenta se automatski kreira na poetku izvravanja svake Delphi aplikacije. Iako je nevidljiva i retko iskoriena u programu, ona u pozadini kontrolie rad sa bazama podataka na globalnom nivou. Omoguava programima da izvravaju procedure smetene na serverima na kojima se nalaze baze podataka (vezano za klijentsko serverske programe). Pristup tabeli preko BDE. Za auriranje skupova podataka dobijenih preko SQL servera.
CashedUpdates
AutoCalcFields
Exclusive Filter
Filtered MasterSource
MasterFields
ReadOnly SQL
uznemirava mreu sa malo podataka. Program sa keiranim promenama skladiti promene lokalno, a onda ih oednom pusti kroz mreu. Program treba da vodi rauna o tome da i neki drugi program moe menjati podatke u istoj bazi, pa moe doi do nedozvoljenih promena u bazi, tako da kad god se radi o bazi koju koristi vie programa istovremeno, treba postaviti vrednost ovog svojstva na false. Svaki put kada se promeni tekui slog, poziva se metoda OnCalcFields u kojoj se mogu dodeliti vrednosti sraunatim poljima. Ovo svojstvo odreuje da li se ovaj dogaaj poziva automatski i tokom rada sa slogom, svaki put kada se promeni vrednost bilo kog polja. Na ovaj nain omoguava se odravanje aurnog stanja sraunatih polja. Odreuje da li drugi korisnici u viekorisnikom okruenju mogu pristupati tabeli. true oznaava zabranu pristupa tabeli za druge korisnike. Filtriranje podataka tako da prikazuje samo podskup podataka iz tabele; na primer stavimo : Filter:=Plata=5000 u nekoj tabeli radnici i imaemo prikaz svih radnika sa platom od 5000. Vrednost false znai da zanemarujemo filter, tj. vidimo sve podatke, a true da vidimo podskup podataka odeenog filter-om. Koristimo kada hoemo da poveemo vie tabela po nekom kljuu (indeksu); na primer imamo tabelu Kupci sa podacima o kupcima i Narudzbine sa podacima koji je kupac ta naruivao. Ova komponenta nam omoguava da kretanjem kroz tabelu Kupci se automatski vri i kretanje kroz tabelu Narudzbine (automatski se pronalaze narudzbine za trenutnog kupca bez pisanja koda) kasnije detaljno objanjeno Odnosi se na prethodno svojstvo i kae nam po kojoj emo vrednosti polja vriti povezivanje tabela; na primer za prethodni sluaj to moe biti polje ImeKupca koje postoji u obe tabele. Vrednost true, znai moemo samo itati iz tabele, a false da moemo itati i upisivati u tabelu. Ovo svojstvo sadri tekstualni upit za prikaz odreenog skupa podataka iz jedne ili vie tabela. (samo kod Query)
Kada se table komponenta postavi na formu i podese joj se navedene vrednosti u Object Inspector-u, moe se svojstvom Active odrediti da li je tabela otvorena ili ne. Ako se ovo svojstvo postavi na true, Delphi pokuava da otvori tabelu. Ako se tabela uspeno otvori na formi se ak i prilikom dizajna vide podaci iz baze podataka u database komponentama. U sluaju neuspeha, dobija se
16
obavetenje o tome to znai da tabela ne postoji, ili je neko od svojstava postavljeno na pogrenu vrednost. Tabela se alternativno moe otvoriti pozivanjem metoda Open ili Close:
Procedure Form1. FormCreate (Sender: TObject); begin Table1. Open end
Na ovaj nain obezbeuje se automatsko otvaranje tabele im se kreira sama forma. Eksplicitno zatvaranje tabele na kraju izvravanja aplikacije nije potrebno, jer se ta radnja izvrava automatski. 4.3.1.1. Kretanje kroz tabelu Kada je komponenta tabele kreirana i tabela otvorena, samo jedan slog je trenutno aktivan. U poetku je to prvi slog tabele. Vrednosti polja do kojih se dolazi preko field komponenata uvek ukazuju na podatke tekueg sloga. Prebacivanje na sledei slog obavlja se pomou procedure Next, a na prethodni procedurom Prior. Skok na prvi slog tabele se vri procdurom First, a zadnji procedurom Last. Svojstva BOF i EOF se postavljaju na true kada je tekui slog prvi, odnosno zadnji u tabeli. Primer: deo programa koji prolazi kroz celu tabelu Kupac :
while not tKupac.Eof do begin //uraditi neto sa tekuim slogom tKupac.Next end;
Procedura MoveBy vri pomeranje za zadati broj slogova unapred ili unazad Primer:
tKupac.MoveBy (-3)
postavlja slog koji se nalazi 3 mesta pre tekueg za novi tekui slog. 4.3.1.2. Odreivanje sadraja polja Polja su u tabeli predstavljena nizom TField komponenti. Ovaj niz je smeten u Field svojstvu tako da se do vrednosti odreenog polja moe doi navoenjem tKupac.Fields(n).Value, pri emu je n redni broj polja u tabeli. Umesto rednog broja za odreivanje polja moe se koristiti naziv polja upotrebom metode FieldByName:
tKupac.FieldByName(NazivPolja).Value:=vrednost
4.3.1.3. Pretraivanje tabele Osim metoda koje omoguavaju pomeranje unapred i unazad za odreeni broj slogova u tabeli, postoje metode koje prolaze kroz slogove tabele traei prvi slog koji ispunjava neki uslov. Funkcija GotoKey trai prvi slog koji ispunjava zadati uslov i postavlja ga za tekui:
With tKupac do begin SetKey; FieldByName (ImeArtikla).AsString:=Vinjak rubin; 17
Tabela se postavlja u SetKey stanje i odreuju se vrednosti po kojima emo da traimo u tabeli. Rezultat izvravanja GotoKey metode je postavljanje tekueg sloga na prvi slog u tabeli koji ispunjava uslov. GotoKey metod se ponaa kao funkcija - ona vraa true ako je slog naen. U protivnom je false i tekui slog je i dalje onaj koji je to bio pre poziva metode. GotoNearest se koristi kao i GotoKey, osim to se za tekui slog proglaava prvi slog u kome je vrednost odgovarajueg polja vea ili jednaka traenoj vrednosti. 4.3.1.4. Promena vrednosti polja Promena tekueg sloga tabele se vri tako to se tabela postavi u Edit stanje pozivom procedure Edit, izvri dodela vrednosti slogovima i pozove procedura Post kojom se izmene ine konanim i upisuje promenjeni slog u tabelu:
Edit; FieldByName('ImeRobe').AsString:=Vinjak rubin 5; FieldByName('Jm').AsString:=fla; FieldByName('Kolicina').AsFloat:=0; FieldByName('NabCena').AsFloat:=210; FieldByName('ProdCena').AsFloat:=300; FieldByName('Dobavljac').AsString:=Rubin_Krusevac; Post;
Ako se umesto metode Edit upotrebi metoda Insert, nee biti promenjen tekui slog ve e se umetnuti novi slog sa zadatim vrednostima ispred njega. Posle izvrenja metode Post, tabela koja je bila u Edit ili Insert stanju vraa se u osnovno Browse stanje. Ako se umesto metode Edit upotrebi metoda Append, nee biti promenjen tekui slog ve e se umetnuti novi slog sa zadatim vrednostima na kraju tabele. Posle izvrenja metode Post, tabela koja je bila u Edit ili Insert stanju vraa se u osnovno Browse stanje. Metoda Cancel, ako se izvri pre konane potvrde metodom Post, ukida sve promene tekueg sloga i postavlja tabelu u Browse stanje. Primer dodatne provere pri upisu od strane programa:
Procedure Form1. BtnSnimiClick (Sender:TObject); begin // deo koda gde se poljima dodeljuju vrednosti If MessageDlg (Da li elite podatke,mtQuestion,mbOk,mbNo],0)=mrOk then Table1.Post else Table1.Cancel; end;
da
upiete
Ako elimo da se nova vrednost sloga upie, treba da pritisnemo taster OK. Tabela se u svakom trenutku nalazi u jednom od stanja definisanim svojstvom State. Najea su :
18
Oznaava da tabela nije otvorena. Tabela je otvorena i vrednosti se mogu itati. Moe doi do promene vrednosti polja upotrebom procedure Post. Upotrebom procedure Post ukljuuje se novi slog koji se umee pre tekueg Promene vrednosti polja se ne odnose na slog ve se zadaju vrednosti kljuevima. Svojstvo tabele filtered je postavljeno na true. Tabela je u procesu otvaranja. U toku je poziv dogaaja OnCalcFields.
Postoje jo par stanja koja su trenutna. Prebacivanje tabele iz jednog u drugo stanje se ne moe vriti promenom svojstva State, ve procedurama Edit, Insert i SetKey. Tabela se u stanja Inactive, Browse i CalcFields prebacuje automatski i ne postoje posebne procedure za prebacivanja u ova stanja. 4.3.1.5. Master - detail relacija To je odnos u kome se sadraj odreenog polja iz jedne tabele (engl. master table) koristi kao klju za izbor sloga iz druge tabele (engl. detail table). Tokom izvravanja aplikacije moe se definisati da je neka tabela detail, odnosno da njen tekui slog zavisi od sadraja nekog polja njene master tabele. Master tabela se odreuje svojstvom MasterSource, a kljuno polje (ili vie njih) po kome e se vriti pozicioniranje MasterFields. MasterSource sadri referencu na datasource komponentu koja ukazuje na master tabelu, dok se u MasterFields definiu nazivi polja odvojenih znakom (;).
DataSource1. TableName:= ulaz ; ... Ulaz1.MasterSource:=DataSource1; Ulaz1.MasterFields:= ifra_naloga;
Tabela ulaz sadri podatke o nalozima (ifra naloga, datum, dobavlja,...) za svaki nalog po jedan sloga tabela ulaz1 sadri stavke naloga (ifra naloga, ime artikla, koliina, nabavna cena,...) za svaki nalog jedna ili vie stavki. Ovim kodom smo povezali ove dve tabele, tako da kretanjem kroz tabelu ulaz automatski se kreemo i kroz tabelu ulaz1 (ne moramo da piemo procedure za pretraivanje obe tabele ve samo jedne, i kad naemo traeni nalog, automatski smo pronali i stavke vezane za taj nalog). Master - detail odnos se moe definisati i tokom dizajniranja, samo postavimo date vrednosti u odreena svojstva.
19
tRoba je u ovom sluaju objekat tipa TTable koji predstavlja tabelu Roba. Svojstvo FieldByName vraa field zadatog naziva. Svojstvo AsString pretvara prodajnu cenu (tipa real) u itljivi string, koji se moe ispisati u edit boksu Edit2.
Sledi spisak svojstava koji poseduje svaki field objekat sa objanjenjem njihovih namena: Odreuje da li se sadraj polja u database Aligment Calculated
komponenti prikazuje poravnat u levo, udesno ili centrirano. Odreuje da li je polje sraunato. U sluaju da je ovo polje postavljeno na false, polje nije sraunato. Moemo programski da pravimo sraunata polja; na primer napravimo polje iznos koje je jednako polju koliina*Cena i koristimo ga kao da to polje postoji u bazi (automatski se izraunava za svako polje u bazi). Procedure Form1.Table1CalcFields (DataSet: TDataSet); begin With Table1 do Iznos.Value:=Koliina.Value * Cena.Value
20
end; Odreuje da li se sadraj polja prikazuje kao novana vrednost. Table ili query komponenta kojoj field pristupa. Veliina podatka u bajtovima. Tip podataka. Natpis koji se ispisuje kao naziv kolone kod korienja Database grid-a. String koji se ispisuje u database komponenti. irina polja (u broju karaktera) koji se koristi da odredi irinu elije u sluaju korienja grid komponenti. Maska koja se koristi za unos sadraja preko database komponenti. Moemo napraviti masku za unos datuma, celog broja, samo slova, samo broj sa odreenim brojem cifara, novano polje itd.. Naziv polja u tabeli. Redni broj polja u tabeli, odnosno u nizu field objekata. Trenutna vrednost polja Odreuje da li se sadaj polja moe samo itati.
drugih sistema za otvoreno povezivanje baza podataka (engl. Open Database Connectivity, ODBC) ili udaljenih SQL servera. Znai bez obzira kojoj bazi podataka prisupate moete koristiti sve komponente koje Delphi nudi i u najveem broju sluajeva ne morate menjati kod ili se izmene koda svode na promenu par redova.
22
Meutim da bi se veza sa bazom podataka ostvarila, BDE mora biti instaliran na raunaru koji koristi ove komponente. Prilikom instalacije Delphija automatski se instalira i BDE tako da je pravljenje baza odmah mogue. Kada je program zavren, nije dovoljna samo .EXE datoteka da bi se program izvravao na svakom raunaru ve se mora instalirati i BDE (tj negde oko 10 MB za potpunu instalaciju BDE-a). Pomoni program BDE Configuration Utility je deo BDE i samim tim i Delphija. Njime moemo podeavati razne parametre rada BDE biblioteke, kao to je npr. spisak podranih tipova baza podataka i spisak definisanih alijasa,... ALIAS je proizvoljan naziv koji dodeljujemo bilo kom direktorijumu na disku. Prilikom kreiranja i korienja programa, umesto da za poziciju baze podataka navodimo direktorijum, dovoljno je navesti njegov alias definisan u BDE konfiguracionom fajlu. Ako se pozicija podataka promeni, dovoljno je promeniti definiciju alijasa da bi mesto gde se nalazi BP bilo locirano bez potrebe da se menja i ponovo kompajlira sam program.
23
BDE je dosta brz. Evo nekih poreenja koje sam uspeo da nabavim (tabela 1 i tabela 2). Za poreenje korienja je tabela koja sadri polja : Ime, prezime, telefonski broj i adresu. Telefon je integer (celobrojnog) tipa a sva ostala polja su character (tekstualnog) tipa.
Broj slogov a Delph i Upis 100 1000 2000 3000 4000 2 16 33 50 67 VB Delphi VB Delphi VB Delphi VB
itanje 0 6 12 17 23
itanje 1 23 46 69 77
Sortiranje 0 1 4 8 15
Ukupno
2 23 49 75 105
Ukupn o
3 115 271 485 668
Tabela 1. Poreenje brzine Visual Basica i Delphija pri radu sa bazama podataka Operacija Upotreba Query-ja za itanje 20000 slogova iz tabele. podrazumeva se i traenje i filtriranje slogova. Upis sloga Filtriranje 20000 slogova Traenje vrednosti u tabeli sa 20000 slogova Auriranje sloga Delphi 4.6 PowerBuilder 70.9
Tabela 2. Poreenje Delphija i PowerBuildera pri radu sa bazama podataka (vrednosti su u sekundama)
24
5. OPIS PROBLEMA
5.1. ZADATAK
U praktinom delu rada projektovana je Windows aplikacija razvijena u Delphi okruenju, koja praktino realizuje prethodno opisani problem rada sa bazama podataka. Zadatak je bio realizovati datu aplikaciju koja radi sa bazama podataka na lokalnom disku i koja e obuhvatiti zahteve kao to su unos podataka preko maske za unos, auriranje baza podataka, traenje kroz bazu, pregled i tampanje izvetaja. Jedinstveni direktorijum gde se tabele nalaze, definisan je preko aliasa 'diplomski' u programu BDE Configuration Utility. Korisnik ne mora da poznaje strukture tabela, mada ima mogunost njihovog pregleda. Aplikacija se koristi se za voenje evidencije artikala u nekoj firmi. To bi u najkraim crtama bio opis aplikacije.
25
U ovoj formi se vri unos novog artikla. Unesemo potrebne podatke i pritisnemo dugme Snimi. Ako ne elimo da snimimo, pritisnemo dugme Nazad. Kod za snimanje ovih podataka u tabelu izgleda :
procedure TfUnosRobe.BtnSnimiClick(Sender: TObject); var kraj : boolean; i : integer; begin with baze.tRoba do if ((Length(EditImeRobe.Text)>0) and (Length(ComboBoxDobavljac.Text)>0)) then begin SetKey; //preraga tabele da li sluajno ve postoji artikal sa tim imenom FieldByName('ImeRobe').AsString:=Trim(EditImeRobe.Text); FieldByName('NabCena').AsFloat:=StrToFloat(Trim(EditNabCena.Text)); if GotoKey then begin MessageDlg('Vec postoji takav artikl!', mtInformation, mbOk], 0); Exit; end; // snimamo u bazu Append; //dodavanje novog sloga (praznog pa ga napunimo sa podacima) FieldByName('ImeRobe').AsString:=Trim(EditImeRobe.Text); FieldByName('Jm').AsString:=Trim(EditJm.Text); 26
FieldByName('Kolicina').AsFloat:=0; FieldByName('NabCena').AsFloat:=StrToFloat(EditNabCena.Text); FieldByName('ProdCena').AsFloat:=StrToFloat(EditProdCena.Text); FieldByName('Dobavljac').AsString:=Trim(ComboBoxDobavljac.Text); FieldByName('Ambalaza').AsString:=Trim(ComboBoxAmbalaza.Text); FieldByName('ImeTipa').AsString:=Trim(UpperCase(ComboBoxTip.Text)); Post; // upis u bazu ObrisiEdite; //brisanje svih podataka iz vizuelnih komponenti koje smo uneli end else MessageDlg('Unesite ime robe i ime dobavljaca',mtInformation,mbOk],0); end;
1. Funkcija StrToFloat vri pretvaranje tipa string u tip real. 2. Funkcija Trim eliminie blanko znake na poetku i na kraju stringa 3. Funkcija UpperCase pretvara sva slova u velika. Tabela Roba ima sledea polja : Ime polja ImeRobe Jm NabCena ProdCena Koliina Dobavlja ImeTipa Ambalaa Tip
Character 30 Character 3 Number Number Number Character 30 Character 15 Character 15
Opis polja
Naziv artikla Jedinica mere (fla, kom, lit,...) Nabavna cena artikla Prodajna cena artikla Stanje artikla na lageru Ime dobavljaa datog artikla Tip artikla : Slatki, pivo, rakija,... Vrsta ambalae : Kisela voda, pivo, sok,...
Primarni klju je ImeRobe i on je jedinstven u tabeli. Na osnovu njega vrimo pretraivanje po tabeli.
27
Slika 7. Forma za unos ulaznog naloga Korisitimo dve tabele za smetanje podataka : Tabela Ulaz (opti podaci naloga) ima sledea polja : Ime polja Tip Opis polja Character ifra naloga Broj Datum Datum_pl
15 Date Datum stvaranja naloga Datum kada nalog stie za naplatu 28
Date
Naziv
Character 15
Ime dobavljaa
Tabela Ulaz1 (stavke naloga) ima sledea polja : Ime Tip Opis polja polja Character ifra naloga Broj ImeRobe NabCena Koliina
15 Character 30 Number Number Naziv artikla Nabavna cena artikla Koliina koju smo kupili
29
Na sledeoj strani sledi deo koda koji formira SQL upit za prikaz podataka. Ovaj deo koda se izvrava kada pritisnemo dugme Pokai.
30
procedure TfKartica.BtnPokaziClick(Sender: TObject); var s,s1,s2,s3 : string; begin s:='';s1:=''; ComboBoxDobavljac.Text:=Trim(ComboBoxDobavljac.Text); if RBDobavljaci.Checked then s:='KarticaD' else s:='KarticaK';// da li radimo sa dobavljaima ili kupcima ShortDateFormat:='mm/dd/yyyy'; // datum u bazi se nalazi u obliku mm/dd/gggg s1:=' and datum>= '+''''+DateToStr(DatumOd.date)+''''+' and datum<= '+''''+DateToStr(DatumDo.date)+''''; ShortDateFormat:='dd/mm/yyyy'; with Baze.Query2 do begin //formiraj SQL upit SQL.Clear; //obrii ako je neto bilo upisano SQL.Add('select datum, broj, iznosD, iznosP, SUM(IznosD) as D, SUM(IznosP) as P); SQL.Add(from '+s); SQL.Add('where naziv='+''''+ComboBoxDobavljac.Text+''''+s1); SQL.Add('order by datum'); // da bude sortirano po datumu end; Open; end; end;
and
Upit Query2 (sa njim stupamo u vezu sa bazom KarticaK) je povezan sa komponentom DataSource_Query2 (povezuje pristup bazi sa komponentama za vizuelni prikaz), a ova komponenta je povezana sa Database Grid (tabela koju vidimo na formi) komponentom preko svojsva DataSource i rezultat naeg upita vidimo na ekranu. Tabela KarticaK (odnosi se na Kupce) sadri sledea polja : Ime polja Tip Opis polja Date Datum zaduivanja Datum Character 30 Ime kupca Naziv Number Dugovanje kupca IznosD Number Potraivanje kupca IznosP Character 10 ifra naloga na koji se odnosi Broj
dugovanje/potraivanje
31
Tabela KarticaD (odnosi se na dobavljae) je istovetna tabeli KarticaK (samo polje Naziv predstavlja ime dobavljaa). Ne postoji primarni klju, jer je mogue da se neki dobavlja zadui dnevno vie puta za robu.
32
33
7. ZAKLJUAK
U prvom delu rada je dat kratak opis programskog jezika Delphi, to je uvodno poglavlje za drugi deo rada koji se odnosi na rad sa bazama podataka. Kod prouavanja drugog dela rada potrebno je posedovati odgovarajue znanje, kako o programskom jeziku Delphi i pisanju prostijih aplikacija u njemu, tako i o objektnom programiranju uopte. Praktina implementacija je izraena u Delphi 5.0 razvojnom okruenju, koje se veoma dobro pokazalo za realizaciju ove aplikacije. Model ove aplikacije je primenjiv kod realizacije mnogih problema koji se oslanjaju na rad sa lokalnim bazama podataka iji su podaci tabelarno organizovani, a to je najee kod voenja nekih evidencija. Proirenje ovog modela programa moe se ostvariti dodatnim procedurama i protokolima koji bi omoguili komunikaciju sa udaljenim serverom na kome je smetena baza podataka. to se tie zauzea mesta na hard disku istestirao sam program i to tako to sam uneo 10000 ulaznih i 10000 izlaznih naloga u proseku sa 4 stavke po nalogu i dobio sledei rezultat : Ime tabele Ulaz Ulaz1 Izlaz Izlaz1 Broj slogova u tabeli
10,000 40,000 10,000 40,000
Sve ostale tabele zauzimaju mnogo manje mesta na disku. Koristei program za arhiviranje WinRar, spakovao sam tabele i dobio datoteku veliine : 416 KB. Znai kompresovali smo datoteke veliine 8,7 MB na 400KB, to je kompresija od oko 20 puta i ini backup baze podataka vrlo pogodnim (ak moemo i disketu koristi za backup baza podataka). Delphi je izuzetno jak programski jezik za razvoj programa koji rade sa bazama podataka. Mogue je koristiti kako za rad sa lokalnim bazama podataka, tako i za rad sa bazama na udaljenim serverima. Brzina rada sa bazama je odlina, zahvaljujui BDE-u. Pored toga ne postoji ni jedan problem koji se ne moe reiti u Delphiju. Moe se pisati i ist API kod ako je potrebno, presretati poruke Windows operativnog sistema pre Delhpija i sami ih obraivati, koristiti ActiveX kontrole, DLL datoteke, i sve ostalo to se koristi u drugim jezicima. Kod nas se na primer Delphi koristi za rad sa evidencijom lanova na PTT provajderu, u kombinaciji sa ORACLE-om. Izuzetno je lak za poetnike koji se prvi put sreu sa Windows programiranjem. Znai u Delphiju moete uraditi ta god Vam padne na pamet i to za mnogo krae vreme nego u drugim programskim jezicima. Ja ga toplo preporuujem svima.
34
8. Literatura
Osnovi raunarske tehnike, Dr. @ivko Toi, uperak plavi, Ni 1994.g. Programski jezik Pascal, Duan Toi, Ivan Stojmenovi, Nauna knjiga, Beograd 1989.g. Delphi punom snagom, Charles Calvert, Computer Equipment and Trade, Beograd Nauite Delphi za 21 dan, Kent Reisdorph, Kompjuter biblioteka, aak, 1999.g. Delphi 2 unleashed, grupa autora, Sams publishing, United States, Foundations of Delphi development for Windows 95 www.borland.com www.cabb.com/d www.cs.monash.edu.au/vtran e-mail-ovi koja sam dobio od raznih ljudi koji se bave programiranjem u Delphiju
35