Posebni uslovi
Univerzalna slika se prilagodjava konkretnom zadatku tako sto se u tabelu PromeneStanja dodaju kolone i dodjemo nove tabele u shemu. U nasem slucaju, dodatni uslovi su:
1. za neka stanja potrebno je upisati kontrolora => kolona PromeneStanja.Kontrolor
2. za neka stanja potrebno je upisati merno mesto, brojilo => kolona PromeneStanja.MernoMesto
Pre svega, merno mesto i brojilo moraju da pripadaju skupu dozvoljenih vrednosti. To nam daju relacije na slici:
Medjutim, to nije dovoljno. Rekli smo da "Nije dovoljno da se kontrolise sta se unosi, nego i kada se unosi. Merno mesto ima smisla unesti samo kada smo usli u stanje "plomba ugradjena', a ne smemo ga uneti an primer kad udjemo u stanje "kontrolor zaduzio plombu'. Slicno razmisljanje vazi i za Kontrolore. U nekim situacijam, obavezno je uneti kontrolora, a u nekim se nikako ne sme uneti kontrolor."
Da resimo problem kontrolora.
Stanje 1: plomba usla u magacin - ne treba kontrolor. cak i ako je kontrolor vratio plombu u magacin, mi znamo ko je imao tu plombu pre vracanaj, pa nam ne treba upis
Stanje 2 - kontrolor zaduzio plombu - koji kontroor? => treba kontrolor
Stanje 3 - plomba ugradjen - plombu moze da ugradi samo onaj ko ju je zaduzio, znaci znamo kontrolora, pa ga ne treba upisivati
Stanje 4 - plomba potrgana ilegalno, culi smo od kontrolora - kojeg? => treba kontrolor
Stanje 5 - plombu legalno skinuo kontrolor - koji? (Plombu Postavio Zika a skinuo je Mika) => treba kontrolor
Imamo dve grup stanja: (1,3) - ne treba, ne sme kontrolor i (2,4,5) gde je kontrolor obavezan. Ovo se svodi na dva iskaza koje treba da posmatramo jednovremeno:
"Plomba je u stanju (2,3,5)", "Kontrolor postoji". Ako zelimo da budemo formalni, ond
"Stanje IN (2,3,5)" i "Kontrolor IS NOT NULL".
Oba iskaza mogu biti TRUE ili FALSE, sto nam daje 4 moguce kombinacije:
Code:
"Stanje IN (2,4,5)" i "Kontrolor IS NOT NULL"
-------------------------------------------
1. TRUE TRUE
2. TRUE FALSE
3. FALSE TRUE
4. FALSE FALSE
Pogledajmo napisane kombinacije i oznacimo koje su valjane a koje ne:
Code:
"Stanje IN (2,4,5)" "Kontrolor IS NOT NULL" Dozvoljeno?
1. TRUE TRUE DA
2. TRUE FALSE NE
3. FALSE TRUE NE
4. FALSE FALSE DA
Dve kombinacije su valjane, oznacili smo ihsa DA. Znaci, valana je kombinacija 1
OR kombinacija 4.To bi u validaciji na nivou tabele zapisali ovako nekako:
Code:
([Stanje] IN (2,4,5) AND [KOntrolor] IS NOT NULL)
OR
(Plomba NOT IN (2,4,5) AND KOntrolor IS NULL)
Kako vec imamo jedan ulov na nivou tabele (DatumStanja >= DatumStarogStanja), mora da vazi stari ualov
AND ovaj novi , imamo:
Code:
([DatumStanja]>=[DatumStarogStanja])
And
(
([Stanje] = 2 OR [Stanje]=4 OR [Stanje] =5) And [KOntrolor] Is Not Null)
Or
(
NOT ([Stanje] = 2 OR [Stanje]=4 OR [Stanje] =5)
And ([KOntrolor] Is Null)
)
)
Ovde treba biti pazljiv, Access ne dozvoljava da se baz lako napise ovaj izraz. Sa novim ogranicenjem, ne mozemo vise upsivati kontrolore gde hocemo, nego gde smemo. Takodje ih ne mozemo obrisati kad ih unesemo. Jos uvek mozemo da promenimo kontrolora, pa plombu vise ne duzi Mika nego Zika. Za sada, i to mora da se odradi na front endu.
Mozemo istu logiku i isti postupa primeniti i na MernaMesta, i dobiti jso slozeniji izraz u tabel validation rule. Access nas ogranicava na 255 karaktera mislim, pa bas i nema puno mesta za manevrisanje. Zato smo kazali na pocetku da se dodani problemi resavaju na front endu.
Jos jedan uslov se za sada ne moze odraditi na nivou tabela. Jedan kontrolor moze imati bezbroj plombi. Ali, jedno merno mesto u datom trenutku moze imati samo jednu plombu. To isto mora u kodu.
kad pogledamo koliko stvari mora u kodu da se resi, onda s eisplati pomuciti s ei sto je moguce vise uslova resiti na nivou tabela. Ostaje dovoljno mesta za programiranje, i predovoljno.