|
Microsoft Office Access |
|
|
Prvi naredni brojNivo:
Jedno od interesantnijih i često postavljanih pitanja se odnosi na automatsko popunjavanje određenog polja brojem koji je za jedan veći od broja na prethodnom zapisu, odnosno za jedan veći od najvećeg broja. Primer ovakvog popunjavanja je broj računa, gde je izdavač računa u obavezi da ih numeriše rednim brojevima, i to "bez rupa", počev od jedan pa na dalje. Prvo što autori programa u Accessu pronađu kao rešenje je tip polja Autonumber sa rastućom popunom. Autonumber polje, inače, može imati i slučajnu popunu, a to je kada program sam zadaje brojeve slogova po slučajnom odabiru bez ponavljanja. Kod rastućeg postavljanja jedinstvenog broja zapisa, Access zadaje za jedan veći broj u odnosu na prethodni slog. Sve to radi dobro do momenta kada korisnik tokom unošenja ne odustane od zapisa podataka pritiskom na taster ESC dva puta uzastopce - prvi put za odustajanje od unosa podataka polja i drugi put za odustajanje od zapisa celog sloga. U tom slučaju, pri prvom sledećem unosu podataka broj u Autonumber polju neće biti za jedan, već za dva veći - pojaviće se "rupa". Ako je korisnik dva puta započeo unos i dva puta odustao, onda će ovaj broj biti veći za tri. I tako redom, posle nekog vremena će nastati metež u numeraciji. Problem nastaje kao posledica dizajna funkcije automatske dodele broja. Naime, Access rezerviše jedinstveni broj za svaki započeti unos podataka, za svaki slog. Bez obzira da li je korisnik zaista upisao podatke ili odustao od zapisa, rezervisani broj se više neće ponavljati. Prvi naredni broj Autonumber polja možete dobiti i nakon što korisnik započne, pa odustane od unosa isključivo ako odmah aplicirate operaciju popravke i sažimanja baze (Compact and Repair). Korišćenje Autonumber polja je dobar način za zadavanje univerzalnog identifikatora sloga, a ako zadate da se brojevi populišu rastućim redosledom, imaćete uvid u redosled unošenja podataka. Kada je ID broj nebitan kao brojač, tada se Autonumber polje može upotrebiti i kao indeksirano polje sa primarni ključem. U raznim situacijama, redosled brojeva je bitan, tako da vam Autonumber polje neće mnogo pomoći. Rešenje je vrlo jednostavno - treba pročitati najveći upisani broj u tabeli, uvećati ga za jedan i upisati ga u za to predviđeno polje pri novom unosu. Iskoristite funkciju DMax na sledeći način: =DMax("[IDfaktura]";"[tblFakture]")
Vrednost koju dobijete uvećajte za jedan i upišite ga u polje IDfaktura. Preostaje pitanje: kada je najbolje zapisati vrednost broja fakture u tabelu? Odmah na početku unosa ili na samom kraju? Čim korisnik započne unos kroz formu čiji je izvor podataka tabela tblFakture, Access će odmah rezervisati slog, ali ga neće zapisati u bazu sve dok korisnik ne pređe na neki drugi ili novi zapis. Ako ste predvideli da se na početku popunjavanja potrebnih polja zapiše i prvi naredni broj fakture, zamislite šta će se desiti u mrežnom okruženju kada istovremeno to čini više lica? Jednostavno - više njih će dobiti isti broj fakture! Preostaje vam samo da odmah, po početku unosa u novi zapis rezervišete ceo zapis i zadate broj fakture za jedan veći nego prethodni. U mrežnom okruženju, program može da funkcioniše na ovaj način, ali se sada javlja drugi problem: sad korisnik ne može da odustane od upisa. Ipak, ovo je normalan scenario, a ne posebna situacija. Fakturi, barem pre zavođenja u knjigu izlaznih računa, treba da dodelite status "u pripremi" sve do konačnog izgleda, kada se "nepovratno" zapisuje u bazu, bez mogućnosti brisanja. Scenariji automatskog dodeljivanja sledećeg većeg broja mogu biti različiti, a samim tim rešenja problema postaju raznolika. Svođenje na jedinstveno, univerzalno rešenje ovog problema traži najviše programiranja. Ideja je da korisnik popuni sva potrebna polja i, kada završi, inicira upis podataka u tabelu. Forma u kojoj popunjava podatke može biti nevezana, tj. bez definisanog izvora podataka, ali može imati i svoj izvor podataka - tabelu u kojoj će se podaci upisati. Funkcija koja se pokreće na događaj OnClick tastera miša može prethodno da proveri ispravnost upisa i upozori na eventualne greške. Zatim treba sva polja sa forme da upišete u odgovarajuću tabelu,što ćete učiniti uz pomoć SQL strukture. Za ovu operaciju upotrebite SQL naredbu Insert Into tblTabela, a zatim navedite svako od polja kao parametar. U realnom životu, praktično je neizbežno da se pojave "rupe" u rastućim brojevima zapisa. Često je takve rupe potrebno pronaći i naknadno ih popuniti ili barem identifikovati. U tom slučaju, može vam pomoći sledeća procedura:
Dim i As Long, rs As Recordset, db As Database
Set db = CurrentDb()
For i = 1 To DMax("ID", "Tabela")
Set rs = _
db.OpenRecordset("SELECT ID FROM Tabela WHERE ID = " & i & ";")
If rs.RecordCount = 0 Then
db.Execute _
("INSERT INTO tblNedostajuciID (ID) VALUE (" & i & ");")
End If
rs.Close
Next i
Brojač kreće od 1 i ide do najvećeg ID broja. Pri tome, ispituje da li svaki broj između "i" i najvećeg broja postoji. Ako ne postoji, zapisuje nepostojeći broj u tabelu tblNedostajuciID. Sadržaj tako dobijene tabele možete iskopirati u tabelu iz koje ste dobili nepostojeće brojeve.
|
|
Vrh stranice Prethodna stranica Naslovna strana Mapa sajta Pretraga |
| AFORIZAM ZA DANAS | OVIH DANA SLUŠAMO... |
| Copyright © Praktikum na Webu, 2000-2011; Valinor Design; sva prava pridržana. |