Sue White
asked on
MS Access issue with "complex" expression
This query has worked for a long time - but suddenly is throwing this error
This is the query and the criteria coming from a form input
This is the data in the table I am querying
On the form the user is entering an ending date like 08/31/14. The query had been able to translate that to 08 2014 - and the results were correct. I don't know why I'd suddenly be getting the "too complex" error. I reasoned that I could change my query to look at the posting-dt column instead of post-period and post-year, but I cannot since some records have a posting date that is not the same as the post-period.
I tried adding two new input field for the user to enter a post-period and post-year to use that as the criteria instead of the expression, but that did not work (returned in correct number of records).
I'd really like for this query to work as it has all along. Can an expert suggest a fix for this or point out why it may be failing?
This is the query and the criteria coming from a form input
This is the data in the table I am querying
On the form the user is entering an ending date like 08/31/14. The query had been able to translate that to 08 2014 - and the results were correct. I don't know why I'd suddenly be getting the "too complex" error. I reasoned that I could change my query to look at the posting-dt column instead of post-period and post-year, but I cannot since some records have a posting date that is not the same as the post-period.
I tried adding two new input field for the user to enter a post-period and post-year to use that as the criteria instead of the expression, but that did not work (returned in correct number of records).
I'd really like for this query to work as it has all along. Can an expert suggest a fix for this or point out why it may be failing?
Having said that, I would suggest the enhancing the expression even further. It looks like you have not specified the day component of the date. I suggest you use dateSerial Access function to properly define the date from chunks:
'1st day of month
DateSerial([post-year], [post_period], 1)
With the help of dateAdd you can convert this date to the last date of month:' Last Date of month: first add 1 month then subtract 1 day
DateAdd("d", -1, (DateAdd("m", 1, DateSerial([post-year], [post_period], 1)))
First, use this expression to create your date as the first day of the period directly:
DateSerial([post-year], [post_period], 1)
Then, add your form reference as a parameter in the query. Specify data type Date. This is the key to solve your issue:
[Forms]![frmMiscellaneousT ab]![frmMi scellaneou sAcct]![En dingDate]
or as:
[Forms]![frmMiscellaneousT ab]![frmMi scellaneou sAcct].For m![EndingD ate]
/gustav
DateSerial([post-year], [post_period], 1)
Then, add your form reference as a parameter in the query. Specify data type Date. This is the key to solve your issue:
[Forms]![frmMiscellaneousT
or as:
[Forms]![frmMiscellaneousT
/gustav
ASKER
Thank you both for your replies. I did not author this query, so I cannot claim to fully understand it why it was created as it is. The goal is for the query to generate results where the ending date the user enters is less than or equal to the values in the columns post-period and post-year. I understand this is trying to concatenate the post-period and post-year into a date format (CDate(Format(([post-perio d] & " " & [post-year]),"mm/yyyy"))) - and I see the value in chaau's suggestion to make this:
(CDate(Format(([post-perio d] & "/" & [post-year]),"mm/yyyy")))
I created a new simple query to see what results I get from:
SELECT DateSerial([post-year],[po st-period] ,1) AS SerialFunc, (CDate(Format(([post-perio d] & "/" & [post-year]),"mm/yyyy"))) AS CDateFunc
and they both produce the same results
That's good, but I don't understand how I use that to filter the results from the table if the user enters 8/31/14 as the ending date and it needs for find all the records where the post-period & post-date are less than or equal to 8/31/14,
why or how I would use DateAdd function or Gustav's comment to specify the data type of Date.
(CDate(Format(([post-perio
I created a new simple query to see what results I get from:
SELECT DateSerial([post-year],[po
and they both produce the same results
That's good, but I don't understand how I use that to filter the results from the table if the user enters 8/31/14 as the ending date and it needs for find all the records where the post-period & post-date are less than or equal to 8/31/14,
why or how I would use DateAdd function or Gustav's comment to specify the data type of Date.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Ah I see Gustav - yes that does work!
Helen - I did initially try a query as you were suggesting but I ended up with an incorrect number of records. My real query is using grouping and some other expressions that I didn't include in this ticket for simplicities sake. I knew the issue was with the CDate() function.
Thank you to all the experts that replied - I apprecriate your guidance.
Helen - I did initially try a query as you were suggesting but I ended up with an incorrect number of records. My real query is using grouping and some other expressions that I didn't include in this ticket for simplicities sake. I knew the issue was with the CDate() function.
Thank you to all the experts that replied - I apprecriate your guidance.
ASKER
I appreciate the explanation given!
You are welcome!
/gustav
/gustav
Open in new window
BTW, next time please try to paste the actual code into your question instead of pictures.