Hello,
I am trying to calculate a moving average for a series of data. I want to generate the moving average for each point within the data, in order to show in a graph. Anyway, below is an example from MS Support. I have followed to the letter, but mine doesn't give a moving average. It repeats the same data point over and over (the first data point). So, I don't believe the function is finding the startdate in the MyRST.Seek line, therefore just returning the first data point.
Finally (maybe will make this really easy) I am confused about how the indexes work. I thought you could only have one primary key, but apparently you can create multiple field constraints. I have tried to do this with the following data definition query:
ALTER TABLE Table1 ADD CONSTRAINT NoDupes UNIQUE (CurrencyType, TransactionDate)
Sorry about the length of this post. I appreciate your help.
Pat
The following sample function computes moving averages based on a table with a multiple-field primary key. The weekly values of foreign currencies are used for this example. To create the sample function, follow these steps:
Create the following table and save it as Table1:
Table: Table1
-----------------------------------------
Field Name: CurrencyType [Primary Key]
Data Type: Text
Field Size: 25
Field Name: TransactionDate [Primary Key]
Data Type: Date/Time
Format: Short Date
Field Name: Rate
Data Type: Currency
Decimal Places: 4
View the table in Datasheet view and enter the following values:
CurrencyType TransactionDate Rate
--------------------------------------------
Yen 8/6/93 $0.0079
Yen 8/13/93 $0.0082
Yen 8/20/93 $0.0085
Yen 8/27/93 $0.0088
Yen 9/3/93 $0.0091
Mark 8/6/93 $0.5600
Mark 8/13/93 $0.5700
Mark 8/20/93 $0.5800
Mark 8/27/93 $0.5900
Mark 9/3/93 $0.6000
Open a new module and type the following functions:
' '*************************************************************
'Declarations section of the module.
'*************************************************************
Option Explicit
'===============================================================
' The following function MAvgs computes moving averages based on
' a table with a multiple-field primary key.
'===============================================================
Function MAvgs(Periods As Integer, StartDate, TypeName)
Dim MyDB As DATABASE, MyRST As Recordset, MySum As Double
Dim i, x
Set MyDB = CurrentDb()
Set MyRST = MyDB.OpenRecordset("Table1")
On Error Resume Next
MyRST.Index = "PrimaryKey"
x = Periods - 1
ReDim Store(x)
MySum = 0
For i = 0 To x
MyRST.MoveFirst
MyRST.Seek "=", TypeName, StartDate
' These two variables should be in the same order as the
' primary key fields in your table.
Store(i) = MyRST![Rate]
If i <> x Then StartDate = StartDate - 7
' The 7 here assumes weekly data; 1 for daily data.
If StartDate < #8/6/93# Then MAvgs = Null: Exit Function
' #8/6/93# is replaced with the earliest date of the data
' in your table.
MySum = Store(i) + MySum
Next i
MAvgs = MySum / Periods
MyRST.Close
End Function
Create the following query based on the Table1 table:
Query: Query1
-------------------------------------------------------
Field: CurrencyType
Field: TransactionDate
Field: Rate
Field: Expr1: MAvgs(3,[TransactionDate],[CurrencyType])
NOTE: This query will generate a three-week moving average of the Rate data. To compute a longer or shorter moving average, change the number 3 in the query's Expr1 column to the value you want to compute.
Run the query. Note that you see the following three-week moving average for each currency. A Null value indicates that there were not enough earlier values to compute that week's average.
CurrencyType TransactionDate Rate Expr1
Mark 08/06/93 $0.5600
Mark 08/13/93 $0.5700
Mark 08/20/93 $0.5800 0.57
Mark 08/27/93 $0.5900 0.58
Mark 09/03/93 $0.6000 0.59
Yen 08/06/93 $0.0079
Yen 08/13/93 $0.0082
Yen 08/20/93 $0.0085 0.0082
Yen 08/27/93 $0.0088 0.0085
Yen 09/03/93 $0.0091 0.0088
I am trying to calculate a moving average for a series of data. I want to generate the moving average for each point within the data, in order to show in a graph. Anyway, below is an example from MS Support. I have followed to the letter, but mine doesn't give a moving average. It repeats the same data point over and over (the first data point). So, I don't believe the function is finding the startdate in the MyRST.Seek line, therefore just returning the first data point.
Finally (maybe will make this really easy) I am confused about how the indexes work. I thought you could only have one primary key, but apparently you can create multiple field constraints. I have tried to do this with the following data definition query:
ALTER TABLE Table1 ADD CONSTRAINT NoDupes UNIQUE (CurrencyType, TransactionDate)
Sorry about the length of this post. I appreciate your help.
Pat
The following sample function computes moving averages based on a table with a multiple-field primary key. The weekly values of foreign currencies are used for this example. To create the sample function, follow these steps:
Create the following table and save it as Table1:
Table: Table1
-----------------------------------------
Field Name: CurrencyType [Primary Key]
Data Type: Text
Field Size: 25
Field Name: TransactionDate [Primary Key]
Data Type: Date/Time
Format: Short Date
Field Name: Rate
Data Type: Currency
Decimal Places: 4
View the table in Datasheet view and enter the following values:
CurrencyType TransactionDate Rate
--------------------------------------------
Yen 8/6/93 $0.0079
Yen 8/13/93 $0.0082
Yen 8/20/93 $0.0085
Yen 8/27/93 $0.0088
Yen 9/3/93 $0.0091
Mark 8/6/93 $0.5600
Mark 8/13/93 $0.5700
Mark 8/20/93 $0.5800
Mark 8/27/93 $0.5900
Mark 9/3/93 $0.6000
Open a new module and type the following functions:
' '*************************************************************
'Declarations section of the module.
'*************************************************************
Option Explicit
'===============================================================
' The following function MAvgs computes moving averages based on
' a table with a multiple-field primary key.
'===============================================================
Function MAvgs(Periods As Integer, StartDate, TypeName)
Dim MyDB As DATABASE, MyRST As Recordset, MySum As Double
Dim i, x
Set MyDB = CurrentDb()
Set MyRST = MyDB.OpenRecordset("Table1")
On Error Resume Next
MyRST.Index = "PrimaryKey"
x = Periods - 1
ReDim Store(x)
MySum = 0
For i = 0 To x
MyRST.MoveFirst
MyRST.Seek "=", TypeName, StartDate
' These two variables should be in the same order as the
' primary key fields in your table.
Store(i) = MyRST![Rate]
If i <> x Then StartDate = StartDate - 7
' The 7 here assumes weekly data; 1 for daily data.
If StartDate < #8/6/93# Then MAvgs = Null: Exit Function
' #8/6/93# is replaced with the earliest date of the data
' in your table.
MySum = Store(i) + MySum
Next i
MAvgs = MySum / Periods
MyRST.Close
End Function
Create the following query based on the Table1 table:
Query: Query1
-------------------------------------------------------
Field: CurrencyType
Field: TransactionDate
Field: Rate
Field: Expr1: MAvgs(3,[TransactionDate],[CurrencyType])
NOTE: This query will generate a three-week moving average of the Rate data. To compute a longer or shorter moving average, change the number 3 in the query's Expr1 column to the value you want to compute.
Run the query. Note that you see the following three-week moving average for each currency. A Null value indicates that there were not enough earlier values to compute that week's average.
CurrencyType TransactionDate Rate Expr1
Mark 08/06/93 $0.5600
Mark 08/13/93 $0.5700
Mark 08/20/93 $0.5800 0.57
Mark 08/27/93 $0.5900 0.58
Mark 09/03/93 $0.6000 0.59
Yen 08/06/93 $0.0079
Yen 08/13/93 $0.0082
Yen 08/20/93 $0.0085 0.0082
Yen 08/27/93 $0.0088 0.0085
Yen 09/03/93 $0.0091 0.0088