I’m trying to generate monthly records in one table based on instructions in another table. Software – MS Access 2007, though I’m looking for an SQL solution here. To greatly simplify the matter, let’s say the following describes the tables:
TaskManager:
- DayDue
- TaskName
Task:
- DateDue
- TaskName
So what happens is that there may be an entry in TaskManager {15, “Accounts due”}, so this should lead to an “Account due” record in the Task table with the due date being the 15th of each month. I’d want it to create records for the last few months and the next year.
What I’m thinking that I need to do is first create a SELECT query that results in x records for each record in the TaskManager table, with a date for each month. After that, I do an INSERT query which inserts records into the Task table if they do not EXIST in the aforementioned SELECT query.
I think I can manage the INSERT query, though I’m having trouble figuring out how to do the SELECT query. Could someone give me a pointer?
Here is the solution I developed using Remou’s Calendar table idea.
First create a Calendar table, which simply contains all dates for a desired range. It’s easy to just make the dates in Excel and paste them into the table. This is also a very reliable way of doing it, as Excel handles leap years correctly for the modern range of dates.
After building this table, there are three queries to run. The first is a SELECT, which selects every possible task generated by the TaskManager based on the date and frequency. This query is called TaskManagerQryAllOptions, and has the following code:
The bulk of the above is to cover the different options a quarterly Day and Month pair could cover. The next step is another SELECT query, which selects records from the TaskManagerQryAllOptions in which the date is within the required range. This query is called TaskManagerQrySelect.
The final query is an INSERT. As we will be using this query frequently, we don’t want it to generate duplicates, so we need to filter out already created records.
One limitation of this method is that if the date of repetition (e.g. the 15th of each month) is changed, the future records with the wrong day will remain. A solution to this would be to update all the future records with the adjusted date, then run the insert.