Answered by:
How do I count dates that fall between user directed start/end dates; for multiple fields?

Question
-
I want to create a form that will display the count of five fields that fall between a user directed start/end date.
In my table I have fields for date1, date2, date3, date4, date5 for each record. When the form is called up I want the user to enter a start/end date, and then have the count of the associated dates to be displayed on the form. So, between start and end there are x1 of date1, x2 of date2, x3 of date3, x4 of date4, and x5 of date5.
I had this functioning within an excel spreadsheet using a series of CountIfs, but I do know how to get this to work within Access.
Thank you.
Monday, February 5, 2018 10:31 PM
Answers
-
Hi Mayhem65,
You had mentioned that,"I want to create a form that will display the count of five fields that fall between a user directed start/end date."
Please try to refer example below.
Date in Table (date_data):
Code:
Option Compare Database Private Sub Command14_Click() Dim tmpRS As DAO.Recordset Dim db As DAO.Database Dim fld As DAO.Field Set db = CurrentDb For Each fld In db.TableDefs!date_data.Fields For Each ctlVar In Me.Controls If ctlVar.ControlType = acTextBox Then If ctlVar.Name = fld.Name Then Set tmpRS = CurrentDb.OpenRecordset("SELECT count(" & fld.Name & ") from date_data where CDate(" & fld.Name & ") between #" & Me.Text0 & "# and #" & Me.Text2 & "#;") If tmpRS.RecordCount > 0 Then ctlVar.Value = tmpRS.Fields(0) Else ctlVar.Value = 0 End If End If End If Set tmpRS = Nothing Next Next End Sub
Output:
Note:- You need to create a textbox on a form with the same name of the field in table.
Regards
Deepak
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- Edited by Deepak Saradkumar PanchalMicrosoft contingent staff Tuesday, February 6, 2018 2:24 AM
- Proposed as answer by Deepak Saradkumar PanchalMicrosoft contingent staff Tuesday, February 6, 2018 2:25 AM
- Marked as answer by Mayhem65 Thursday, February 8, 2018 5:30 PM
- Unmarked as answer by Mayhem65 Thursday, February 8, 2018 5:30 PM
- Marked as answer by Mayhem65 Friday, February 9, 2018 3:52 PM
Tuesday, February 6, 2018 2:23 AM -
Hi Mayhem65,
You had mentioned that,"I have created a query that brings in the five date fields that I need. I have the form created with the selection (text boxes) field for the start/end dates. The form sources the query and I have fields on the form."
You can execute the query, after you get the start date and end date from user.
You can use the events of the controls placed on the form like textbox or button.
Further, You had asked,"What is CDate; MeText0; Me.Text2? "
CDate is a type conversion function, I used it to convert text value to date.
MeText0 and Me.Text2 are the textbox on the form for Start date and End date.
dt1, dt2, dt3, dt4, dt5 are the textbox on the form one for each date field in the table.
When you enter the start date and end date and click the show count button, It will execute the code.
I use 2 For loops as nested loop.
First loop will loop through the fields in table and fetch the field name.
Then second loop will get execute and loop through the controls on form.
If field name and control name get match then it will fire a query and fetch the count for that specific field whose date value lies between start date and end date.
Display the count in the specific textbox.
Repeat the process for all fields.
I hope now you will get better idea about the logic for this example.
For better understanding, You can try to debug the code and check values on each step.
To get more information about Access Object Model, you can refer link below.
Object model (Access VBA reference)
Regards
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- Edited by Deepak Saradkumar PanchalMicrosoft contingent staff Friday, February 9, 2018 12:57 AM
- Marked as answer by Mayhem65 Friday, February 9, 2018 3:52 PM
Friday, February 9, 2018 12:56 AM
All replies
-
Hi Mayhem65,
You had mentioned that,"I want to create a form that will display the count of five fields that fall between a user directed start/end date."
Please try to refer example below.
Date in Table (date_data):
Code:
Option Compare Database Private Sub Command14_Click() Dim tmpRS As DAO.Recordset Dim db As DAO.Database Dim fld As DAO.Field Set db = CurrentDb For Each fld In db.TableDefs!date_data.Fields For Each ctlVar In Me.Controls If ctlVar.ControlType = acTextBox Then If ctlVar.Name = fld.Name Then Set tmpRS = CurrentDb.OpenRecordset("SELECT count(" & fld.Name & ") from date_data where CDate(" & fld.Name & ") between #" & Me.Text0 & "# and #" & Me.Text2 & "#;") If tmpRS.RecordCount > 0 Then ctlVar.Value = tmpRS.Fields(0) Else ctlVar.Value = 0 End If End If End If Set tmpRS = Nothing Next Next End Sub
Output:
Note:- You need to create a textbox on a form with the same name of the field in table.
Regards
Deepak
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- Edited by Deepak Saradkumar PanchalMicrosoft contingent staff Tuesday, February 6, 2018 2:24 AM
- Proposed as answer by Deepak Saradkumar PanchalMicrosoft contingent staff Tuesday, February 6, 2018 2:25 AM
- Marked as answer by Mayhem65 Thursday, February 8, 2018 5:30 PM
- Unmarked as answer by Mayhem65 Thursday, February 8, 2018 5:30 PM
- Marked as answer by Mayhem65 Friday, February 9, 2018 3:52 PM
Tuesday, February 6, 2018 2:23 AM -
Hi Mayhem,
If you're looking for a Query solution, you might be able to use DCount() or a UNION query. For example:
SELECT DCount("*","TableName","Date1 Between #" & [Enter Start Date] & "# And #" & [Enter End Date] & "#") AS Date1, and so on...
Hope it helps...
Tuesday, February 6, 2018 2:55 AM -
Thank you. I will let you know how I make out with this.
Mayhem.
Thank you, Mayhem65
Thursday, February 8, 2018 5:31 PM -
Hi Mayhem65,
You had mentioned that,"I want to create a form that will display the count of five fields that fall between a user directed start/end date."
Please try to refer example below.
Date in Table (date_data):
Code:
Option Compare Database Private Sub Command14_Click() Dim tmpRS As DAO.Recordset Dim db As DAO.Database Dim fld As DAO.Field Set db = CurrentDb For Each fld In db.TableDefs!date_data.Fields For Each ctlVar In Me.Controls If ctlVar.ControlType = acTextBox Then If ctlVar.Name = fld.Name Then Set tmpRS = CurrentDb.OpenRecordset("SELECT count(" & fld.Name & ") from date_data where CDate(" & fld.Name & ") between #" & Me.Text0 & "# and #" & Me.Text2 & "#;") If tmpRS.RecordCount > 0 Then ctlVar.Value = tmpRS.Fields(0) Else ctlVar.Value = 0 End If End If End If Set tmpRS = Nothing Next Next End Sub
Output:
Note:- You need to create a textbox on a form with the same name of the field in table.
Regards
Deepak
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
Deepak,
I am sorry, but I am having trouble understanding some of your notes....still new to access.
I have created a query that brings in the five date fields that I need. I have the form created with the selection (text boxes) field for the start/end dates.
The form sources the query and I have fields on the form.
I presume I need this do loop to function for each field. Where fld.name is the name of the date field.
What is CDate; MeText0; Me.Text2? Any more assistance in guiding me through the variables would be very helpful.
Thank you for your patience.
Thank you, Mayhem65
Thursday, February 8, 2018 6:25 PM -
The obvious solution with the current table would be a UNION ALL query:
PARAMATERS Forms!YourForm!txtDateFrom DATETIME,
Forms!YourForm!txtDateTo DATETIME;
SELECT "dt1" AS DateColumn, COUNT(*) AS DateCount
FROM date_data
WHERE dt1 BETWEEN Forms!YourForm!txtDateFrom
AND Forms!YourForm!txtDateTo
UNION ALL
SELECT "dt2", COUNT(*)
FROM date_data
WHERE dt2 BETWEEN Forms!YourForm!txtDateFrom
AND Forms!YourForm!txtDateTo
UNION ALL
SELECT "dt3", COUNT(*)
FROM date_data
WHERE dt3 BETWEEN Forms!YourForm!txtDateFrom
AND Forms!YourForm!txtDateTo
UNION ALL
SELECT "dt4", COUNT(*)
FROM date_data
WHERE dt4 BETWEEN Forms!YourForm!txtDateFrom
AND Forms!YourForm!txtDateTo
UNION ALL
SELECT "dt5", COUNT(*)
FROM date_data
WHERE dt5 BETWEEN Forms!YourForm!txtDateFrom
AND Forms!YourForm!txtDateTo;
Bind the form to the query, include the txtDateFrom and txtDateTo unbound controls in the form header. In the AfterUpdate event procedure of each control requery the form with:
Me.Requery
However, having multiple data columns like this does cause me to suspect that you might be 'encoding data as column headings'. A fundamental principle of the database relational model is the Information Principle (Codd's Rule #1). This requires that all data be stored as values at column positions in rows in tables, and in no other way. A table structured like this would conform with the rule:
Date_Data
....Category
....CategoryDate
The table is 'all key', i.e. its primary key is a composite one of both columns. The Category column would hold the dt1, dt2 etc values while the CategoryDate column would hold the date values. The query would then be a simple count of the rows per category:
PARAMATERS Forms!YourForm!txtDateFrom DATETIME,
Forms!YourForm!txtDateTo DATETIME
SELECT Category, COUNT(*) AS DateCount
FROM Date_Data
WHERE CategoryDate BETWEEN Forms!YourForm!txtDateFrom
AND Forms!YourForm!txtDateTo
GROUP BY Category;
It would be a simple task to insert the current data into a correctly structured table by basing an 'append' query on a UNION ALL query.
Ken Sheridan, Stafford, England
- Edited by Ken Sheridan Thursday, February 8, 2018 7:07 PM Typo corrected.
- Proposed as answer by Deepak Saradkumar PanchalMicrosoft contingent staff Friday, February 9, 2018 1:00 AM
Thursday, February 8, 2018 7:05 PM -
Hi Mayhem65,
You had mentioned that,"I have created a query that brings in the five date fields that I need. I have the form created with the selection (text boxes) field for the start/end dates. The form sources the query and I have fields on the form."
You can execute the query, after you get the start date and end date from user.
You can use the events of the controls placed on the form like textbox or button.
Further, You had asked,"What is CDate; MeText0; Me.Text2? "
CDate is a type conversion function, I used it to convert text value to date.
MeText0 and Me.Text2 are the textbox on the form for Start date and End date.
dt1, dt2, dt3, dt4, dt5 are the textbox on the form one for each date field in the table.
When you enter the start date and end date and click the show count button, It will execute the code.
I use 2 For loops as nested loop.
First loop will loop through the fields in table and fetch the field name.
Then second loop will get execute and loop through the controls on form.
If field name and control name get match then it will fire a query and fetch the count for that specific field whose date value lies between start date and end date.
Display the count in the specific textbox.
Repeat the process for all fields.
I hope now you will get better idea about the logic for this example.
For better understanding, You can try to debug the code and check values on each step.
To get more information about Access Object Model, you can refer link below.
Object model (Access VBA reference)
Regards
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.- Edited by Deepak Saradkumar PanchalMicrosoft contingent staff Friday, February 9, 2018 12:57 AM
- Marked as answer by Mayhem65 Friday, February 9, 2018 3:52 PM
Friday, February 9, 2018 12:56 AM -
I have finally had a change to set this up. I am, however, getting an error when I run it....I am likely missing something, but my trouble shooting has not returned a fix....
Private Sub CalcScoreCard_Click()
Dim tmpRS As DAO.Recordset
Dim db As DAO.Database
Dim fld As DAO.Field
Set db = CurrentDb
For Each fld In db.TableDefs!ScoreCard_Query.Fields
For Each ctlVar In Me.Controls
If ctlVar.ControlType = acTextBox Then
If ctlVar.Name = fld.Name Then
Set tmpRS = CurrentDb.OpenRecordset("SELECT count(" & fld.Name & ") from date_data where CDate(" & fld.Name & ") between #" & Me.StartDate & "# and #" & Me.EndDate & "#;")
If tmpRS.RecordCount > 0 Then
ctlVar.Value = tmpRS.Fields(0)
Else
ctlVar.Value = 0
End If
End If
End If
Set tmpRS = Nothing
Next
Next
End SubThe error is occurring in "For Each fld In db.TableDefs!ScoreCard_Query.Fields"....I tried changing "TabelDefs" to the db name (front end), but it did not work.
Mayhem.
Thank you, Mayhem65
Wednesday, February 14, 2018 7:02 PM -
The error is occurring in "For Each fld In db.TableDefs!ScoreCard_Query.Fields"....I tried changing "TabelDefs" to the db name (front end), but it did not work.
Hi Mayhem,
Is ScoreCard_Query then name of a table or of a query?
If it is the name of a table you could try:
For Each fld In db.TableDefs("ScoreCard_Query").Fields
Imb.
Wednesday, February 14, 2018 7:16 PM -
The error is occurring in "For Each fld In db.TableDefs!ScoreCard_Query.Fields"....I tried changing "TabelDefs" to the db name (front end), but it did not work.
Hi Mayhem,
Is ScoreCard_Query then name of a table or of a query?
If it is the name of a table you could try:
For Each fld In db.TableDefs("ScoreCard_Query").Fields
Imb.
Thank you, Mayhem65
Wednesday, February 14, 2018 7:37 PM -
It is the query name which grabs the dates I am trying to count. However, this did not work.
Hi Mayhem65,
Queries are not stored in TableDefs, only tables.
I never use QueryDefs (where queries are stored), so I am not sure of this, but what happens if you use:
For Each fld In db.QueryDefs("ScoreCard_Query").Fields
Imb.
Wednesday, February 14, 2018 8:18 PM -
It is the query name which grabs the dates I am trying to count. However, this did not work.
Hi Mayhem65,
Queries are not stored in TableDefs, only tables.
I never use QueryDefs (where queries are stored), so I am not sure of this, but what happens if you use:
For Each fld In db.QueryDefs("ScoreCard_Query").Fields
Imb.
Thank you, but I am still getting an error....Run-time error '3265': Item not found in collection. (same error)
and at the same spot.
Thank you, Mayhem65
Wednesday, February 14, 2018 8:23 PM