Funzione che funziona solo con i dispari!!!!

di
Anonimizzato13689
il
5 risposte

Funzione che funziona solo con i dispari!!!!

Salve a tutti, anzitutto mi presento: sono un "vecchietto" che si è avvicinato ad Access piano piano e ora che le cose si fanno più complesse, inizio ad avere grosse difficoltà.
Sto utilizzando una funzione che calcola la Mediana di un elenco di valori .... la cosa bella è che questa funzione mi da un risultato solo quando i valori in elenco sono dispari ... quando è pari, ricevo un errore #NUM!

Attendo le vostre valutazioni, grazie a tutti voi

Ecco la funzione che sto utilizzando:

Function MedianBI(Qry_analisi, BI) As Single
Dim MedianDB As Database
Dim ssMedian As Recordset
Dim RCount%, i%, x%, y%, OffSet%
Set MedianDB = CurrentDb()
Set ssMedian = MedianDB.OpenRecordset("SELECT [" & BI & "] FROM [" & Qry_analisi & "] WHERE [" & BI & "] IS NOT NULL ORDER BY [" & BI & "];")
ssMedian.MoveLast
RCount% = ssMedian.RecordCount
x% = RCount% Mod 2
If x% <> 0 Then
OffSet% = ((RCount% + 1) / 2) - 2
For i% = 0 To OffSet%
ssMedian.MovePrevious
Next i
MedianBI = ssMedian(BI)
Else
OffSet% = (RCount% / 2) - 2
For i% = 0 To OffSet%
ssMedian.MovePrevious
Next i
x% = ssMedian(BI)
ssMedian.MovePrevious
y% = ssMedian(BI)
MedianBI = (x% + y%) / 2
End If
ssMedian.Close
MedianDB.Close
End Function

5 Risposte

  • Re: Funzione che funziona solo con i dispari!!!!

    Problema risolto..... grazie lo stesso, spero sia utile questa mia precisazione.

    Con questo codice la funzione è perfetta .... buon lavoro a tutti

    Function Median (tName As String, fldName As String) As Single
    Dim MedianDB As DAO.Database
    Dim ssMedian As DAO.Recordset
    Dim RCount As Integer, i As Integer, x As Double, y As Double, _
    OffSet As Integer
    Set MedianDB = CurrentDB()
    Set ssMedian = MedianDB.Openrecordset("SELECT [" & fldName & _
    "] FROM [" & tName & "] WHERE [" & fldName & _
    "] IS NOT NULL ORDER BY [" & fldName & "];")
    'NOTE: To include nulls when calculating the median value, omit
    'WHERE [" & fldName & "] IS NOT NULL from the example.
    ssMedian.MoveLast
    RCount% = ssMedian.RecordCount
    x = RCount Mod 2
    If x <> 0 Then
    OffSet = ((RCount + 1) / 2) - 2
    For i% = 0 To OffSet
    ssMedian.MovePrevious
    Next i
    Median = ssMedian(fldName)
    Else
    OffSet = (RCount / 2) - 2
    For i = 0 To OffSet
    ssMedian.MovePrevious
    Next i
    x = ssMedian(fldName)
    ssMedian.MovePrevious
    y = ssMedian(fldName)
    Median = (x + y) / 2
    End If
    If Not ssMedian Is Nothing Then
    ssMedian.Close
    Set ssMedian = Nothing
    End If
    Set MedianDB = Nothing
    End Function
  • Re: Funzione che funziona solo con i dispari!!!!

    Ciao, non ho provato la tua funzione ma ti suggerisco un soluzione, forse un po' più semplice e lineare...dimmi tu ....
    
    
    Public Function fctMediana(strRecordSetAs String, fldName As String) As Single
    
    Dim rst As DAO.Recordset
    Dim strSql As String
    Dim retVal As Integer
    
    strSql = ""
    '' imposta il prdicato SQL nella variabile stringa strSlq e istanzi il recordset :
    
    Set rst = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)
    
    rst.MoveLast
    rst.MoveFirst
    
    If rst.RecordCount Mod 2 = 0 Then
        rst.Move (rst.RecordCount / 2) - 1
        retVal = rst.Fields("fldName ")
        rst.Move 1
        retVal = (retVal + rst.Fields(fldName )) / 2
    Else
        rst.Move rst.RecordCount / 2
        retVal = rst.Fields("fldName")
    End If
    
    fctMediana = retVal
    End Function
    
    
    facci sapere.
    un saluto.
  • Re: Funzione che funziona solo con i dispari!!!!

    .... meglio sempre distruggere l'oggetto recordset con :
    
    Set rst = Nothing
    
    ciao!
  • Re: Funzione che funziona solo con i dispari!!!!

    La funzione di Mediana per come la matematica la intende si realizza come descritto da Goku ma serve ordinare, sia DECRESCENTE che CRESCENTE non cambia, obbligatoriamente il Recordset estratto per il dato di cui ricavare la Mediana altrimenti il rischio è che l'ottimizzazione di JETENGINE utilizzi la PK che spesso è un Counter.

    Detto questo visto che un Recordset è da estrarre.... perché non estrarlo con la MEDIANA già fatta..?
    http://stackoverflow.com/questions/640286/best-way-to-calculate-a-median-in-access-2007-when-using-group-by
    Saluti
  • Re: Funzione che funziona solo con i dispari!!!!

    Grazie a tutti, ottime soluzioni (che ho già testato) ... effettivamente permettono di ottimizzare il codice utilizzando procedimenti diversi.
Devi accedere o registrarti per scrivere nel forum
5 risposte