Scheduling database: basic data structure?

J

James Gifford

I'm designing a multi-person scheduling tool in Access 2000, and I'm not
quite sure what form to use for the basic data.

This tool will eventually encompass interlocking schedules for several
hundred people, so most of the simple approaches I've seen won't work
(well).

The approach that seems to meet my needs and criteria is to use an array
representing a week, seven days by either ten- or fifteen-minute
increments, for a 7x96 or 7x144 array. I can't see any way around a fully
defined array, as the tool will need to quickly match and fill multiple
arrays to sort out scheduling.

1) What is the best way to implement such an array, both for compactness
and speed of manipulation? Would .XLS files be a reasonable solution?

2) Can anyone point me to a specific sample app or design study for a
similar application?

All help and pointers appreciated.
 
J

JulieD

hi James

if i understand you correctly - in that you want to create a tool for
scheduling several hundrend people in the performance of tasks - then i
would be looking into using MS Project for this.

Maybe post your requirements in the microsoft.public.project newsgroup and
see if the MVPs there think that it is the right tool to meet your needs.

Cheers
JulieD
 
J

James Gifford

JulieD said:
if i understand you correctly - in that you want to create a tool for
scheduling several hundrend people in the performance of tasks - then
i would be looking into using MS Project for this.

Project is job-oriented and simply won't fit the model that my client's
company needs to use. The need is for routine scheduling of approximately
75 staff on 35-50 client cases, on an ongoing but continually shifting
basis. There are no "jobs" or "projects" or "milestones" or such, and
Project doesn't handle regular scheduling in a manner efficient for this
use.

Neither do most scheduling programs, which concentrate more on
maintaining customer relations (GoldMine, ACT, etc.), facilities or
resource scheduling, or as "groupware" schedulers in which each user has
their own web portal to manage a schedule that is shared with others.

A tool built on Access and Excel would provide a host of other features
that are needed (such as a specialized PIM database); all I need is a way
to effectively store and manipulate the "schedule array" for each person.

Further suggestions (and pointers to off-the-shelf software I might have
missed) welcome.
 
J

James Gifford

James Gifford said:
Project is job-oriented and simply won't fit the model that my
client's company needs to use. The need is for routine scheduling of
approximately 75 staff on 35-50 client cases, on an ongoing but
continually shifting basis. There are no "jobs" or "projects" or
"milestones" or such, and Project doesn't handle regular scheduling in
a manner efficient for this use.

Neither do most scheduling programs, which concentrate more on
maintaining customer relations (GoldMine, ACT, etc.), facilities or
resource scheduling, or as "groupware" schedulers in which each user
has their own web portal to manage a schedule that is shared with
others.

I omitted: This tool will be for a single person or a small group of people
to use in creating and maintaining the schedules for several dozen people.
So nothing based on a groupware or individual user model will work, either.
 
J

JulieD

Hi James

yep, i know that project is outcome oriented but i have seen it used for
routine scheduling ... where each week (or month) is a new project file -
standard tasks & assigned resources are copied & pasted in and then the
"extra" stuff is added in, resources allocated and levelled.

this isn't the "ideal" way to use project but i'm thinking that it is easier
than doing it in Access - maybe because i just can't visualize what you're
aiming to do with it.

so i'm going to watch with interest the other responses that you receive.

Cheers
JulieD
 
J

James Gifford

Duane Hookom said:
I would caution against creating "pigeon-holes" or time-slots.

Why is that?

Unless I'm fundamentally wrong about the concept, having a fixed array for
each entity would permit rapid comparison and event slotting. Having a
flexible list of events would require walking through each list for each
comparison... or maybe I'm looking at the wrong thing?
 
J

James Gifford

JulieD said:
so i'm going to watch with interest the other responses that you
receive.

It's late and I'm tired, but what I'll do first thing tomorrow is post a
concise overview of the situation and goals. Perhaps someone can give me a
better model to work within or even point me to off-the-shelf parts or apps
that would do the job.
 
D

Duane Hookom

Access stores persistent information in tables as records. Your first post
didn't specify whether you want to use 10 or 15 minute increments. What
would happen if you set up one and then later want to switch to another?

I would never let my vision of what I want a form or report look like drive
my table structure or data storage. If you use a structure similar to those
found in the samples I suggested, you can build your forms and reports
however you want.
 
J

James Gifford

