Zidar Canada
Moderator Član broj: 15387 Poruke: 3085 *.eqao.com
|
STranac, svaka ti cast. Vredno ucis i napredujes pa onda vredi da ti pomognemo.
A da je lako, nije lako. Ctaj ako te ne mrzi i videces zasto nije lako.
AKd radis sa recordsetima, obicno ne pozivas query po imeny (iako moze), pogotovu ne query koji uzima parametre sa forme. Obicno se SELECT statement za recordset sagradi u okviru funkcije pa se onda upotrebi kao parameter za db.Openrecordset
Function Predmeti(intOrderID as integer ) As String
Dim dbs As Database, rst As Recordset
Dim strSQL as string 'NEW
Set dbs = CurrentDb 'OVO JE SPORO, ima boje sresenje, malo kasnije o tome
strSQL = "SELECT OrderID,OrderDetailID FROM tblOrderDEtails "
strSQL = strSQL & " WHERE OrderID=" & intOrderID
'Set rst = dbs.OpenRecordset("predmeti") 'NE OVAKO
'NEGO OVAKO:
Set rst = dbs.OpenRecordset(strSQL)
... dalje nešto radim s tim slogovima i rezultat dodjeljujem imenu funkcije
End Function
Greska "Too few parameters" nema veze sa tvojim parametrima za queri. Ova greska se javlja ako tvoj strSQL vraca SELECT statement koji ne moze da se izvrsi zbog sintaksne greske. U tvom slucaju, JET nije prepoznao "predmeti" kao naziv kverija, nego misli da je to SELECT statemant koji je naravno u tom slucaju potpuno besmislen (za JET). Da ne bi dobio "Too few parameters" najbolje je da funkciju probas u Debug rezimu i kad prodje poslednju liniju sa strSQL=strSQL&nesto
zaustavis program i orprintas u debug window vrednost strSQL varijable. Onda skocis u Query window, startujes New quary i probas da izvrsis tvoj SELECT statment (vrednost varijable strSQL) Ako radi, ti si OK, ako ima greska, quary se nece otvoriti i lakse ti je u Query window da pronadjes gresku. Kad si nasao gresku, onda podesis linije strSQl=strSQL&nesto tako da na kraju varijabla strSQL vraca korektan SQL statement.
Primeti da se tvojoj funkciji salje parameter, koji sluzi za gradjenje WHERE u strSQL. Primeti da postoji razlika u postupku za numericke i tekstualne parametre. Tekstualni parametri moraju da u strSQL imaju single quote, numericki ne moraju.
za numerik: " WHERE MyFieldName=" & MyNumericParameter
za tekst : " WHERE MytextField= " & chr(34) & MyTextparameter & chr(34)
Primeti da svuda ubacujem SPACE ispred WHERE.
Komplikovano? Svakako. To je razlog sto sam ti na pocetku savetovao da razmislis o promeni dizajna reporta i izbegnes recordest kad god mozes. Cak i kad ti funkcija proradi, kveri koji je poziva bice ocajno spor. razlozi su mnog, a ko citas dalje naucices trik za delimicno ubrzanje (i opet nece biti dovoljno).
:-)
Upotreba CurrentDB.
===============
CurrentDB je veoma spora naredba. to se ne oseti kad je pozivas retko, ali tvoja funkcija ce se pozivati iz nekog kveriaj ili rporta, znaci visestruko. Brze je da koristis zamenu za CurrentDB, ovako. Kreiraj novi modul i kopiraj funkciju getCurrentdb. Koristi se kao set db=GetCurrentdb. Probaj da pozoves 500 puta CurrentDB i to isto sa GetCurrentDB i videces razliku. Funkciju je inace napisao Ken Getz, autor serije "VB/Access Developers Handbook".
Function GetCurrentDB() As DATABASE
Static db As DATABASE
Dim strName As String
On Error Resume Next
strName = db.Name
'Previous line produces error if db = nothing (first time we call the function)
'That error is ignored and db is set to currentdb()
'This will crash if Break On All Errors
'Next time, db.name does not produce error, for it is STATIC, means it remebers
'its value between function calls
If Err.Number <> 0 Then
Set db = CurrentDb
End If
Set GetCurrentDB = db
End Function
|