|
Microsoft Office Access |
|
|
Aspekti pretrageNivo:
Pretraživanje je uobičajena i sasvim laka operacija u bazama podataka, zar ne? Nažalost, možda i nije: da bi pretraživanje bilo optimalno i efikasno, morate poznavati pojedinosti u kojima govorimo ovog puta. Postoji nekoliko načina za pronalaženje i izmenu vrednosti tabele. Da biste pronašli prvi, poslednji, prethodni ili sledeći zapis koji odgovara zadatom kriterijumu, koristite metode FindFirst, FindLast, FindPrevious i FindNext, respektivno. Jednu od ovih metoda možete upotrebiti uz uslov da ste prethodno definisali konekciju ka bazi i skup zapisa (Recordset). Ukoliko se po zadatom kriterijumu ne može pronaći zapis, program će prikazati poruku sa greškom. Grešku možete presretnete ispitivanjem vrednosti osobine NoMatch: ukoliko ona ima pozitivnu vrednost, zapis ne postoji. Lociranje zapisa nije dovoljno, te se uz Find metode koriste i Move metode - MoveFirst, MoveLast, MovePrevious i MoveLast - kako biste se premestili na zapis u kome se nalazi tražena vrednost. Upotreba Find metoda nije naročito efikasna ukoliko se skupu zapisa pristupa DAO bilbiotekom i Jet mašinom, posebno ako je skup zapisa ogroman. Skupu zapisa se može pristupiti direktno i bez Jet mašine (posredstvom sloja ODBCDirect), ali u tom slučaju metode Find ili Seek nisu dostupne, jer se pretraga kroz mrežno okruženje obavlja veoma sporo. Preporuka je da su u ovom slučaju koristi SQL struktura sa izrazima ORDER, BY i WHERE. Ukoliko za kriterijum navodite datum, on mora biti strogo u američkom obliku (mesec-dan-godina), a za pretvaranje drugih oblika datuma u američki koristite komandu Format: 'Pretraga sa preformatiranjem 'datuma u U.S. format rst.FindFirst "Datum = #" _ & Format(MojDatum, 'm-d-yy' ) & "#" Broj sa decimalama takođe morate preformatirati tako da se decimalni deo odvaja tačkom, a ne zarezom. Sve ovo morate učiniti bez obzira na regionalna podešavanja vašeg računara i bez obzira na verziju Jet mašine koju imate instaliranu. Ukoliko se u traženom polju nalaze posebni znakovi kao što je npr. #, ogradite znak uglastim zagradama: "sadržaj[#]" pronalazi polje koje ima vrednost "sadržaj#". Metodu Seek koristite radije nego Find, jer radi mnogo brže:
' Brže traži vrednost "123"
'
Function BrzoNadji()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb()
Set rst = db.OpenRecordset( _
"VelikaTabela", DB_OPEN_TABLE)
rst.Index = "PrimarniKljuc"
rst.Seek "=", 123
Debug.Print rst("IDKupac")
tbl.Close
End Function
' Sporije traži vrednost "123"
'
Function SporoNadji()
Dim Kriterijum As String
Dim db As Database
Dim rst As Recordset
Set db = CurrentDb()
Set rst = db.OpenRecordset( _
"VelikaTabela", DB_OPEN_DYNASET)
Kriterijum = "[IDKupac] =" & 123
rst.FindNext Kriterijum
Debug.Print rst("IDKupac")
End Function
Osim skupa zapisa morate definisati i polje indeksa po kome se pretraga obavlja, a možete navesti do 13 indeksa. Seek pronalazi jedinstven indeks, odnosno prvi ako se vrednost polja ponavlja, pa odmah premešta aktivnu poziciju na pronađeni zapis. Za kriterijum =, > ili >=, pretraga se obavlja unapred i obratno: za kriterijume < ili <=, pretrega se obavlja unatrag. Kao i kod metode Find, možete ispitivati vrednost osobine NoMatch i presresti grešku ukoliko se traženi zapis ne pronađe. Metodu Seek možete upotrebiti i na višeindeksnom polju, odvajajući parametre zapetom: rst.Seek "=", 123, 321 Drugi parametar nije neophodan, a ako dodeljujete samo jednu vrednost parametra umesto znaka jednakosti, tada upotrebite >=. Funkciju DLookup možete upotrebiti u VBA ili u makro programu za pronalaženje zapisa u okviru domena ili skupa zapisa. Njoj morate pridružiti najmanje dva parametra: izraz i domen, dok parametar kriterijuma nije obavezan. Rezultat rada funkcije je vrednost jednog polja skupa zapisa, čak i kada postoji više istih vrednosti. Ukoliko se zapis ne može pronaći, funkcija vraća vrednost Null. Zgodan primer upotrebe je sledeći:
'Zaglavlje izveštaja ispisuje naziv firme
=DLookUp("[naziv]";"tblFfirma")
Postavite u zaglavlju svih izveštaja jedne baze nevezano polje i prenesite u njega ovaj sadržaj. Bez obzira na izvor podataka, na svakom izveštaju će se ispisivati sadržaj polja tabele tblFirma koji sadrži osnovne podatke o firmi, kao što su naziv, adresa, telefon ili PIB broj. Čitalac Dragan Macura se javio sa sledećim problemom. Koristio je metodu Seek u Accessu 2000 i posle dobrog testiranja baze razdvojio je na BackEnd i FrontEnd delove uz pomoć ugrađenog čarobnjaka. Nakon toga, svaka pretraga metodom Seek je rezultirala greškom. Konstanta dbOpenTable ne funkcioniše na vezanim ili pridruženim tabelama, a program prijavljuje grešku Run-time error '3219': Invalid Operation. U Accessu se konekcija ka tabeli može uspostavljati samo kada se ona tretira kao objekat Recordset. U slučaju kao kod našeg čitaoca, program je prijavljivao drugu grešku: Object variable or with block variable not set, što je ukazivalo na neispravno definisanu konekciju, kako je i sam čitalac primetio:
'Pravilno konektovanje vezane tabele
'
Public Function testLink()
Dim db As DAO.Database
Dim rst As DAO.Recordset
' Konekcija ka bazi
Set db = _
DBEngine.Workspaces(0).OpenDatabase("Northwind.mdb")
' Skup zapisa
Set rst = _
myDb.OpenRecordset("Customers", dbOpenDynaset)
End Function
|
|
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. |