Duane Hookom said:
Access stores persistent information in tables as records. Your first
post didn't specify whether you want to use 10 or 15 minute
increments. What would happen if you set up one and then later want to
switch to another?

I'm willing to make a choice and live with it; our actual scheduling
granularity is more like half-hours. 15-minute blocks is more than
adequate, and if we have the app redeveloped at some later stage, we'd
probably have it done by 5's.
I would never let my vision of what I want a form or report look like
drive my table structure or data storage.

Understood and agreed. However, I can't see a way to make the app do all
that needs to be done with the usual structure of one disposable or
linked-list record per appointment. (That may well be due to my
limitations of understanding.)
If you use a structure similar to those found in the samples I
suggested, you can build your forms and reports however you want.

I haven't yet had a chance to look at your examples, but it's next on my
list. In the meantime, I'll post a more complete description of what this
app needs to do.
 
D

Duane Hookom

Scheduling granularity should be set in data, not hard-coded.
You haven't provided enough specifications that would justify creating a
pigeon-hole solution.
 
J

James Gifford

James Gifford said:
I'm designing a multi-person scheduling tool in Access 2000, and I'm
not quite sure what form to use for the basic data.

Okay: here's a more complete description of the problem, the needs and my
outline for a solution. (Warning: Long and boring except to gurus who
like this kind of problem-solving.)

SITUATION: A company with a large field staff providing daylong services
in clients' homes on a recurring and long-term basis. There are presently
about 65 staff for about 40 clients. Clients are seen 3-5 days of each
week, for 4-8 hours per day, for a period of a year to three years. The
staff and client lists are relatively stable and change only slowly.
However, there are many factors driving each staffer and client's
schedule and available times and needs shift frequently. Our staff has to
coordinate multi-person meetings related to each client on weekly,
monthly and semi-annual schedules, and work around appointments with
other service providers not under our control.

Scheduling is a *major* headache and lots of time is being lost to
inefficiency, long drive times, and miscommunication.

At present, the dozen senior staffers spend the first few days of each
month creating a schedule that meets all the known needs, using pen,
paper, Outlook, Palm Desktop, luck, guesses and much email and voice
communication. (I should add that nearly all of the staff operates
independently and there is very little central office time for most -
some never set foot in the corporate office and the rest only meet there
infrequently. This company's lifeblood runs on email, voicemail and cel
phones.)

Unknown factors and changes mean that schedules rarely survive very long,
and scheduling changes and crises occur many times a week. The company
has hit a severe growth wall because of the difficulty in expanding
competent staff and the efficiency losses.

Most of the staff is also heavily booked - this is not a matter of a few
appointments a day, but as many as five to seven each and every weekday,
each with its own scheduling problems.

Complicating the matter is that each staffer *must* meet contractual time
obligations to each client, so if an appointment is canceled or missed
(which happens frequently for a variety of reasons), the time must be
rescheduled, as-soon-as and within the current calendar month if
possible.

The number of staff and clients could easily double within the lifespan
of this app, so that needs to be considered in any immediate solution.
Once that threshold is reached, there would be resources for a wholesale
update of the app if necessary.

SOLUTION: Install a Scheduling Manager who absorbs responsibility for
maintaining a database of people and elements related to scheduling,
creates initial schedules for all staff and clients on a monthly,
biweekly and/or weekly basis, and acts as a single-point contact to
manage schedule changes. This may evolve to a two- or three-person
workgroup but will NEVER involve schedule participants.

PROBLEM: Giving this Scheduling Manager adequate software tools to
efficiently execute the task of creating, maintaining and updating
interlocking scheduling involving some 250-300 individuals.

There are many scheduling tools available, but if any match the model of
"one person managing a multitude of recurring schedules for a fixed and
long-term group of individuals," I haven't been able to find it. Project-
oriented tools like MS Project won't do it. CRM-type tools like GoldMine
and ACT won't do it. Individual schedulers like Outlook and Palm won't do
it. And the groupware schedulers like those used by many universities,
where each participant has a web portal to enter their own schedule and
retrieve coordinated scheduling information, won't do it. (The last might
have worked a few years ago, but the need to put the scheduling in the
hands of one person who is removed from the schedule is driven by many
factors.) I also looked into facilities and resource management tools,
but none is flexible enough to be adapted to this kind of overlapping,
interlocking scheduling.

