I am using this module in my access database for median : - 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
Rather than finding text strings on the form/report, I have set up an expression in the control source. Where the field in question is SalePrice and the table in question is GENERAL. - =DMedian("SoldPrice","GENERAL")
However it returns "#Error" in the control.
Any Ideas on what is going wrong?
The field in question a currency datatype.
11 6344 NeoPa 32,557
Recognized Expert Moderator MVP Wisni1rr:
Where the field in question is SalePrice and the table in question is GENERAL.
- =DMedian("SoldPrice","GENERAL")
I expect it's the wrong field name.
Thank you, NeoPa.
The field in question is SoldPrice from the GENERAL table. The CODE was posted correctly in the first post. - =DMedian("SoldPrice","GENERAL")
The first post was incorrect in regards to the field in question.
NeoPa 32,557
Recognized Expert Moderator MVP
So does that mean it's working now?
No. The error still exists.
I also have the same error when trying with a different field.
I am using the code as an expression in the ControlSource Property. - =DMedian("SoldPrice","GENERAL")
and - =DMedian("DOM","GENERAL")
SoldPrice is a number datatype set as currency and DOM is a calculated field returning a number.
Both read as #ERROR in report view.
NeoPa 32,557
Recognized Expert Moderator MVP
In that case I see nothing immediately likely to cause that, but you've posted a hundred lines of code there so you'll be lucky if someone goes through it all for you very carefully.
Have you considered calling it directly from the Immediate pane and tracing the execution to see where it behaves differently from what you'd expect ( Debugging in VBA)?
I tried to debug and did not come back with any halts.
However, I noticed that I do not have the Microsoft DAO 3.6 Object Library activated under my VBA references. I tried to activate and it and get an error dialogue saying "Name conflicts with existing module, project, or object library." I do not have any other modules in the current database. I also tried to add the reference in a new database and received the same error.
Could this be the culprit?
Rabbit 12,516
Recognized Expert Moderator MVP
Do those fields contain a lot of nulls? I don't remember if the code handled nulls. Also, you said your DOM field is a calculated field... like in a query? But you also said GENERAL is a table. Your calculated query field isn't going to exist in your table.
The current dataset does not contain any nulls. DOM is in the table design view as a calculated datatype.
The recordset for the report comes from a simple select query.
SOLVED!
I used the following code to calculate the median of the fields. Both fields in question have returned appropriate values in my first round of tests. - 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
-
I also needed to enter this into the Declarations
Thanks for your help guys!!!
NeoPa 32,557
Recognized Expert Moderator MVP
Good to hear. I assume the problem was related to your missing reference, which in turn went unnoticed due to the lack of the Option Explicit. There's a lesson there whichever way it turned out ;-)
For some more helpful tips that may help avoid such errors in future see When Posting (VBA or SQL) Code. It's particularly important when posting, but some of the ideas also help in the general development of code.
I suspect you are correct, NeoPa.
Thanks NeoPA
Thanks Rabbit
Sign in to post your reply or Sign up for a free account.
Similar topics |
by: Ross Contino |
last post by:
Hello to all:
I have been searching the web for examples on how to determine a median
value in a mySQL table. I have reviewed the article at...
|
by: michael way |
last post by:
I read the follow query about calculating median posted by Daivd Porta
on 10/8/03.
CREATE TABLE SomeValues (keyx CHAR(1) PRIMARY KEY, valuex INTEGER NOT
NULL)
INSERT INTO SomeValues VALUES...
|
by: nick.vitone |
last post by:
Hi,
I'm somewhat of a novice at Access, and I have no experience
programming whatsoever. I'm attempting to calculate the statistical
median in a query. I need to "Group by" one column and find...
|
by: jimfortune |
last post by:
In
http://groups-beta.google.com/group/comp.databases.ms-access/msg/46197725b88fc3fd?hl=en
I said:
If qryRankForMedian is changed to select only values within a group
(along with a suitable...
|
by: Morgan Cheng |
last post by:
Hi All,
I was taught that argument valuse is not supposed to be changed in
function body. Say, below code is not good.
void foo1(int x)
{
x ++;
printf("x+1 = %d\n", x);
}
It should be...
| |
by: uspensky |
last post by:
I have a table (cars) with 3 fields:
VIN, Class, sell_price
101, sports, 10000
102, sports, 11000
103, luxury, 9000
104, sports, 11000
105, sports, 11000
106, luxury, 5000
107, sports, 11000
|
by: jonm4102 |
last post by:
I'm trying to calculate the median of some numerical data. The data can
only be found in a query (henceforth query 1) field I previously made,
and I would prefer to calculate the median in a new...
|
by: Jaime Leivers |
last post by:
Here's a median function in access that you can call in any query. You
could change this to any excel function you wanted. Most people can
find the windows help file that says how to call an excel...
|
by: rrstudio2 |
last post by:
I am using the following vba code to calculate the median of a table
in MS Access:
Public Function MedianOfRst(RstName As String, fldName As String) As
Double
'This function will calculate the...
|
by: MrDeej |
last post by:
Hello!
I have a table wich contains product number and different time date attachet pr product number.
Today we have used to calculate MEAN to get an average time consumed pr product. We have...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
| |
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
| |
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |