Median mit Suchkriterien

26/01/2010 - 22:37 von Andreas | Report spam
Hallo NG,

habe ein Problem mit einer Median-Funktion, die ich entweder hier in
der NG oder irgendwo im Netz gefunden habe. Ich kann ohne Probleme den
Median berechnen, aber sobald ich ein Such-Kriterium eingebe, dass
sich auf ein Datumsfeld bezieht, erhalte ich die Meldung "#Fehler".

Bei der DomMittelwert funktioniert es problemlos, d.h. wenn ich bspw.
folgende Abfrage fahre, làuft alles glatt:

=DomMittelwert("[PLPercent]";"[qryP&L]";"[datDateExit] BETWEEN
[StartDate] AND [EndDate]")

Dagegen funktioniert folgende Abfrage nicht:

=DMedian("[PLPercent]";"[qryP&L]";"[datDateExit] BETWEEN [StartDate]
AND [EndDate]")

[StartDate] und [EndDate] sind als Date/Time definiert. Ich vermute,
dass die Funktion DMedian nicht mit den übergebenen Daten aus den
beiden Feldern klar kommt. Meine VBA Kenntnisse sind allerdings nicht
ausreichend, um den Teil der Suchkriterien daraufhingehend zu
analysieren bzw. zu àndern. Vielleicht kann da jemand helfen?


Die Funktion "DMedian" sieht wie folgt aus:

Public Function DMedian( _
ByVal strField As String, ByVal strDomain As String, _
Optional ByVal strCriteria As String) As Variant

' Purpose:
' To calculate the median value
' for a field in a table or query.
' In:
' strField: the field
' strDomain: the table or query
' strCriteria: an optional WHERE clause to
' apply to the table or query
' Out:
' Return value: the median, if successful;
' Otherwise, an Error value.

Dim db As DAO.Database
Dim rstDomain As DAO.Recordset
Dim strSQL As String
Dim varMedian As Variant
Dim intFieldType As Integer
Dim intRecords As Integer

Const errAppTypeError = 3169

On Error GoTo HandleErr

Set db = CurrentDb()

' Initialize return value
varMedian = Null

' Build SQL string for recordset
strSQL = "SELECT " & strField & " FROM " & strDomain

' Only use a WHERE clause if one is passed in
If Len(strCriteria) > 0 Then
strSQL = strSQL & " WHERE " & strCriteria
End If

strSQL = strSQL & " ORDER BY " & strField

Set rstDomain = db.OpenRecordset(strSQL, dbOpenSnapshot)

' Check the data type of the median field
intFieldType = rstDomain.Fields(strField).Type
Select Case intFieldType
Case dbByte, dbInteger, dbLong, dbCurrency, dbSingle, dbDouble,
dbDate
' Numeric field
If Not rstDomain.EOF Then
rstDomain.MoveLast
intRecords = rstDomain.RecordCount
' Start from the first record
rstDomain.MoveFirst

If (intRecords Mod 2) = 0 Then
' Even number of records
' No middle record, so move to the
' record right before the middle
rstDomain.Move ((intRecords \ 2) - 1)
varMedian = rstDomain.Fields(strField)
' Now move to the next record, the
' one right after the middle
rstDomain.MoveNext
' And average the two values
varMedian = (varMedian + rstDomain.Fields(strField)) /
2
' Make sure you return a date, even when
' averaging two dates
If intFieldType = dbDate And Not IsNull(varMedian)
Then
varMedian = CDate(varMedian)
End If
Else
' Odd number or records
' Move to the middle record and return its value
rstDomain.Move ((intRecords \ 2))
varMedian = rstDomain.Fields(strField)
End If
Else
' No records; return Null
varMedian = Null
End If
Case Else
' Non-numeric field; so raise an app error
Err.Raise errAppTypeError
End Select

DMedian = varMedian

ExitHere:
On Error Resume Next
rstDomain.Close
Set rstDomain = Nothing
Exit Function

HandleErr:
' Return an error value
DMedian = CVErr(Err.Number)
Resume ExitHere
End Function
 

Lesen sie die antworten

#1 Henry Habermacher
27/01/2010 - 07:33 | Warnen spam
Hallo Andreas

Andreas wrote:
Bei der DomMittelwert funktioniert es problemlos, d.h. wenn ich bspw.
folgende Abfrage fahre, làuft alles glatt:

=DomMittelwert("[PLPercent]";"[qryP&L]";"[datDateExit] BETWEEN
[StartDate] AND [EndDate]")

Dagegen funktioniert folgende Abfrage nicht:

=DMedian("[PLPercent]";"[qryP&L]";"[datDateExit] BETWEEN [StartDate]
AND [EndDate]")

[StartDate] und [EndDate] sind als Date/Time definiert. Ich vermute,
dass die Funktion DMedian nicht mit den übergebenen Daten aus den
beiden Feldern klar kommt. Meine VBA Kenntnisse sind allerdings nicht
ausreichend, um den Teil der Suchkriterien daraufhingehend zu
analysieren bzw. zu àndern. Vielleicht kann da jemand helfen?



Versuch's mal so, dass Du die Datumswerte über die Funktion BuildCriteria in
eine Where Bedingung umwandelst:
=DMedian("[PLPercent]";"[qryP&L]"; BuildCriteria("datDateExit", dbDate,
"BETWEEN " & [StartDate] & " AND " & [EndDate])

Grund: DomMittelwert macht eine Variablen Auflösung und liest die Werte von
StartDate und EndDate aus, DMedian kann das nicht, da es auf diese Variablen
keinen Zugriff hat, die eingebaute VBA Funktion hingegen schon. Daher musst
Du das selber machen.

Gruss
Henry



Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com

Ähnliche fragen