So unless someone can point me to a powerful, single-user tool that does
this job - and I'll pay a bounty to anyone who points me to an off-the-
shelf solution! - a custom app is needed.

GOALS & IMPLEMENTATION: A useful starting point with value to other areas
of the company is a comprehensive database of staff, clients and third
parties the company interacts with. This is a relatively straightforward
application of Access and is in progress. Extending this database with
scheduling information - a rule-base and an availability chart - for each
individual is also relatively straightforward.

Getting from this stage to useful schedules for each entity is where I'm
stuck. Most of the scheduling app models I've looked at are too simple to
efficiently handle the complexities of this application.

The FIRST-LEVEL goal is to create a tool that will let the Scheduling
Manager build schedules in weekly blocks in an Outlook- or Palm-like
interface, manually defining appointments one at a time and having the
information reflected in each participant's schedule. Minimal AI to
highlight conflicts and assist the process would be nice. Expectation is
that the SM can put together a month's draft schedule for all parties in
2-3 workdays.

The SECOND-LEVEL goal would be to have enough automation to let the app
use the rule-bases and availability schedules to create an initial draft
schedule, with problems highlighted, for the SM to correct and fine-tune.
This stage should also provide tools to let the SM enter schedule changes
and corrections with "what-if" feedback showing the effects on other
schedules.

The THIRD-LEVEL goal would be to automate schedule creation to the point
where the first draft is "perfect" according to the rules and no manual
fixup would be needed. This stage should also be able to reschedule
cancelled and missed appointments as automatically as possible.

A long-term and secondary goal would be to keep the app flexibly designed
so that it could easily be converted into a standalone, configurable, and
marketable tool. (Two design decisions already made with this in mind are
24-hour scheduling capability, even though there is no foreseeable use
for scheduling outside the 8am-7pm range; and 10 or 15 minute scheduling
blocks, even though 30-minute increments are more than enough granularity
for foreseeable needs.)

RESOURCES: Effectively unlimited. Workstation horsepower, disk space,
network space, etc. are only limited by current SOTA. Budget is "ample."
Timing is "as soon as" but six months to a year to develop the system to
the semi-automated point is not excessive.


That's pretty much the whole shape of the problem: all comments,
suggestions and ideas welcome. If there is a data model for the
individual schedules that does not involve an array of all the time
blocks (and perhaps two: one as an availability and rules mask, one as
the actual current schedule), that would permit rapid comparison and
what-if updating, I would very much like to know. It does not seem to me
that having the app walk through a dozen linked lists for each inquiry
will be efficient and robust.

Many thanks in advance for taking the time to read through this and
comment!
 
J

James Gifford

....not enough. Arrgh.

Final result should be a graphical, weekly-calendar schedule for each
entity, in a variety of formats. One of the reasons I'm leaning towards
..XLS files for the scheduling arrays is that it makes distribution in
paper, .XLS, PDF, fax and web form trivial; I believe it would be easy to
export the sched to Palm format as well. All are important to the solution.
 
J

James Gifford

James Gifford said:
...not enough. Arrgh.

....and yet not enough. Arrgh Arrgh Arrgh!

Something I failed to mention is that the company services are distributed
over a large geographical region (50-mile circle) and the other exigencies
of scheduling mean that staff criss-cross three counties on a daily basis,
often driving right past clients they need to see but were unable to
schedule that day. Location information will be included in the basic
database and must be used by the scheduling tool to try and minimize such
inefficiency, or at least presented as part of the information for the
Schedule Manager to work with.

I think I'm done now. :)
 
D

Duane Hookom

You might want to look into Outlook and the resources found at
www.slipstick.com. Outlook is quite flexible and open to developing
application. There is even a nice web front end OWA.

Regarding our previous discussion on set time slots: you can get this
"appearance" through use of a table of all dates and a table of times in
five minute increments from midnight to midnight. These tables can be
populated with code like:
Function AddDates()
Dim db As DAO.Database
Set db = CurrentDb
Dim datDate As Date
For datDate = #1/1/2004# To #12/31/2005#
db.Execute "Insert into tblDates (theDate) Values (#" & datDate &
"#)", dbFailOnError
Next
End Function
Function AddTimes()
Dim db As DAO.Database
Set db = CurrentDb
Dim datTime As Date
Dim intLoop As Integer
'create 5 minute intervals
For intLoop = 0 To 24 * 12
db.Execute "Insert into tblTimes(theTime) " & _
"Values (#" & DateAdd("n", intLoop * 5, 0) & "#)", _
dbFailOnError
Next
End Function

