To su sve ispravni zahtevi i neke od njih cemo pomenuti. Svrha teksta je da oni koji dosta znaju o Accesu probaju jedan novi metod. Za pocetnike je nivo previsok, ali ne smeta da se posmatra.
Da se vratimo poslu.
1. Dodajmo tabelu Registratori {BrojRegistratora, Sadrzaj} PK (BrojRegistratora), povezati sa tabelom PracenjePromenaStanja, ovako:

2. U tabelu PracenjePromenaStanja dodajmo kolonu StariTrenutakPrelaza, datetime. To je trenutak kada je u registrator usao u prethodno stanje. Sada ce predikat za novu tabelu izgledati ovako:
Registrator [BrojRegistratora] presao je u novo stanje [NovoStanje] u trenutku [TrenutakPrelaza]
iz starog stanja [PrethodnoStanje] u koje je presao u trenutku [StariTrenutakPrelaza].
Komplikovano, zar ne? Jeste, ali takav je zivot

Popunjena tabela izgleda ovako, sortirano po (BrojRegistra, TrenutakPrelaza):

Primetite da se podaci ponavljaju. Za sve redove osim prvog vidi se da
1) PrethodnoStanje postoji u prethodnom redu u koloni NovoStanje
2) STariTrenutakPrelaza postoji u prethodnom redu koloni TrenutakPrelaza
Ovo znaci da bismo mogli da postavimo FOREIGN KEY (BrojRegistra, StariTrenutakPrelaza, StaroStanje)
REFERENCES PracenjePromenaStanja (BrojRegistra, TrenutakPrelaza, NovoStanje). Ovo znaci veza tabele sama na sebe, gde je roditelj prethodni red a dete je posmatrani red, ovako nekako:
Problem je sto ovo ne mozemo da uradimo iz dva razloga:
1) jer pocetni red nema roditelja.
2) treba nam UNIQUE PracenjePromenaStanja (BrojRegistra, TrenutakPrelaza, NovoStanje)
Resenja:
1) pocetni red ce imati ropditelja ako vrednosti za prethodno stanje i novo stanje i trenuci prelaza budu identicni. Za tako nesto nam treba novi dozvoljeni prelaz, Iz stanja 'Na polici' u stanje 'Na polici'. Pocetni rekord imace dakle NovoStanje=StaroStanje='Na polici'. Ako unesemo neki dovoljno daleki datum u proslosti, imacemo teorijski pocetni rekord za sve registratore. Odatle je lako dodati stvarni pocetni rekord, drugi fizicki, - neki registratori su izdati, neki su na polici, neki su odavno arhivirani....

2) Napravimo UNIQUE index (BrojRegistra, TrenutakPrelaza, NovoStanje). I dalje je (BrojRegistra, TrenutakPrelaza) PK. Novi index formalno ima jednu kolonu vise, ali nam je to potrebno da bismo poatavili FK. UNIQUE constraint sa suvisnim kolonama zove se inace Super Key. Ako ste se pitali cemu sluzi Super Key osim u teoriji - sad vidite cemu moze da sluzi.

3) Sad mozemo da postavimo FK. FK nam garantuje da za svaki tekuci red mora da postoji neki prethodni red takav da PrethodniRed (BrojRegistra, TrenutakPrelaza, NovoStanje) je isto sto i TekuciRed (BrojRegistra, StariTrenutakPrelaza, StaroStanje). I dodajmo ogranicenje [StariTrenutakPrelaza] < [TrenutakPrelaza], da garantujemo rastuci redosled datuma.

Sad smo tacno na pola puta i obezbedili smo sledece:
1) Svaki rekord ima roditelja.
2) Prvi rekord je sam sebi roditelj - ne mozete uneti prvi rekord ako nije NovoStanje=StaroStanje='Na polici', TrentakPrelaza = StariTrenutakPrelaza
3) TrenutkPrelaza je veci u svakom rekordu nego sto je bio za roditelja.
Jos ne mozemo da garantujemo da nece moci neko da ubaci novi rekord negde u sredinu. Tacno, ne mozemo da garantujemo, ali je veoma tesko to uraditi. Pokusajte rucno da unesete neki rekord izmedju postojeci. Niti mozemo d agarantujemo da ce svaki rekord imati tacno jednog roditelja. Ali je veoma tesko prekrsiti ovo pravilo, rucno. Pokusajte, lakse je nego ubacivanje rekorda iamdju postojecih, ali ipak tesko. Uopste, rucno popunjavanje tabele PracenjePromenaStanja nije tako jednostavno. To u poprilicno stiti tabelu od namernog ili nenamernog unosa nelogicnih i nekompletnih podataka. Ovo znaci da ako napisemo kod koji nam pomaze da unesemo nove rekorde, manje-vise svi ce morati da koriste taj kod, rucni unos je prakticno veoma otezan.
Ovo se nalazi u zakacenom Access fajlu:

Naravno da se necemo zadovoljiti konstatacijom da je rucni unos pogresnih podataka 'prakticno' nemoguc. Za sada, probajte da napisete kodf koji ce da prebaci podatke iz prethodnog rekorda u novi, kada korisnik unese BrojRegistratora i NovoStanje. Kod treba da bude na BeforeUpdate za formu frmPracenjePromenaStanja, koja je datasheet. Kod treba da radi samo za rekorde koji nisu pocetni, smatra se da vec postoji pocetni rekord (NovoStanje=StaroStanje='Na polici', TrentakPrelaza = StariTrenutakPrelaza).
Pocetni rekord u tabeli PracenjePromenaSTanja treba da se doda kada se u tabelu Registratori doda novi regitrator. Podaci za pocetni rekord:
TrentakPrelaza = StariTrenutakPrelaza = Registratori.DatumKreiranja. Pokusajte da napisete nezavisnu funkciju koja:
1. proverava da li postoji rekord za zadati BrojRegistra u tabeli PracenjePromenaStanja
2. ako postoji rekord, funkcija ne radi nista
3. ako ne postoji rekord, funkcija INSERTuje novi rekord (pocetni rekord) za dati BrojRegistra u tabelu PracenejPromenaStanja
Funkcija se poziva sa Form After_Update eventa za formu frmRegistratori (obicna forma, sluzi za unos i editovanje podataka o registratoru)
AKo ne uspete da nparavite trazeni kod, nema veze. Imacemo jso izmena na tabeli PracenjePromenaStanja i trebace nam potpuno novi kod. Ovo je samo za vezbu.
Imate cime da se zabavljate do sutra. Ja necu imati vremena da odgovaram na poruke danas, ali se nadam da cu moci bar da ih pogledam, ako bude novih poruka.
Uzivajte

[Ovu poruku je menjao Zidar dana 05.02.2014. u 18:02 GMT+1]
[Ovu poruku je menjao Zidar dana 05.02.2014. u 18:03 GMT+1]
[Ovu poruku je menjao Zidar dana 05.02.2014. u 18:05 GMT+1]
[Ovu poruku je menjao Zidar dana 05.02.2014. u 18:07 GMT+1]
[Ovu poruku je menjao Zidar dana 05.02.2014. u 18:09 GMT+1]