Deployment Practices: Why Resource Max Units Should Never Be 100%
Reason number one is that in all but the most extraordinary situations it is modeling a situation that is just not possible.
But first some background on what Max Units really is. Max Units defines the percentage of a resource’s full calendar working “period” that they can be assigned to work on tasks before Project sees them as being over-allocated.
Example:
A resource’s calendar says they come in at 8am and work until 5pm and take a 1 hour lunch. They do this Monday – Friday. That is an 8 hour work day\40 hour work week. So if the Max Units is 100% then if the resource is assigned to work 9 hours in one day they will be seen as over-allocated. Same for if they are assigned to work on 2, 1 hour tasks during the same hour. This goes down to the minute level too so if two 1 hour tasks overlap by 1 minute then for that 1 minute they are over-allocated.
This helps the PM create models of assignments and get an idea of how many hours each team member is being assigned to tasks and how that falls across time, other assignments, etc.
So now you might be seeing what is wrong with 100% Max Units. It says that if I work an 8 hour day, I am available to work 8 hours on tasks. On it’s face this sounds logical but dive a little deeper and it becomes obvious that this is just not possible. Nobody ever arrived at work at 8am, took a 1 hour lunch, and then left promptly at 5pm AND got 8 hours of work done on tasks. EVER.
OK wait, I take it back. It is possible that someone did this on your project: IF your project schedule has tasks for things like: going to the bathroom, answering non-project related emails, going to a company meeting, being tapped on the shoulder by your cube-neighbor and being asked for “just a quick 5 mins. of help” (that turned into 30 mins), the list goes on and on. So if your project contains a task for every possible distraction from YOUR project and you expect your resources to track all of that then never mind. You can set your Max Units to 100%. (just count on a lot of churn on your team.)
But for most of us it is not possible to work 8 full hours on PROJECT WORK in an 8 hour day. Doing so means that you were present for more than 8 hours so that all the other things had time in your day along side your real work. The best way to help our models (because that what project schedules really are: models of what we want our project work to look like) be more accurate is to lower Max Units to something more like 85%. That would be the highest I would ever go on any project I was managing. I have seen it set as low as 75% at some sites but generally I see 80-85%.
What this means is that if you have a 1 day duration task and you assign a resource that has an 85% Max Units value, Project will calculate the Work for that task to be 6.8 hours. This means that you are modeling that on average this resource spends 1.2 hours of their 8 hour day doing something OTHER THAN working on your project. A Max Units value of 75% means that 2 hours is spent doing other things. Of course some will get more than 6.8 done in a day and some will get less done. It depends on the nature of their job, their relationship with other projects, other teams, etc. So the value you set will never be perfectly accurate but it WILL certainly be MORE accurate than 100% which is nearly always wrong. The point here is to make your model as accurate as you can.
____________________________________________________________
I’m hoping to start a small series of Deployment Practices posts here covering things I have found to be useful ideas, practices or methods for deploying Project Server. Please email me if you have suggestions or questions.
June 27, 2008 in Deployment Practices, Project 2007, Project Management, Project Server, Project Server 2007, Resource Management | Permalink
| Comments (5)
Project and Project Server SP1 Are Here!
The haters should note the date please. :-)
This TechNet article covers the how to (Read it before you update):
Here is WSS SP1:
http://www.microsoft.com/downloads/details.aspx?FamilyId=4191A531-A2E9-45E4-B71E-5B0B17108BD2&displaylang=en
Here is Office Servers SP1 (which includes Project Server and Office SharePoint Server):
http://www.microsoft.com/downloads/details.aspx?FamilyID=ad59175c-ad6a-4027-8c2f-db25322f791b&DisplayLang=en
Here is Project 2007 SP1:
http://www.microsoft.com/downloads/details.aspx?FamilyID=CEC3E1E2-D802-4A03-BC78-05C48472559B&displayLang=en
Here is the Project Server MUI SP1:
http://www.microsoft.com/downloads/details.aspx?FamilyId=D322BA67-B199-4503-8AFF-6813B320D708&displaylang=en
Here is the Office Server MUI SP1:
http://www.microsoft.com/downloads/details.aspx?FamilyId=3A6C26FD-0BEB-40D5-8CBA-15164FAAB150&displaylang=en
And for Good Measure here is the Office 2007 SP1 download:
http://www.microsoft.com/downloads/details.aspx?FamilyId=9EC51594-992C-4165-A997-25DA01F388F5&displaylang=en
December 11, 2007 in Office 2007, Project 2007, Project Server, Project Server 2007 | Permalink
| Comments (0)
Work with the Timescaled Data Object in Project 2007
UPDATE:
I have updated the code in the file download link below. I don't have time to rewrite the post to explain the changes in full but I found an issue with the code that caused a problem. Basically, if the start date of an assignment slipped into the future then the code would not act on the original dates because it was setup to use the Assignment start date as the earliest point for acting on the assignment values. Well if the assignment moved (the baseline data was 'in the past') then the code would just not do what it was designed to do. The new code at the link below will work better. Again ALWAYS test your code in a bunch of different situations. This is a great object lesson in how a developer can get tunnel vision and write code for a specific situation that leaves out other possible situations. I was writing based on a quick situation I could create and recreate very quickly during the coding process and it obviously did not include the assignment start date moving. It only included the assignment finish date moving. :-)
Like all good VBA macros we have to start with a problem that needs to be addressed or a function that needs to be added. Our problem today will be the fact that if you add a new task to an existing baseline and there is a resource assigned to this task the Baseline Work for that assignment is not rolled up to the Resource level Baseline Work field. Once the task is added to the baseline the Baseline Work for the Resource does NOT show the additional Work added to the baseline by the new assignment. This is also true of the Resource level timescaled baseline work data. The VBA code we will review here addressed this issue and gives us an opportunity to look at how to use the TimeScaledData method to access the timescaled data for tasks, resources, and assignments.
The steps to reproduce this issue are as follows:
- Create a task and assign a resource
- Baseline the project
- Create another task and assign the same resource
- Add just this second task to the project by clicking Tools | Tracking | Set Baseline and selecting "Selected Tasks"
- Go to the Resource Usage view and insert Baseline Work into the timescaled area
The example below shows how at the resource level Dwight still only has 64 hours of Baseline Work when in reality there should be 64 + 32. The timescaled area also shows only 8 hours of baseline work at the resource level for 19th, 20th, 23rd and 24th when there should be 16 for each of those days.
What is the TimeScaledData Method?
This method returns a collection of data that represents a specific type of data (Work, Cost, Baseline Work, etc) for a specific period of time (the duration of a task or assignment for example) that will be provided broken down by the specified time unit (days, weeks, months, etc). This collection can then be worked with to either read specific data about specific time slices in the collection or even to set specific data for a time slice in the collection. It is a very powerful feature of VBA but one that is not widely understood.
You can download the full macro here.
We will now review each section of the code and go over what it does:
The Variables
Dim R As Resource
Dim A As Assignment
Dim aBL As TimeScaleValues
Dim rBL As TimeScaleValues
Dim Counter As Integer
This section defines (or dimensions) the variables we will use.
R is an object variable that will represent one or more resources
A is an object variable that will represent one or more assignments
aBL is an object variable that represents timescaled data. It gets 'loaded' with data by using the TimeScaledData method. This object will represent the assignment timescaled values (hence the 'a')
rBL is just like aBL but it will represent the resource timescaled values (hence the 'r')
Counter is a variable that will be used to loop through the members of the collections when we need to access those values.
The Resource For…Next Loop
For Each R In ActiveProject.Resources
If Not (R Is Nothing) Then
Because we established above that 'R' was to represent a resource object we can use this variation of a For…Next to loop through 'each' resource (R) in the Resources collection of the active project.
The If…Then statement is testing to make sure that there are no blank lines in the resource sheet of the project. Blank lines cause a problem for VBA when dealing with the Tasks and Resources collection. If the loop above encountered a blank line an then the macro tried to access any property (the name, work or any other field for example) the macro would get an error. The test in the If…Then statement makes sure that the code 'under' it will only run if the object represented by 'R' is an actual resource.
Setting the Values to Zero
R.BaselineWork = 0
For Each A In R.Assignments
Set rBL = R.TimeScaleData(StartDate:=A.Start, EndDate:=A.Finish, _
Type:=pjResourceTimescaledBaselineWork, TimescaleUnit:=pjTimescaleDays, Count:=1)
For Counter = 1 To rBL.Count
rBL(Counter).Value = 0
Next Counter
Next A
The rest of our macro below will be recalculating what the Resource level baseline and timescaled baseline work data SHOULD be after a task is added to the baseline. This section of code is setting those values to 0 so that the code below can calculate the values correctly. This section shows us the first use of the TimeScaleData method.
The For..Each…Next here is looping through all the Assignments (all the 'A' objects) in the Assignments collection for the resource represetted by 'R'. It is then setting the 'rBL' variable to equal the collection of timescaled data defined in the R.TimeScalData method. It sets the start date of the collection to equal the start date of the current assignment (A.Start) and the finish date to equal the finish date of the current assignment (A.Finish). The collection will contain Baseline Work because we are setting the Type to equal pjResourceTimescaledBaselineWork. The timescale will be days and the Count will be 1, meaning that each object in the collection will represent 1 day. If count were set to 2 then each object (or if you prefer 'time slice') would be 2 days.
Next we have a For…Next loop that sets the value for Counter to be 1 through the number of objects (time slices) in the 'rBL' collection we just created. This loop is letting us move through each slice so that we can do something to it, either read it or write to it. The line that reads 'rBL(Counter).Value = 0' is setting the value for Timescaled Baseline Work for the time each timeperiod in the assignment (in this case days) for the resource represented by 'R' to equal zero. Let's say that the assignment represented by 'A' started on Day1 and finished on Day 5. This would mean that the 'rBL' collection would have 5 members (time slices) each representing 1 day. This means that the For Counter = 1 to rBL.Count would loop through 5 times. On the first loop through the rBL(Counter).Value represents the value of timescaled Baseline Work for the resource for Day1. On the second loop through it is Day 2 and so on. This sets the values for resource timescaled baseline work to 0 for the duration of the assignment represented by 'A'. This will get repeated for each assignment for the resource represented by 'R'.
You may ask yourself why the code above is setting the Resource timescaled values to 0 since we are using the Assignment start and finish dates. You might wonder why we are not just setting the Assignment values to 0 since the code above would have us in many cases setting the same days values to 0 several times (in the case of overlapping assignments.) This is a good question. The answer is that the problem in Project that we are solving is one where the assignment values for baseline work are correct but the resource values are incorrect. If we reset the assignment values to 0 then we would have no idea how to set the resource values. We need the assignment values intact. The price we pay for this is needing to loop through some days at the resource level a few extra times.
Adding up and Setting the Correct Values
For Each A In R.Assignments
R.BaselineWork = R.BaselineWork + A.BaselineWork
Set aBL = A.TimeScaleData(StartDate:=A.Start, EndDate:=A.Finish, _
Type:=pjAssignmentTimescaledBaselineWork, TimescaleUnit:=pjTimescaleDays, Count:=1)
Set rBL = R.TimeScaleData(StartDate:=A.Start, EndDate:=A.Finish, _
Type:=pjResourceTimescaledBaselineWork, TimescaleUnit:=pjTimescaleDays, Count:=1)
For Counter = 1 To aBL.Count
If Not (aBL(Counter).Value = "") Then
rBL(Counter).Value = rBL(Counter).Value + aBL(Counter).Value
End If
Next Counter Next A
This section is in large part a repeat of the previous section with the addition of the setting of the 'aBL' collection that will allow us to read the assignment level timescaled Baseline Work data and insert it into the 'rBL' collection. So to that end you see the Set 'aBL' and Set 'rBL' lines. They are setting the collections for both assignment and resource based on the assignment start and finish because we are reading from the assignment. Next we have a slightly expanded 'For Counter' loop from the last section. It contains an If…Then statement we use to test to make sure that value of the aBL object currently being evaluated does not contain a null value. Project sets the Baseline Work for the default nonworking days of a calendar (Saturday and Sunday) differently than non-default nonworking days (days the user sets to nonworking via the Change Working Time dialog.) Saturdays and Sundays get set to Null values while nondefault nonworking days get set to 0. Testing to make sure that the value of the rBL object is not null saves us from getting an error.
The next line is the key to the whole thing. It looks at the value of the Assignment timescaled Baseline Work and adds it to the current value of the Resource timescaled Baseline Work. It does this for each timeslice in the aBL collection. This is repeated for each assignment at which point the resource timescaled baseline work is equal to the sum of the timescaled baseline work for each of the assignments for the resource.
Closing Out
End If
Next R
End Sub
The End If here is the closing of the "If Not (R Is Nothing) Then" test at the beginning of the routine.
The Next R is the Next for the "For Each R In ActiveProject.Resources" line in the beginning. Once the execution hits this line it has completed the rest of the code for one resource and if there are more than one resource it will repeat until it has run through for each resource.
The End Sub ends our macro.
Expanding on the Basics Above
The example above works with assignment and resource timescaled baseline work. But the same concept can be used to work with any of the timescaled data in Project with just a few changes to the code we worked with. These concepts can be applied to working with task timescaled data as well. For example if we wanted to access task timescaled cost data the code might look like this:
Set taskBL = T.TimeScaleData(StartDate:=T.Start, EndDate:=T.Finish, _
Type:=pjTaskTimescaledCost, TimescaleUnit:=pjTimescaleDays, Count:=1)
This code would return a collection (in the object variable taskBL) of timescaled task cost data where each member of the collection was 1 day in duration starting with the start of the task and ending on the finish date of the task. If we wanted it in months instead of days we would change 'pjTimescaleDays' to 'pjTimeScaleMonths'. If we wanted it just for the first day of the task we would set the StartDate and EndDates to both be equal to T.Start.
One of the great things about VBA is that you don't have to remember all of the parameters or constants you need to use to make this kind of method work. The VBA Editor prompts you if you used named parameters. As soon as you enter the open parentheses after TimeScaleData the editor tells you the parameters for the method.
You could just type A.Start in the first position and then a comma and A.Finish but good coding practice dictates that you type StartDate:=A.Start. If you do this it makes your code easier to read and gives the advantage of being prompted with the constants for things like Type and TimeScaleUnit like below. This way you do not need to remember the many, many constants available to you.
So Why Would I Use This?
You might ask yourself why this would be important? Always a good question. This kind of code is essential if you want to look at or edit specific time slices of data about tasks, assignments or resources. This would include code to integrate a timesheet system with Project. For sure most companies that are integrating systems like SAP will be using Project Server and using the PSI but a 'timesheet system' might be as simple as a set of Excel spreadsheets you distribute to your resources for them to enter status data. If they do it in a timescaled way (number of hours of work done per day or per week then this code is exactly how you would base a macro to pull that data from Excel and put it into Project in a timescaled way. The TimeScaleData method is also the best way to create your own custom exports from your Project files into other systems that need data on a day by day basis. These methods are shown here using VBA native to Project 2007 but the same concepts can be used within Visual Basic to create more robust applications.
Disclaimer
This code is presented here for educational purposes only. Before such code is used in a production environment it should be seriously tested for all possible situations to ensure that it performs as expected. It's presentation here does not imply any guarantee or warranty on this code. Further, this code is not supported by Microsoft in any way. I am presenting it here as a means of education only.
April 20, 2007 in Microsoft Project, Project 2007, VBA | Permalink
| Comments (1)
Project Blog Search
Treb is a genius. He poked around with creating macros within the Microsoft Live search engine to create a special Live search page that searches just the blogs and other community sites that revolve around Project and Project Server. You can find it here.
February 23, 2007 in Microsoft Project, Project 2007, Project Server, Project Server 2007 | Permalink
| Comments (3)
And Circle Gets the Square!
Wow it has been a long time since I have posted. I would love to say that I have not had a free minute as an excuse but sadly I have had free minutes, not many but I have and I used them on my family instead of writing blog entries. Sue me. :-)
Some highlights since I last posted:
- Microsoft Office Project 2007 and Microsoft Office Project Server 2007 have shipped (along with the slightly less important to me personally: Office 2007 and a little product called Vista)
- I have been doing the technical editing\reviewing for several of the new books that will be coming out about Project 2007 and they are looking good. I’m doing one on SharePoint now and will have at least one more about Project and then one about Project Server that I will be working on later. I will let you know when they ship
- I have been working on some cool projects internal to Microsoft in the RPM space and on deploying Project Server to a few internal groups. Very fun stuff.
The biggest deal for me is that I submitted a paper to the Bill Gates ThinkWeek process and it was not only accepted but also read and commented on by Bill himself! There are over a 1000 submitted and only a handful are selected to be read by the broader ThinkWeek working group and an even smaller number are read by Bill and an even smaller number actually get feedback from Bill. So needless to say I was pretty excited. While I cannot comment publically about the exact subject of the paper suffice to say that it is about Project Server and it was well received. :-) It got the right group of people talking about the right subjects and it increased visibility of the product and it’s role. Exactly what I hoped it would do!
For those that do not know what ThinkWeek is:
What is "think week"? It is a week that BillG sets aside roughly every six months to think deeply about a range of topics impacting our company and the industry. Microsoft full time employees are encouraged to submit papers for think week - topics for the papers are broad ranging: new product ideas, promising research, trends that will affect Microsoft or the software industry, explanations of new technologies, suggestions for improving product development, etc.
It has been a very productive couple of months, just not in terms of the “blog posts per week” metric I used to use! :-)
February 5, 2007 in Portfolio Management, Project 2007, Project Server 2007 | Permalink
| Comments (1)
UPDATED TIME for BETA 2 TR Install WebCast!!
The time has been updated for the webcast tomorrow. Please note that it is now happening at 10am PDT instead of 9am!!
Webcast Title: How to install Project Server 2007 Beta 2 Technical Refresh (Beta 2 TR) – Repeat session Main Objective: To give an overview of how to install Project Server 2007 Beta2 TR and answer any questions you may have. Detailed instructions on the install are already available at:
http://technet2.microsoft.com/Office/en-us/library/2ff528e5-bd0d-41f9-832c-5ee386aa73b71033.mspx?mfr=true – you can go through this and have your questions ready !
Who will present: Microsoft Project Group members from Redmond, USA
When ?: Sep 15th, Friday, 10 AM to 11 AM PDT (Pacific Daylight Time). Click here to see what time this is where you live
Webcast Link: https://www.livemeeting.com/cc/microsoft/join?id=2Q2N7P&role=attend&pw=rg%2BSJG5DX If the meeting link does not work, please do the following: 1) Browse to: https://www.placeware.com/rm/microsoft/attend 2) Type your name 3) Type the Meeting ID as: 2Q2N7P 4) Type the Meeting Key as: rg+SJG5DX
Audio information: Toll free: +1 (800) 779-2592. Toll: +1 (210) 234-0027. Participant Passcode: 7749118.
Meeting format: "Internet Audio Broadcasting" will be enabled in the webcast – so you can listen to the audio via speakers in your computer (no need to join the conference call). There will be a person answering your questions other than the person presenting. There will be some polls that need your input.
Recording: The session will be recorded, we will send you the details of the recording after the webcast.
September 14, 2006 in Project 2007, Project Server 2007 | Permalink
| Comments (0)
Did I hear you ask for more custom fields?
Project Server 2007 makes a major change to the way that enterprise custom fields are handled. Instead of being tied to a limited set of fields (Enterprise Text1, Enterprise Text2, etc.) the new system starts with basically no custom fields and you get to add as may as you want.
The interface allows you to add a new field and that new field has several attributes that include:
- Entity (Project, Task or Resource)
- Type (Cost, Date, Flag, Duration, Number and Text)
- Summary rollup
- Whether the field will use a Lookup Table or a formula or be 'hand entered'
- Assignment 'Roll down'
- If the field will display it's value or Graphical Indicators
- If the field will be required to contain a value
Notice that Type does not include "Outline Code". There will no longer be an field type called outline code. Since any field can have a hierarchical lookup table like Project Server 2003 outline codes essentially in 2007 any enterprise custom field can be an 'outline code'.
Lookup Tables are created independently of the fields themselves which makes sharing them between fields much easier.
This brings us to the question you are likely asking yourself now: if there are no enterprise outline codes then how does the OLAP cube get user defined dimensions? Well I'm glad you asked me that...
Any Project, Resource or Task enterprise custom field can be a dimension! (Yes ANY!) There is a Cube Configuration page that allows you to pick from your defined custom fields and decide which ones should be OLAP Cube dimensions. Ready for part two of that? Any Project, Resource or Task enterprise Cost, Number or Duration field can be a measure in the cube as well. These get defined in a central page and then show up as available for any Data Analysis view (Data Analysis is what Portfolio Analyzer views are called in Project Server 2007).
Oh and all the custom field customizations happen directly in Project Web Access.
Very cool stuff coming.
Tags: project 2007, project server 2007
May 3, 2006 in Project 2007, Project Server 2007 | Permalink
| Comments (1)
| TrackBack
You have met "Roll Up" but have you met "Roll Down"?
Rolling Up is pretty common in Project It is, for those just joining us, the ability for summary tasks to contain information from the tasks 'under' themselves. This is illustrated in fields like Work or Cost where the value of the summary task field is the sum of the tasks under it. These fields are 'rolled up'.
Project 2007 adds a sibling to rollups: Roll Downs. Rolldowns, though, do not happen between summary and sub tasks but rather between Tasks and Assignments or Resources and Assignments. Rolling down is an attribute of task and resource custom fields. It allows you to specify how Assignments on a task or resource will have it's values defined for a custom field. The default is no rolldown so that an assignment custom field only gets a value if you enter it. Rolldown means that an assignment custom field will have the value of task or resource field.
You used to have to write VBA code to do this.
While this is not earth shattering stuff it is pretty cool, provided you are as geeky as I am about this kind of stuff. :-)
Oh and did I mention that you get as many fields as you want now? 30 Enterprise Project Outline Codes not enough for you? Need 50 or 75? How about 100? OK. More on this later...
Tags: custom fields, Project 2007, Project Server 2007
May 2, 2006 in Project 2007, Project Server 2007 | Permalink
| Comments (3)
| TrackBack
Cost Resources in Project 2007
One of the new features of Project 2007 is a new type of resource called a Cost resource. Previously there was Work and Material resources. The Cost resource adds the ability account for costs on tasks that have no relationship to the Work assigned on the task.
You might be saying to yourself that Project already had a feature that allowed you to do this called Task Fixed Cost and that this feature has been around since Project 98 (or was it Project 4? I can't remember.) If you are saying this you are right. However, Fixed Cost only lets you account for one 'lump sum' of this kind of cost per task. It was not very good for situations where you had more than one kind of cost per task. Cost resources make it easy to have multiple non-work related costs on a task and keep track of them easily. Even better they allow you to keep track the amount of each kind of cost across all the tasks. For example, if you have two Cost Resources, Travel and Hardware you can assign them to many tasks and then using the Resource Usage view you can see quickly how much money is scheduled to be spent on Travel and Hardware across all your tasks. You can even use the Resource Usage view to adjust where across the duration of the task the cost associated with the cost resource falls.
Assigning costs to a cost resource is done the same way as Units are set for an assignment. In the Assign Resources dialog there is a new field called "Cost". It is only active for cost resources. When you assign a resource to a task you just enter the amount you want to represent for that cost resource and click 'Assign'.
This is pretty cool stuff!
Tags: Project 2007, Project 12
April 13, 2006 in Project 2007 | Permalink
| Comments (4)
| TrackBack