To see how a normalized schedule can "fill" the slots, consider a query
built in the Recurring scheduler I recommended:
TRANSFORM First(tblActivities.actDescription) AS FirstOfactDescription
SELECT tblLocations.locLocation, qcarDatesTimes.TheTime
FROM tblLocations INNER JOIN ((tblActivities INNER JOIN tblSchedule ON
tblActivities.actActID = tblSchedule.schActID) INNER JOIN qcarDatesTimes ON
tblSchedule.schDate = qcarDatesTimes.TheDate) ON tblLocations.locLocID =
tblSchedule.schLocID
WHERE (((qcarDatesTimes.TheDate) Between Date() And Date()+21) AND
((qcarDatesTimes.TheTime) Between [schStartTime] And [schEndTime]))
GROUP BY tblLocations.locLocation, qcarDatesTimes.TheTime
PIVOT qcarDatesTimes.TheDate;

There are lots of tricks to view the data. Check out the calendar reports I
recommended.

I do however suggest you review the functionality of Outlook with some third
party products. I have successfully used Access with Outlook for some
required functionality.
 
J

Jeff Conrad

Hi Duane,

Comments below:
Regarding our previous discussion on set time slots: you can get this
"appearance" through use of a table of all dates and a table of times in
five minute increments from midnight to midnight. These tables can be
populated with code like:
Function AddDates()
Dim db As DAO.Database
Set db = CurrentDb
Dim datDate As Date
For datDate = #1/1/2004# To #12/31/2005#
db.Execute "Insert into tblDates (theDate) Values (#" & datDate &
"#)", dbFailOnError
Next
End Function
Function AddTimes()
Dim db As DAO.Database
Set db = CurrentDb
Dim datTime As Date
Dim intLoop As Integer
'create 5 minute intervals
For intLoop = 0 To 24 * 12
db.Execute "Insert into tblTimes(theTime) " & _
"Values (#" & DateAdd("n", intLoop * 5, 0) & "#)", _
dbFailOnError
Next
End Function

Cool functions Duane!!
Thanks for sharing that.
To see how a normalized schedule can "fill" the slots, consider a query
built in the Recurring scheduler I recommended:
TRANSFORM First(tblActivities.actDescription) AS FirstOfactDescription
SELECT tblLocations.locLocation, qcarDatesTimes.TheTime
FROM tblLocations INNER JOIN ((tblActivities INNER JOIN tblSchedule ON
tblActivities.actActID = tblSchedule.schActID) INNER JOIN qcarDatesTimes ON
tblSchedule.schDate = qcarDatesTimes.TheDate) ON tblLocations.locLocID =
tblSchedule.schLocID
WHERE (((qcarDatesTimes.TheDate) Between Date() And Date()+21) AND
((qcarDatesTimes.TheTime) Between [schStartTime] And [schEndTime]))
GROUP BY tblLocations.locLocation, qcarDatesTimes.TheTime
PIVOT qcarDatesTimes.TheDate;

Out of curiousity I tried this, but Access can't find qcarDatesTimes.
Was that query missing from the download?

Thanks for your time,
Jeff Conrad
Bend, Oregon
 
J

James Gifford

Duane Hookom said:
You might want to look into Outlook and the resources found at
www.slipstick.com. Outlook is quite flexible and open to developing
application. There is even a nice web front end OWA.

I've looked at Outlook several times, and I'm leery of building this
complex an app around it. As nice as its individual-user and small-group
features are, it doesn't really seem to have the ability to handle several
hundred individual schedules, even with considerable extension.

There may be an Automation technique that could tie Access and Outlook into
an efficient engine for this project, though, and I'm open to that.

Thanks for the other information; I'll need to digest it before commenting.
 
D

Duane Hookom

Sorry about the confusion. I had created a cartesian query (no join lines)
with the two tables tblDates and tblTimes. Adding the fields theDate and
theTime to the grid creates a virtual recordset of 100,000s of records with
every 5 minute increment from the earliest to the latest date in the table
tblDates.

--
Duane Hookom
Microsoft Access MVP
Please direct any questions to News Groups


Jeff Conrad said:
Hi Duane,

