[ mika @ 07.12.2004. 15:44 ] @
Poštovanje.

Imam jednu veliku nedoumicu i nisam uspeo nigde da iskopam objašnjenje.
Na continuous formi imam jednu kontrolu čiji je control source:
Code:

=Test([ID])


Funkcija Test() je ovde prikazana samo radi ilustracije, uprošćena:

Code:

Function Test(Key)

    Dim rst As ADODB.Recordset
    
    Set rst = Me.RecordsetClone
    rst.Find ("[ID] = " & Key)
    
    Test = rst("Amount")
End Function


Forma je bound za Query.
Konkretno, funkcija koja mi treba jeste da izračuna "nešto", za svako pojedinačno polje u continuous formi, ali to je nebitno sad, izbacio sam kalkulaciju radi jednostavnosti primera. Ono što mene interesuje, jeste zašto gornji kod neće da radi? Koristim ADO recordset, kao što je i preporučeno, i na formi mi u datoj kontroli izbacuje #Error. Ali, kada promenim kod u sledeći:

Code:

Function Test(Key)

    Dim rst As Recordset    'Ovde je izbaceno "ADODB."
    
    Set rst = Me.RecordsetClone
    rst.FindFirst ("[ID] = " & Key)    'Ovde je FindFirst umesto Find
    
    Test = rst("Amount")
End Function


Ovo sad radi kako treba.
E sad, kapiram ja da ovo drugo radi zato sto sam rst deklarisao kao DAO a ne kao ADO recordset, ali mi nije jasno zašto, koji je uzrok? Zar ADO ne podržava RecordsetClone?

Mislim, ja mogu da ostavim ovaj drugi kod u bazi da mi radi, ali zar nije preporučeno (od strane MS-a) migriranje na ADO i njegove metode? Konačno, zašto kod broj 1. neće da radi?

Puno pozdrava, Mika.

[ Mikelly @ 08.12.2004. 10:49 ] @
I ja imam isti (slican) problem. U pitanju je find metoda. Kod ADO-a nece da radi, dok na DAO oce. Mada u sustini find je vrlo los nacin za navigaciju. Moja ti je preporuka da koristis SQL dje god mozes. Npr za tvoj slucaj
Na afterupdate event polja ID ides:
dim rst as adodb.recordset
dim strsql as string
strsql = "SELECT Amount FROM Tabelakojajeizvorzaformu WHERE ID =" + cstr(Me!ID)
rst.open strsql,currentproject.connection,adopenstatic
Me.TOPOLJE.Value = rst!Amount
[ mika @ 08.12.2004. 10:57 ] @
Citat:

U pitanju je find metoda. Kod ADO-a nece da radi, dok na DAO oce.


Kod mene Find baš radi za ADO recordsete a za DAO neće, što je i normalno, zato što je Find metoda za ADO, a DAO ima svoj ekvivalent - FindFirst metodu.

Mislim da je ipak brže ići preko Find iz tog razloga što je recordset već otvoren, i ne troši se vreme oko otvaranja novog recordseta. Ako grešim, neka me neko ispravi.
[ Mikelly @ 08.12.2004. 11:06 ] @
Kod mene find ne radi na ADO recordsetu, dok mi findfirst/next/last radi na DAO. Zasto find na ADO nece ne znam. Jos sam u nekim knjigama citao da je find najsporiji moguci nacin pretrage, posle njega je seek, ali on pretrazuje samo tabele ili tabelarne recordsete i to radi preko indeksa, i na kraju kao najbrzi SQL. Naravno nemam potvrdu ovoga ali ja od tada find izbjegavam i sve radim preko SQL-a, a on nikad ne pravi probleme.

Pozdrav.