Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MS Access: Definiranje parametra funkcije

[es] :: Access :: MS Access: Definiranje parametra funkcije

[ Pregleda: 5243 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stranac2

Član broj: 6178
Poruke: 189
*.net.htnet.hr



Profil

icon MS Access: Definiranje parametra funkcije03.02.2004. u 20:09 - pre 246 meseci
Problem je sigurno turbo jednostavan, ali..
Primjer:
Function Predmeti() As String
Dim dbs As Database, rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("predmeti")
... dalje nešto radim s tim slogovima i rezultat dodjeljujem imenu funkcije

"predmeti" je query koji ima jedan ulazni parametar (Criteria): Forms!mojaforma!Broj
Funkcija se poziva kao Control Source polja na reportu.
Pri otvaranju reporta javlja se greška: Too few parameters. Expected 1.

1. pitanje: da li se u definiciji funkcije treba navesti taj parametar i kako?
2. pitanje: kako se definira funkcija pri pozivu u polju na reportu?

Hvala
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: MS Access: Definiranje parametra funkcije04.02.2004. u 14:13 - pre 245 meseci
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



 
Odgovor na temu

stranac2

Član broj: 6178
Poruke: 189
*.cmu.carnet.hr



Profil

icon Re: MS Access: Definiranje parametra funkcije04.02.2004. u 17:01 - pre 245 meseci
Hvala Zidar, dao si si truda, kužim sve, popravio funkciju i radi dobro. Report sasvim brzo učitava (funkcija mora proći kroz desetak slogova).
Inače funkciju koristim jer na ispisu za učenika treba u jednom polju navesti sve njegove predmete u nizu, odvojene zarezom. Zato povučem slogove (predmete) u funkciju, protrčim kroz slogove i napravim konkatenaciju sa zarezima (ideju pokupio s foruma).
Hvala
Pozdrav
 
Odgovor na temu

[es] :: Access :: MS Access: Definiranje parametra funkcije

[ Pregleda: 5243 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.