I'm thinking that adding in individual staff member's holidays adds an extra degree of difficulty; unless they are somehow built into this "rota" thingy. Can you paint a bit of a picture? e.g. if I were to guess a it (not including holidays)....
Line | Mon | Tue | Wed | Thu | Fri | Sat | Sun
---------------------------------------------
001 | off | off | wrk | wrk | wrk |wrk | wrk
002 | wrk | wrk | off | off| wrk | wrk | wrk
003 | wrk | off | wrk | wrk | off | wrk | wrk
004 | wrk | wrk | wrk | wrk | wrk | off | off
Does that resemble what you are working with?
If so, you have one roster. The roster has 28 "cells". Each employee begins their assignment to the roster on a particular cell on a specified date. There after, their position on the roster on any nominated date is a function of the date and cell they started on, the number of cells in the roster, and the nominated date.
You would need a table to track the assignment date/cell/employee details (make sure you don't assign someone to a "Wednesday" cell on a date that is not a "Wednesday", or everything will go amuck.) and two other tables to hold the roster data. Assume you already have a tblEmployee with EmployeeID.
tblRoster
--------
RosterID (PK)
Roster Name (Text)
(you will only have one entry in this table)
tblRosterCell
------------
RosterCellID (PK)
RosterID (FK)
RosterCellIndex (Integer - between 1 and 28, in your case, to record its position on the grid. 1-7 are on line 1, 2-14 are on line 2 etc)
WorkOrOff (text)
tblRosterCellAssignment
-------------------
RosterCellAssignmentID (PK)
RosterCellID (FK)
EmployeeID (FK)
AssignmentDate (Date/Time)
I would also use a table to project data out for a year. Assuming you want to only ever project forwards, this table would have 366 records in it, with the numbers 0 to 365
tblOffset
---------
Offset (Integer)
The rest can be done with queries and probably a custom function.
HTH
Regards
John