Škola Accessa
predavač: Branislav Mihaljev

Bookmark and Share
Matična strana sajta
  Novo na sajtu
  Mapa sajta
  Beleške
  Kontakt
  Pretraga MSKB

 Blog Praktikuma
  RSS feed
  P@W @Tw

  Izvezi stranicu u PDF
 
Škola Praktikuma

Škola Accessa
 


Skoro svakodnevno slušamo
  Radio Paradise:
  eklektični muzički online radio bez reklama!
 

 
       

Sponzori sajta

SBB CS 1.6 game server: 82.117.200.1
 
Connectivity by SBB

 


 

Informacije

NOVOSTI

I još dva nova priloga o Excelu
Novi prilozi o Wordu
Novi i prilozi u temi "razno o Officeu"
Novi članci o novostima u Officeu 2010!

SADRŽAJI ZA PREUZIMANJE

Lokalizacija Total Commandera 7.51Obe jezičke školjke za popularni program na srpskom sad funkcionišu u bilo kojoj varijanti Windowsa!
RNDalica.ExcelDodatak za Excel 2007/2010 za generisanje slučajnih podataka!
YuConv.ExcelDodatak za Excel 2007/2010 za konverziju pisama!
YuConvNetDodatak za Word 2007/2010 za konverziju pisama i kodnih rasporeda!

SKREĆEMO PAŽNJU

Kako pretraživati MSKB
a pronaći ćete i još mnogo novih sadržaja...

KONTAKT

Da li znate za pravila koja važe pri kontaktu sa nama? Molimo vas da se obavestite o tome!
 
POZIVAMO VAS

i prenesite svoja iskustva. Najbolji prilozi će biti objavljeni.

  (C) 2000-2010 Praktikum na Webu
 

Čas 10 - Izvršni moduli aplikacije

Centralni 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.

(*) SQL je skraćenica za Structured Query Language - struktuirani upitni jezik. SQL je razvila firma IBM i on je predstavljao jezik za postavljanje upita nad bazama podataka koje su se nalazile na velikim računarima. Danas je SQL jezik za postavljanje upita nad bazama podataka (misli se na baze podataka generalno, bez obzira na lokaciju), a u Accessu on može biti predstavljen i kao standardni Query (upit).

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:

Klikni za punu sliku

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:

     Klikni za punu sliku

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:

SELECT [Citaoci].[ID_Citalac], [Citaoci].[Prezime_ime]
FROM Citaoci;

Postavimo i vrednost ostalih osobina:

Column Count = 2
Column Widths = 1cm; 2cm
Limit To List = Yes

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:

SELECT [Knjige].[ID_Knjiga], [Knjige].[Naslov],
[Knjige].[Status] FROM Knjige
WHERE ((([Knjige].[Status])<>"i"));

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 podformom

Vratimo 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:

Klikni za punu sliku

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:

Klikni za punu sliku

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:

Klikni za punu sliku

Događaji i programi na modulu

Poslednji korak u kreiranju izvršnog modula je pisanje VBA programa za odgovarajuće događaje.

1. događaj - učitava se izvršni modul aplikacije

Postavlja 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:

Private Sub Form_Open(Cancel As Integer)
  Me.Filter = "((Dat_vr Is Null))"
  Me.FilterOn = True
End Sub

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:

Private Sub Prezime_ime_AfterUpdate()
  sfrmCitaoci.Requery
End Sub

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:

Private Sub ID_Knjiga_AfterUpdate()
  sfrmKnjige.Requery
  Dat_izd = Date
End Sub

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:

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Dim Odgovor As Integer

  Odgovor = MsgBox("Zapisivanje promene?", vbYesNo, "Promena!")

  If Odgovor = 6 And IsNull(Dat_vr) Then
      Status = "i"
      Exit Sub
  ElseIf Odgovor = 6 And Dat_vr <> "" Then
      Status = "u"
  Else
      Cancel = True
      Me.Undo
  End If

End Sub

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:

Private Sub Form_AfterUpdate()
  Me.Refresh
  Me.Filter = "((Dat_vr Is Null))"
  Me.FilterOn = True
End Sub

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štaj

Izveš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:

Private Sub SveKnjige_Click()
  DoCmd.OpenReport "rptPregledSvihKnjiga", acViewPreview"
  Reports!rptPregledSvihKnjiga.Label2.Visible = True
  Reports!rptPregledSvihKnjiga.Label1.Visible = False
  DoCmd.Maximize
End Sub

Zatim selektujmo taster Pregled izdatih knjiga i postavimo program u događaj OnClick:

Private Sub IzdateKnjige_Click()
 DoCmd.OpenReport _
   "rptPregledSvihKnjiga", acViewPreview, , "([status] = 'i')"
 Reports!rptPregledSvihKnjiga.Label2.Visible = False
 Reports!rptPregledSvihKnjiga.Label1.Visible = True
 DoCmd.Maximize
End Sub

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 napomene

Priznajem 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:

1. U tabeli knjiga dodati jednu kolonu u koju bi program zapisivao identifikacioni broj čitaoca, kada čitaoc preuzme knjigu, odnosno ova vrednost bi se brisala kada bi čitalac vratio knjigu. Neophodno je postojanje i treće tabele u kojoj bi se beležile sve promene (ID čitaoca, ID knjige i datum promene) ili

2. Uvesti dodatnu tabelu kao pod 1) i samo u njoj beležiti promene. Izvršni modul bi morao stalno da pretražuje ovu tabelu i gleda za poslednji datum da li je knjiga raspoloživa ili nije.

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.

 Datoteka cas10.zip (140 kb) Možete preuzeti spakovanu datoteku baze Bibl_10.MDB sa razrađenim primerom (veličina ZIP datoteke je 140 kB), ako vam je ovaj deo do sada poznat ili ako vam vežba negde zapne.

REZIME ČASA 10

Poslovi 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

 

  (C) 2000-2010 Praktikum na Webu

23. mart 2001.


 
 

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.