Comments below:
Regarding our previous discussion on set time slots: you can get this
"appearance" through use of a table of all dates and a table of times in
five minute increments from midnight to midnight. These tables can be
populated with code like:
Function AddDates()
Dim db As DAO.Database
Set db = CurrentDb
Dim datDate As Date
For datDate = #1/1/2004# To #12/31/2005#
db.Execute "Insert into tblDates (theDate) Values (#" & datDate &
"#)", dbFailOnError
Next
End Function
Function AddTimes()
Dim db As DAO.Database
Set db = CurrentDb
Dim datTime As Date
Dim intLoop As Integer
'create 5 minute intervals
For intLoop = 0 To 24 * 12
db.Execute "Insert into tblTimes(theTime) " & _
"Values (#" & DateAdd("n", intLoop * 5, 0) & "#)", _
dbFailOnError
Next
End Function

Cool functions Duane!!
Thanks for sharing that.
To see how a normalized schedule can "fill" the slots, consider a query
built in the Recurring scheduler I recommended:
TRANSFORM First(tblActivities.actDescription) AS FirstOfactDescription
SELECT tblLocations.locLocation, qcarDatesTimes.TheTime
FROM tblLocations INNER JOIN ((tblActivities INNER JOIN tblSchedule ON
tblActivities.actActID = tblSchedule.schActID) INNER JOIN qcarDatesTimes ON
tblSchedule.schDate = qcarDatesTimes.TheDate) ON tblLocations.locLocID =
tblSchedule.schLocID
WHERE (((qcarDatesTimes.TheDate) Between Date() And Date()+21) AND
((qcarDatesTimes.TheTime) Between [schStartTime] And [schEndTime]))
GROUP BY tblLocations.locLocation, qcarDatesTimes.TheTime
PIVOT qcarDatesTimes.TheDate;

Out of curiousity I tried this, but Access can't find qcarDatesTimes.
Was that query missing from the download?

Thanks for your time,
Jeff Conrad
Bend, Oregon
 
J

Jeff Conrad

Hi Duane,

Cartesian...cartesian...cartesian.
Interesting word of the day.

Ok I'll see if I can figure that out.....
.......(lots of head scratching)......

Whew, got it.
WOW!!! That's cool!
It will take me a long time to figure out exactly what is being displayed,
but I *think* I get the gist of it.
Very slick!

Thanks for sharing,
Jeff Conrad
Bend, Oregon

Duane Hookom said:
Sorry about the confusion. I had created a cartesian query (no join lines)
with the two tables tblDates and tblTimes. Adding the fields theDate and
theTime to the grid creates a virtual recordset of 100,000s of records with
every 5 minute increment from the earliest to the latest date in the table
tblDates.

--
Duane Hookom
Microsoft Access MVP
Please direct any questions to News Groups


Jeff Conrad said:
Hi Duane,

Comments below:
datDate
&
"#)", dbFailOnError
Next
End Function
Function AddTimes()
Dim db As DAO.Database
Set db = CurrentDb
Dim datTime As Date
Dim intLoop As Integer
'create 5 minute intervals
For intLoop = 0 To 24 * 12
db.Execute "Insert into tblTimes(theTime) " & _
"Values (#" & DateAdd("n", intLoop * 5, 0) & "#)", _
dbFailOnError
Next
End Function

Cool functions Duane!!
Thanks for sharing that.
To see how a normalized schedule can "fill" the slots, consider a query
built in the Recurring scheduler I recommended:
TRANSFORM First(tblActivities.actDescription) AS FirstOfactDescription
SELECT tblLocations.locLocation, qcarDatesTimes.TheTime
FROM tblLocations INNER JOIN ((tblActivities INNER JOIN tblSchedule ON
tblActivities.actActID = tblSchedule.schActID) INNER JOIN
qcarDatesTimes
ON
tblSchedule.schDate = qcarDatesTimes.TheDate) ON tblLocations.locLocID =
tblSchedule.schLocID
WHERE (((qcarDatesTimes.TheDate) Between Date() And Date()+21) AND
((qcarDatesTimes.TheTime) Between [schStartTime] And [schEndTime]))
GROUP BY tblLocations.locLocation, qcarDatesTimes.TheTime
PIVOT qcarDatesTimes.TheDate;

Out of curiousity I tried this, but Access can't find qcarDatesTimes.
Was that query missing from the download?

Thanks for your time,
Jeff Conrad
Bend, Oregon
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top