Newsgroup: it.comp.appl.access
Titolo: funzione non definita

ho access 2002 voglio usare i riferimenti DAO ....nei riferimenti ho
selezionato microsoft.dao.3.6 object library e microsoft access 10.0object
library
ma quando cerco di eseguire questa funzione in una query mi dice "FUNZIONE
NON DEFINITA NELL?ESPRESSIONE"...
cosa devo fare??? vi prego aiutatemi!!!
grazie
(The original version of this code, preserved with the author's comments,
was posted on the newsgroup microsoft.public.access.queries by "Tom" in
November 2001  It is updated here to cover both DAO and ADO data methods, to
shorten looping through the target record set, and to add the option to
filter the record set.)
Note this code uses DAO data access  methods, with the ADO methods commented
out, if you use ADO, simply uncomment those lines and comment out the DAO
lines.
Public Function Percentile(fldName As String, _
    tblName As String, p As Double, _
    Optional strWHERE As String = "") _
    As Double
    'Note tblName can also be the name of a query or view
    'ADO
    'Dim cnn As ADODB.Connection
    'Dim rst As ADODB.Recordset
    'DAO
    Dim Cdb As Database
    Dim rst As Recordset
    'Other Vars
    Dim break_pt As Double
    Dim sqlSort As String
    Dim low_obs As Long, high_obs As Long
    Dim r1 As Double, r2 As Double, x As Double
    Dim N As Long
    Dim recno As Long
    'VERIFY VALID PERCENTILE (0-100) WAS GIVEN
    If (p <= 0 Or p >= 100) Then
        Percentile = -555555555     'Something to stick out!
        Exit Function
    End If
    'ENSURE DESIRED DATA IS SORTED
    If Len(strWHERE) < 1 Then
        sqlSort = "SELECT [" & fldName & "] " & _
              "FROM [" & tblName & "] " & _
              "ORDER BY [" & fldName & "]"
    Else
        sqlSort = "SELECT [" & fldName & "] " & _
              "FROM [" & tblName & "] WHERE " & _
              strWHERE & _
              " ORDER BY [" & fldName & "]"
    End If
    'ADO
    'Set cnn = CurrentProject.Connection
    'Set rst = New ADODB.Recordset
    'rst.Open sqlSort, cnn, adOpenStatic, adLockReadOnly, 1
    'DAO
    Set Cdb = CurrentDb()
    Set rst = Cdb.OpenRecordset(sqlSort, dbOpenSnapshot)
    rst.MoveLast
    'How many observatons? For example, N=12
    N = rst.RecordCount
    'Which observation would, theoretically, _
    be the pTH "true" percentile.
    'e.g., for 25th percentile would be _
    the 0.25*(12+1)=3.25th observation
    break_pt = (p / 100) * (N + 1)    '3.25 = (25/100)*(12+1)
    'There's 2 special extreme cases we need to worry about!
    'small sample for small percentile
    If break_pt < 1 Then break_pt = 1
    'small sample for large percentile
    If break_pt > N Then break_pt = N
    'But since there's no such thing as a _
    3.25th observation, we estimate it _
    'somewhere between the 3rd and 4th observations. _
    It'll be approximately: p = r1*low_obs + r2*high_obs
    low_obs = Int(break_pt)     '3 = int(3.25)
    high_obs = low_obs + 1      '4 = 3 + 1
    'Now, we have to interprolate between the "boundaries"
    r1 = high_obs - break_pt    '0.75 = 4 - 3.25
    r2 = 1 - r1                 '0.25 = 1 - 0.75
    'Since we have determined the needed _
    observations and their weights we can move to the _
    projected low observation and loop _
    through the record set until we reach the _
    high observation to calc the resulting percentile
    'DAO, where absolution position is 0 based
    rst.AbsolutePosition = low_obs - 1: recno = low_obs - 1
    'ADO where absolution position is 1 based
    'rst.AbsolutePosition = low_obs: recno = low_obs - 1
    DoEvents
    Do Until rst.EOF
        recno = recno + 1
        If recno = low_obs Then x = r1 * rst(0)
        If recno = high_obs Then
            x = x + r2 * rst(0)
            Exit Do
        End If
        rst.MoveNext
    Loop
    'We now have our percentile!
    Percentile = x
rst.Close
Set rst = Nothing
'DAO
Set Cdb = Nothing
'ADO
'Set Conn = Nothing
End Function
Public Sub Test()
Dim strMsg As String
   strMsg = "25th = " & Percentile("YourField", "YourTable", 25) _
         & vbNewLine & _
         "Median = " & Percentile("YourField", "YourTable", 50) _
         & vbNewLine & _
         "75th = " & Percentile("YourField", "YourField", 75)
MsgBox strMsg
End Sub

 ha scritto nel messaggio news:e8g80h$213r$1...@newsreader1.mclink.it...

Prova a scrivere:
    Dim Cdb As DAO.Database
    Dim rst As DAO.Recordset
Ma come la utilizzi nella query?
Ciao.
-- 
Sergio MAZZA 

 dal generatore di espressione da query e poi mi aspetterei di aggiungere i
parametri giusto???
se no cosa mi consigli?

 se no cosa mi consigli?
Visto che hai inviato anche la routine di test (Sub Test) volevo sapere quale delle due invocavi nella query e che (e come) 
paramentri gli passavi...
Ciao.
-- 
Sergio MAZZA 

 io intendo "Public Function Percentile" messa in un modulo e poi
richiamata in una query mi aspetto chemi cheda il nome della tabella e del
campo inquestione...

 campo inquestione...
Come sarebbe a dire: "...mi aspetto chemi cheda il nome della tabella ..."?
Sei tu che gieli devi passare i paramentri come è indicata nella Sub Test
'---
Percentile("YourField", "YourTable", 25)
'---
"YourField" = è la stringa che conterrà il nome del campo;
"YourTable" = è la stringa che conterrà il nome della tabella;
il 25 non ho approfondito a cosa serva ma glielo devi passare;
l'ultimo parametro "strWHERE" è OPTIONAL.
Che hai scritto nella query?
Ciao.
-- 
Sergio MAZZA 

 emh... forse non ho capito un cavolo
non so come usare Sub Test è quello il problema
io nella query ho soltanto "Espr1:
percentile([fldName];[tblName];[p];[strWHERE])"
25 rappresenta che il 25% della popolazione (recordset) ha un certo valore.
grazie della disponibilità
ciao

 ciao
Devi sostituire a
[fldName] = con il nome del campo da calcolare
[tblName] = con il nome della tabella che contiene [fldName]
[p] = con la percentuale che ritieni ti interessi (se ho capito a cosa serve)
lasciamo stare la [strWHERE], per ora.
Quindi se ho un campo che si chiama [anni] che sta in una tabella [anagrafica] alla funzione gli passo:
ilPercentile: percentile([anni];[anagrafica];25)
Ciao.
-- 
Sergio MAZZA