|
Škola Accessa |
|
|
Čas 10 - Izvršni moduli aplikacijeCentralni deo aplikacije je modul za izdavanje i vraćanje knjiga. Na ovom času ćemo kreirati jedan jednostavan izvršni modul aplikacije uz komentare na način rada i izmene koje bi doprinele funkcionalnosti. Aplikacija može imati jedan ili više izvršnih modula, gde pod "izvršnim modulom" smatramo (u našem slučaju) formu koja operiše podacima iz više tabela ostvarujući interakciju između njih. Konkretno, tabele Knjige i Citaoci će preko ovog modula ostvariti vezu, a kako su to jedine dve tabele koje ostvaruju vezu, imaćemo samo jedan izvršni modul. U slučaju da imamo tri entiteta koja treba povezati (npr. kupci, dobavljači i isporučioci) imali bi najmanje dva izvršna modula. Šta bi izvršni modul u stvari trebao da radi? Kao osnovno, treba da omogući unos inventarskog broja knjige, šifre potrošača i datuma izdavanja, odnosno vraćanja knjige. Pri izdavanju, treba da postavi oznaku u Status knjige da je knjiga izdata, kako se ona ne bi pojavljila ponovo u listi tj. da ne bi greškom mogli jednu knjigu da izdamo dva ili više puta bez da je prethodno vraćena. Takođe, kada knjiga bude vraćena, treba oznaku knjige u polju Status vratiti na prethodnu, tako da program zna da je knjiga ponovo raspoloživa. Modul treba da obezbedi da se po unošenju šifre čitaoca i inventarnog broja knjige na ekranu prikažu puni podaci za čitaoca i knjigu (ovo se rešava pomoću podmaski - podformi, što ćemo kasnije videti). Potrebno je obezbediti se od grešaka; modul pre svakog upisa treba da postavi kontrolno pitanje da li se podaci zapisuju ili se odustaje od upisa u slučaju da je operater greškom uneo podatke. Kreiranje modula (forme)Pređimo na karticu formi i kreirajmo novu formu. Otvorimo karticu osobina (Properties) za ovu formu. Za Record Source upišimo sledeću SQL (*) strukturu:
SELECT [Poslovanje].[ID_Zapis], [Knjige].[Status],
[Poslovanje].[Dat_izd], [Poslovanje].[Dat_vr],
[Poslovanje].[ID_Citalac], [Poslovanje].[ID_Knjiga]
FROM Knjige
RIGHT JOIN (Citaoci RIGHT JOIN Poslovanje ON
[Citaoci].[ID_Citalac]=[Poslovanje].[ID_Citalac]) ON
[Knjige].[ID_Knjiga]=[Poslovanje].[ID_Knjiga];
Napomena: sintaksa SQL komande dopušta ispisivanje u jednom ili više redova, svejedno je. Pisanje ključnih reči velikim slovima je konvencija uzvojena radi lakšeg čitanja i predlažemo da je se pridržavate.
Na levoj strani Record Source postoji jedan mali taster sa tri tačkice na sebi. Klikom na njega otvara se klasičan Accessov upit koji grafički reprezentuje SQL naredbu: Na ovaj način smo kreirali prvi upit. Iako idemo "od nazad" na upite ćemo se kasnije vratiti. Iz liste polja upita (slika dole levo) prevucimo polja na formu i rasporedimo ih kao na slici dole desno: Na slici su polja ID_zapis i Status sive boje, jer je osobina Enabled postavljena na False. To znači da korisnik neće moći da pristupa ovim poljima i da u njih neće moći da unosi i menja podatke. Za polje ID_zapis koje je tipa AutoNumber, promena podataka je nemoguća i nema smisla čak i ako je ovom polju dozvoljen pristup. Kako smo već rekli, AutoNumber je brojač, koji automatski inkrementira svoju vrednost po svakom unosu, a nama služi za numeraciju naših unosa. Status označava status knjige i ovo polje ćemo iskoristiti za "označavanje" knjige: da li je knjiga izdata (vrednost polja "i"), da li je knjiga raspoloživa za izdavanje ("u") itd. Status će Access sam popunjavati, zavisno od unosa podataka na izvršnom modulu. Pritisnimo desnim tasterom miša na polje ID_Citalac i iz skraćene liste za ovo polje pređimo na Change to i selektujmo vrednost Combo Box: Combo polje je u našem slučaju praktičnije od običnog tekst-polja, jer ono može sadržati listu podataka iz koje biramo vrednost. Ovu listu možemo ograničiti, tako da korisnik ne može uneti bilo koji broj čitaoca, već samo tačno onaj koji postoji u tabeli Citaoci. Ovim se ujedno obezbeđujemo od unosa pogrešnih podataka za čitaoca. Za Row Source ovog polja postavimo sledeću SQL strukturu:
Postavimo i vrednost ostalih osobina:
Probajmo formu kako radi: otvorimo je u prikazu za unos i izmenu podataka, pređimo na polje ID_Citalac i pritisnimo taster F4. Otvara se padajuća lista sa šifrom čitaoca i njegovim imenom i prezimenom. Operater može samo ukucuti šifru čitaoca ili je može izabrati iz liste kretajući se kurzorima po njoj i pritiskanjem tastera ENTER za potvrdu izbora: Učinimo isti postupak za ID_Knjiga, s tim da će se SQL struktura razlikovati:
Kriterijum <>"i" postavlja filter na ovo polje tako da će biti prikazane samo one knjige kod kojih vrednost polja Status nije "i" (knjiga Izdata). Zatvorimo glavni modul i snimimo ga pod nazivom frmPoslovanje. Podforma (podmaska ili podobrazac)Podforme su klasične forme koje se "ugnežđuju" u glavnu formu (Master) i vezane su sa njom preko određenog kriterijuma. Obično služe za prikazivanje dodatnih podataka o nekom pojmu koji se šturo pojavljuje kroz šifru na glavnoj formi. Na našem glavnom modulu se pojavljuju šifre za čitaoca i inventarni broj knjige kroz dva broja, što ne govori mnogo o čitaocu i knjizi. Podforma se isprva kreira kao obična forma i zatim se postavlja na glavnu formu. Kreirajmo jednu praznu formu, za Record Source postavimo tabelu Citaoci i sva polja prevucimo iz liste polja (Field List) na formu. Selektujmo sva polja i postavimo osobinu Enabled = False. Podforma za čitaoce će sada imati izgled sličan izgledu na slici: Nju snimimo pod imenom sfrmCitaoci. Kreirajmo zatim i podformu za knjige po istom postupku, s tim da će Record Source u ovom slučaju pokazivati na tabelu Knjige: Podformu za knjige snimimo pod imenom sfrmKnjige. Forma sa podformomVratimo se na dizajn izvršnog modula. Iz palete alatki Tools pronađimo taster za umetanje podformi (ili podizveštaja - i izveštaji mogu imati podizveštaj) i kliknimo ispod podataka na glavnoj formi, na mesto gde želimo da postavimo podformu. Iz liste koja će nam pomoći da odaberemo podformu koju postavljamo odaberimo postojeći sfrmCitaoci: Na sledećem ekranu imamo mogućnost da definišimo preko kog podatka će se biti povezane glavna forma i podforma. Kliknimo na opciju Define My Own i postavimo vrednosti prema slici, biranjem iz padajućih lista: Pritisnimo zatim taster Finish. Ovom procedurom smo obezbedili da podforma na osnovu broja čitaoca prikazuje njegove potpune podatke. Interesantan podatak za čitaoca je datum plaćanja članarine što se može videti iz podforme, pa operater može upozoriti čitaoca da njegova članarina ističe. Na glavnoj formi ćemo postaviti i drugu podformu za knjige istim postupkom, vodeći računa da forme budu povezane preko polja ID_Knjiga. Izvršni modul aplikacije će na kraju imati konačan izgled nalik ovome: Događaji i programi na moduluPoslednji korak u kreiranju izvršnog modula je pisanje VBA programa za odgovarajuće događaje. 1. događaj - učitava se izvršni modul aplikacijePostavlja se filter na datum vraćanja knjige. Sakrivaju se svi oni zapisi gde ovaj datum nije prazno polje. U događaj OnOpen glavne forme postavljamo sledeći program:
2. događaj - operater je promenio vrednost polja 'ID_Citalac'Podforma sfrmCitaoci mora pri tome da pokaže ostale podatke za čitaoca čiji se broj nalazi u polju ID_Citalac glavne maske. U događaj AfterUpdate postavljamo sledeći programski red:
AfterUpdate aktivira program nakon što se izmeni vrednost polja ID_Citalac i podforma će prikazati ostale podatke za čitaoca. Naredba Requery nalaže da se ponovo izvrši SQL upit postavljen nad kombo-poljem, tako da budu prikazani potrebni podaci. 3. događaj - operater je promenio vrednost polja 'ID_Knjiga'U događaj AfterUpdate kombo-polja ID_knjiga postavljamo sledeći programski kod:
Podforma zatim prikazuje ostale podatke za knjigu čiji broj smo ukucali u ID_Knjiga. Istovremeno u polje za datum izdavanja se postavlja tekući datum. 4. događaj - operater je popunio sve podatke i prelazi se na drugi slog (pre prelaska)Program postavlja kontrolno pitanje i upozorava operatera da proveri podatka i zatim potvrdi zapis ili odustane od unosa sloga u bazu. U događaj BeforeUpdate glavne forme postavljamo sledeći program:
U program uvodimo pomoćnu promenljivu Odgovor čiju vrednost ćemo ispitati (If Odgovor = ...). Deklarišemo je kao Integer da bi mogla da "pamti" brojčanu vrednost. Odgovor dobija vrednost u zavisnosti od odgovora korisnika na postavljeno pitanje (MsgBox) koje može biti dvojako - ili vbYes (kód za vbYes je vrednost 6) ili vbNo. U slučaju da je knjiga izdata (polje Dat_vr je prazno) zapisuje se slog u bazu, inače se proverava da li je polje Dat_vr popunjeno. Ako je odgovor na pitanje No, izvršava se program iza Else gde se poništava unos (Cancel = True) i gde se brišu popunjena polja (Me.Undo) 5. događaj - operater je popunio sve podatke i prelazi se na drugi slog (nakon prelaska)Potrebno je podforme postaviti tako da budu prazne (pošto su polja za knjigu i čitaoca za sada prazna) i ponovno filtrirati sve zapise tako da se prikazuju samo oni gde je polje za datum vraćanja knjige prazno. U događaj AfterUpdate glavne forme postavljamo:
Ovo je pet osnovnih događaja koji su neophodno da bi izvršni modul mogao da radi. Neki od ovih modula možemo proširiti sa npr. ispitivanjem broja dana od dana uplate članarine i izdavanjem odgovarajuće poruke kada se dan za obnovu članarine približi na neku razumnu vrednost (recimo 14-tak dana pre isteka). Ovaj glavni modul valja testirati na sve moguće događaje i pri tome potražiti eventualne greške ili neželjena ponašanja, jer ovde greške jednostavno ne sme da bude. Konačno snimamo i zatvaramo modul. Na komandnoj tabli ćemo pridružiti
odgovarajući kratak programski red, tako da se izvršnom modulu može pristupi
(pogledajte prethodni čas Filtriran izveštajIzveštaj rptPregledSvihKnjiga možemo iskoristiti za prikazivanje samo izdatih knjiga. Pre nego što to učinimo modifikovaćemo postojeći izveštaj: otvorimo ga u režimu izmene dizajna, selektujmo polje u kome piše Pregled svih knjiga, pritisnimo CTRL+C i odmah zatim CTRL+V. Novo-dobijenoj labeli promenimo tekst tako da glasi Pregled izdatih knjiga i zadajmo joj naziv (Name) Label1. Snimimo i zatvorimo izveštaj. Vratimo se kontrolnu tablu u režimu izmene dizajna, selektujmo taster Pregled svih knjiga i promenimo program u događaju OnClick tako da glasi:
Zatim selektujmo taster Pregled izdatih knjiga i postavimo program u događaj OnClick:
Snimimo formu i pogledajmo šta se dešava pritiskanjem jednog od ova dva tastera. Neiskusniji korisnici bi napravili dva potpuno ista izveštaja sa jednom jedinom razlikom - u nazivu izveštaja. Ovim se gubi na prostoru, objekti se gomilaju i otežavaju snalaženje i konačno, gubi se na brzini rada. Ova tehnika demonstrira kako se jedan izveštaj može iskoristiti za prikazivanje dve ili više grupe podataka postavljanjem filtera i menjanjem "vidljivosti" naslova izveštaja. Dodatne napomenePriznajem da sam napravio grešku prilikom osmišljavanja aplikacije - izveštaj smo nazvali rptPregledSvihKnjiga a trebalo je samo rptPregledKnjiga. Greška nije strašna i da se lako ispraviti. Prvo se promeni naziv izveštaja i zatim se u modulima potraži stari naziv i zameni novim. Ako je funkcija Perform name AutoCorrect iz menija Tools/Options uključena, verovatno će Access sam to uraditi za vas. Ovde moram napomenuti da ovu funkciju isključite i ipak to ručno uradite, jer kada se ona aktivira svaki izveštaj gubi podešavanja u smislu promene margina i orijentacije papira drugačijih od osnovnih vrednosti. Ovo je poznata greška Accessa u verziji 2000. Ako koristite Access 97, nemate ovu brigu, ali imate dodatnog posla, jer automatska promena imena modula ne postoji u toj verziji. U Accessu 2002 (sudeći prema beta verziji koju smo nedavno testirali) ova greška je ispravljena i funkcija radi ispravno. Glavni modul, odnosno izvršni modul aplikacije demonstrira jedan način kako može da radi deo programa za izdavanje i vraćanje knjiga. Ovim načinom rada se ne prati istorija izdavanja knjiga i istorija čitaoca, što mogu biti interesantni podaci. Odabrao sam rešenje koje nije najbolje, ali mi se čini najjednostavnije i za učenje najbrže. Način organizacije ovog modula može biti sasvim drugačiji:
Na sledećem času ćemo obraditi preostala dva tastera na komandnoj tabli (Pregled dužnika i Kompresija i arhiviranje baze) i preći ćemo na uređenje programa i uklanjanje nepotrebnih menija i tastera.
REZIME ČASA 10Poslovi koje smo pretresli na ovom času predstavljaju tipični skup aktivnosti oko uređenja "jezgra" programa. Pozabavili smo se SQL upitima; uveli smo pojam podforme i prikazali kako se ona pravi; napravili smo analizu realnih događaja i programirali svaku varijantu. Naša aplikacija se ovim bližila prvoj "pravoj" funkciji, pošto se već u ovoj fazi može pustiti u probni rad, kako bismo krenuli u popunu podataka. Čas 11 - Dodatno uređenje programa
|
|
Vrh stranice Prethodna stranica Naslovna strana Mapa sajta Pretraga |
| AFORIZAM ZA DANAS | OVIH DANA SLUŠAMO... |
| Copyright © Praktikum na Webu, 2000-2010; Valinor Design; sva prava pridržana. |