Welcome to TechNet Blogs Sign in | Join | Help

New Behavior in Timesheets with Project Server 2007 SP2: Timesheet Pre-population Goodness

Brian Smith writes here about a new behavior added in SP2 around timesheet pre-population and some reports of some customer dissatisfaction.

The ‘Gist’ is that with SP2 if you have the ‘Current task assignments’ option in the Default Timesheet Creation Mode then even after a user creates their timesheet new tasks assigned to them that fall within that timesheet period will still be added to the timesheet. Pre SP2 these new task assignments would NOT show up in the timesheet. The user would have had to delete the timesheet and recreate it. That was a HUGE bummer and the new functionality is VERY cool.

As Brian states there are a few customers that have users that want to delete a line from their timesheet but now, with SP2, if the line was a task from a Project the timesheet line comes back the next time the user opens their timesheet. The timesheet will now ALWAYS contain all tasks to which the user is assigned (that fall into that timesheet period.) These customers are unhappy with this behavior.

I think this is the best thing that could happen for these users. Basically, we have a situation here where a team member has been assigned a task by a project manager so it shows up on their timesheet. Then for whatever reason the team member feels that the task should not be on their timesheet. Either they feel that the task should be done by someone else or they feel that it should be done next week or some other reason. So they delete the line but then it comes back. So the good part of this is that it will encourage this user to talk to their project manager and explain why they think the task should not be on their timesheet. If the PM agrees then they can remove the assignment or move the task to a later week and it will drop from the users timesheet.

This feature not only makes timesheet task population dynamic but will now also encourage team member-project manager communications! Now THAT is a good feature. :-)

 

UPDATE (on 6/30/2009):

Here is the KB on this issue. Funny…it actually links back here and to Brian Smith’s blog. :-)

Posted by brianken | 0 Comments

Project 2010 Technical Preview

Just in case mine is the only Project blog you read, in which case you should really expand your blogroll by the way, here is an invitation to join the Technical Preview for the next version of Project and Project Server. :-)

_________________________________

Final call to those wishing to have access to the Microsoft Project 2010 client and Microsoft Project Server 2010 Technical Preview.

We have issued an invitation asking to show and expression of interest in gaining access to the Technical Preview of Project/Project Server 2010. The invitation was issued to all known EPM Specialized partners; Independent Software Vendors (ISV’s) that build on Project/Project Server; Project Most Valued Professionals (MVP’s) and  Project/Project Server courseware builders (books, Computer Based Training (CBT) DVD’s, instructor lead, on-demand).

There is only one invitation per company and it was sent to the company’s primary contact as registered in the Microsoft Partner Portal or through the Microsoft field providing contact details. Be aware as part of the process the person accepting the invitation must also sign a Non-Disclosure Agreement which applies to the individual and their company.

This is a final call to express and interest in receiving an invitation. If you fell that you company has not received this invitation (and should have based on the criteria given) please email proj2010@microsoft.com with your contact name, company name and email address.

For all other partners who are reading this and wish to participate in the Project/Project Server 2010 please email proj2010@microsoft.com with your name, company, email address, city, country and three sentence explanation why you should participate in the Technical Preview. Your name will be added to a wait list, there is not a guarantee that you will receive an invitation.

It is also worth noting that  as an added value to the Microsoft Project Conference registration at no additional cost to the conference ticket, you and your technical colleagues have been invited to attend the Microsoft Project 2010 Ignite Airlift which will be held on September 13-14, 2009 at the Phoenix Sheraton in Phoenix, Arizona, USA . This is a training workshop for EPM specialized partners and ISV’s who are looking for in-depth technical training on setting up the next EPM version: Project 2010.

See  http://blogs.technet.com/doug_mccutcheon/archive/2009/04/09/project-2010-readiness-be-one-of-the-first-off-the-line.aspx

Posted by brianken | 0 Comments

Filtering for an NA date in a PWA View

This post is for the person named Santhiya that commented on my “Server-side Calculation of Custom field formulas” post. I accidentally deleted it instead of approving it. I have it in my notification email so here is what they asked:

How do we use to check whether the Date fields contains values or not.

IN Project professional they are using

" Actual Finish = NA".

how can we use in PWA site while creating view with Filtering option.

Thanks!

Here is the answer:

As you found you cannot filter for “equals NA”. You also cannot filter for '”contains /”. Both of these give you an error when you try to save your filter.

What you can do is test to see if the value in the date field is greater than 1/1/1984. If it is greater than 1/1/1984 then the field contains a valid date.

So “is greater than 1/1/1984” will return only rows where the date value is NOT “NA”. The hard part is that you cannot use this idea to have a filter only show rows there there is NOT a date. The filtering mechanism does not seem to understand the idea of NA.

So the workaround for this is to do a ‘does not contain’ filter for a character that you know will always be in your dates but NOT the forward slash character (which throws an error.) If your dates for this field will always be in this century and you always use regional settings that show four digit dates then you can use this filter:

“does not contain 2”

This filter will return all rows that do not have a date in them if you use 4 digit years and your dates are always greater than 12/31/1999.

 

I hope this helps. Sorry I deleted your comment Santhiya. :-)

Posted by brianken | 2 Comments

Code to Show Which Tasks have Which Baselines Saved

Here is a sample of some VBA code that will populate the Task Text30 field with the numbers of the baselines for which each task has values saved. This is useful if you are using lots of the baselines but not all your tasks have had all the baselines saved.

For example:

image

“Task” has values in Baseline, Baseline2, Baseline4 and Baseline9 while “Other Task” only has values in Baseline2.

 

   1:  Sub WhichBaselinesSaved()
   2:  Dim t As Task
   3:  Dim i As Long
   4:   
   5:  For Each t In ActiveProject.Tasks
   6:      If Not (t Is Nothing) Then
   7:          t.Text30 = ""
   8:          For i = 0 To 10
   9:              If i = 0 Then
  10:                  If t.BaselineStart < 50000 Then
  11:                      t.Text30 = t.Text30 & i & ", "
  12:                  End If
  13:              ElseIf Not t.GetField(Application.FieldNameToFieldConstant("Baseline" _
  14:              & i & "Start", pjTask)) = "NA" Then
  15:                      t.Text30 = t.Text30 & i & ", "
  16:              End If
  17:          Next i
  18:          t.Text30 = Left$(t.Text30, Len(t.Text30) - 2)
  19:      End If
  20:      
  21:  Next t
  22:  End Sub
Posted by brianken | 0 Comments
Filed under:

The Project Conference…Be there or be…er…um…slightly more or less square than those that are actually there.

OK as nerdy things go I’m pretty sure a 4 day conference about Project Server ranks right up there. Maybe not as nerdy as Blizzcon but for sure more nerdy than Comdex. Of course I’m using ‘nerd’ in its most complimentary sense.
:-)

September 14-17 2009 in Phoenix. The Project Conference is THE place to be to learn from and rub elbows with all the best minds in the Project\Project Server\Portfolio Server universe. From the designers, the developers, testers, support pros, Microsoft Consulting Services on the consulting and implementation side, as well as the many GREAT partners providing addins, training and top notch deployment consulting…everyone is represented.

It is going to be a huge geek-out that is sure to answer all your questions about this version and the next! :-)

Posted by brianken | 0 Comments

Taking Requests

After having tested and found what I think are good settings for my screencasting I would like to gather suggestions for topics to cover.

Im thinking of a variety of topics ranging from beginning user tips around using Project Standard\Professional (creating views, setting baselines, using Usage views to look at and edit time scaled data) all the way up to more advanced things like Data Analysis views, security model ins and outs and resource management.

Please email me with any ideas.

Posted by brianken | 0 Comments
Filed under:

Final Test: Progress Lines in Project, Now with Stilted\Halting Voiceover

OK. I’m learning how to use encoder to manipulate things like viewer size and whatnot. Sadly, it does not fix how freaked out I am when I know I’m being recorded. So you will have to put up with some “UMs and ERRs” in this one (and likely for a while until I become used to this recording thing.) :-)

 

I think this size will allow decent viewing with the embedded player without having to go full screen. Let me know.

 

Posted by brianken | 1 Comments

Is Agile Really just “Good Project Management”?

Glenn Alleman has a great post here asking the question “If I'm Doing Project Management Right am I Agile?” and my answer is a resounding PROBABLY!!!  :-)

I have been thinking this same thing since way back in 2004 when I posted about an article I saw about agile methods. My post was called “Agile Methods: Based on False Assumptions?” In it I talked about how many of the points the author was making about what it called “Traditional Management” was really just bad management. This was at a time when I was on some email lists that talked about PM methods and I was getting the feeling that Agile had been created by a group of people that had worked for the WORST PMS EVER. The stories they told and the processes they talked about were not the PM I understood and practiced. It was some horrible torture method designed by people that did not like software developers. I started to feel like the Agile community was a support group for abused software developers. The hard part was that they were talking about “Project Managers” as if they were an interchangeable set of identical parts” (IRONIC since that was one of the main accusations the agile community was making about how PMs saw software developers.)

That said I don’t think that good project management and Agile methods are a 100% overlap I do think that if you are doing project management correctly and the methods you are using in the management of your project are well fit to the particular project you are managing then what you are doing will NOT be the kind of PM that the agile community rails against. So for the most part the answer to Glenn’s question is YES. :-)

Posted by brianken | 3 Comments

News for All PSI Developers

If you are doing Project Server development using the PSI then you NEED to check out what Colby Africa is doing with mpFx.  This is a set of class libraries that simplifies the development of PSI code. It reduces the number of calls you need to make to do things like create projects, assign resources, create tasks, etc.

This is what is required to create a project and wait for the queue job to finish:

   1: namespace Microsoft.SDK.Project.Samples.QueueCreateProject
   2: {
   3:     class Program
   4:     {
   5:         [STAThread]
   6:         static void Main(string[] args)
   7:         {
   8:             try
   9:             {
  10:                 const string PROJECT_SERVER_URI = "h//ServerName/ProjectServerName/";
  11:                 const string PROJECT_SERVICE_PATH = "_vti_bin/psi/project.asmx";
  12:                 const string QUEUESYSTEM_SERVICE_PATH = "_vti_bin/psi/queuesystem.asmx";
  13:  
  14:                 Guid jobId;
  15:  
  16:                 // Set up the Web service objects
  17:                 ProjectWebSvc.Project projectSvc = new ProjectWebSvc.Project();
  18:  
  19:                 ProjectWebSvc.ProjectDataSet projectDs = new ProjectWebSvc.ProjectDataSet();
  20:  
  21:                 projectSvc.Url = PROJECT_SERVER_URI + PROJECT_SERVICE_PATH;
  22:                 projectSvc.Credentials = CredentialCache.DefaultCredentials;
  23:  
  24:                 QueueSystemWebSvc.QueueSystem q = new QueueSystemWebSvc.QueueSystem();
  25:                 q.Url = PROJECT_SERVER_URI + QUEUESYSTEM_SERVICE_PATH;
  26:                 q.UseDefaultCredentials = true;
  27:  
  28:                 projectDs = new ProjectWebSvc.ProjectDataSet();
  29:  
  30:                 // Create the project
  31:                 ProjectWebSvc.ProjectDataSet.ProjectRow projectRow = projectDs.Project.NewProjectRow();
  32:                 projectRow.PROJ_UID = Guid.NewGuid();
  33:                 projectRow.PROJ_NAME = "Its a wonderful project at " +
  34:                    DateTime.Now.ToShortDateString().Replace("/", "") + " " +
  35:                    DateTime.Now.ToShortTimeString().Replac", "");
  36:                 projectRow.PROJ_TYPE = (int)PSLibrary.Project.ProjectType.Project;
  37:                 projectDs.Project.AddProjectRow(projectRow);
  38:  
  39:                 // Add some tasks        
  40:                 jobId = Guid.NewGuid();
  41:                 projectSvc.QueueCreateProject(jobId, projectDs, false);
  42:                 WaitForQueue(q, jobId);
  43:  
  44:             }
  45:             catch (SoapException ex)
  46:             {
  47:                 PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex);
  48:                 PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
  49:                 string errMess = "==============================\r\nEr \r\n";
  50:                 for (int i = 0; i < errors.Length; i++)
  51:                 {
  52:                     errMess += "\n" + ex.Message.ToString() + "\r\n";
  53:                     errMess += "".PadRight(30, '=') + "\r\nPSCLientError Out\r\n \r\n";
  54:                     errMess += errors[i].ErrId.ToString() + "\n";
  55:  
  56:                     for (int j = 0; j < errors[i].ErrorAttributes.Length; j++)
  57:                     {
  58:                         errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j]  " + errors[i].ErrorAttributes[j];
  59:                     }
  60:                     errMess += "\r\n".PadRight(30, '=');
  61:                 }
  62:                 Console.ForegroundColor = ConsoleColor.Red;
  63:                 Console.WriteLine(errMess);
  64:             }
  65:             catch (WebException ex)
  66:             {
  67:                 string errMess = ex.Message.ToString() +
  68:                    "\n\nLog on, or check the Project Server Queuing Service";
  69:                 Console.ForegroundColor = ConsoleColor.Red;
  70:                 Console.WriteLine("Er " + errMess);
  71:             }
  72:             catch (Exception ex)
  73:             {
  74:                 Console.ForegroundColor = ConsoleColor.Red;
  75:                 Console.WriteLine("Er " + ex.Message);
  76:             }
  77:             finally
  78:             {
  79:                 Console.ResetColor();
  80:                 Console.WriteLine("\r\n\r\nPress any key...");
  81:                 Console.ReadKey();
  82:             }
  83:         }
  84:         static private void WaitForQueue(QueueSystemWebSvc.QueueSystem q, Guid jobId)
  85:         {
  86:             QueueSystemWebSvc.JobState jobState;
  87:             const int QUEUE_WAIT_TIME = 2; // two seconds
  88:             bool jobDone = false;
  89:             string xmlError = string.Empty;
  90:             int wait = 0;
  91:  
  92:             //Wait for the project to get through the queue
  93:             // - Get the estimated wait time in seconds
  94:             wait = q.GetJobWaitTime(jobId);
  95:  
  96:             // - Wait for it
  97:             Thread.Sleep(wait * 1000);
  98:             // - Wait until it is done.
  99:  
 100:             do
 101:             {
 102:                 // - Get the job state
 103:                 jobState = q.GetJobCompletionState(jobId, out xmlError);
 104:  
 105:                 if (jobState == QueueSystemWebSvc.JobState.Success)
 106:                 {
 107:                     jobDone = true;
 108:                 }
 109:                 else
 110:                 {
 111:                     if (jobState == QueueSystemWebSvc.JobState.Unknown
 112:                     || jobState == QueueSystemWebSvc.JobState.Failed
 113:                     || jobState == QueueSystemWebSvc.JobState.FailedNotBlocking
 114:                     || jobState == QueueSystemWebSvc.JobState.CorrelationBlocked
 115:                     || jobState == QueueSystemWebSvc.JobState.Canceled)
 116:                     {
 117:                         // If the job failed, error out
 118:                         throw (new ApplicationException("Queue request failed \"" + jobState + "\" Job " + jobId + ".\r\n" + xmlError));
 119:                     }
 120:                     else
 121:                     {
 122:                         Console.WriteLine("Job St " + jobState + " Job " + jobId);
 123:                         Thread.Sleep(QUEUE_WAIT_TIME * 1000);
 124:                     }
 125:                 }
 126:             }
 127:             while (!jobDone);
 128:         }
 129:     }
 130: }

 

Here is the same code in mpFx:

   1: using System;
   2: using System.Web.Services.Protocols;
   3: using CodePlex.MicrosoftProject.mpFx;
   4: using CodePlex.MicrosoftProject.mpFx.ProjectsWebService;
   5:  
   6: namespace ConsoleTest
   7: {
   8:     class Program
   9:     {
  10:         static void Main(string[] args)
  11:         {
  12:             using (ProjectServer projectServer = new ProjectServer("h//epm2007demo/pwa", DataStoreEnum.WorkingStore))
  13:             {
  14:                 using (ProjectDataSet projectDataSet = EntityFactory.NewProject("Demo"))
  15:                 {
  16:                     try
  17:                     {
  18:                         projectServer.Projects.Create(projectDataSet, false, true);
  19:                     }
  20:                     catch (SoapException exception)
  21:                     {
  22:                         Console.WriteLine(Errors.ProcessMSProjectErrors(exception));
  23:                     }
  24:                     catch (Exception exception)
  25:                     {
  26:                         Console.WriteLine(exception.Message);                        
  27:                     }
  28:                 }
  29:             }
  30:         }
  31:     }
  32: }

32 lines of code as opposed to 130!

Posted by brianken | 0 Comments

Server-Side Calculation of Custom Field Formulas

So I have a PSI application that pulls data from Oracle Financials and correlates it to specific projects in Project Server. using a key field it brings over 6 fields and writes it to 6 Project level Enterprise Number fields. It updates the fields and then calls QueueUpdateProject which should trigger a recalculation of custom field formulas. I also have several custom fields that use the original 6 fields in their formulas.

My problem is that the fields with formulas were not getting updated. If I opened the project into Project Professional then they calculated just fine.

It turns out that there is a problem with the calculation ‘engine’ in Project Server that causes it to stop recalculating these formulas if any one of them returns an error. In my case the error was caused by this formula: [Capital Actuals]/[Capital Plan] because for some of the projects the Capital Plan field was 0.

The solution is to make sure your formulas cannot return such an error. In my case it was changing the formula to this:
IIF([Capital Plan]>0, [Capital Actuals]/[Capital Plan], 0)

Similar issues can possibly be caused by a formula like [Field A]+[Field B] if either A or B have been deleted.

So if any of you are having issues where your field formulas are not refreshing properly go and check all your formulas and see if any of them are returning errors.

 

Merry Christmas\Happy Holidays\Have a Happy Next Two Weeks :-)

Thankful

Given the season I have started thinking about what I’m thankful for. Here is my list of a few things I am thankful for this year:

  1. My wife and my children. All the normal clichés apply of course but they are clichés. I would not be where I am or who I am without them.
  2. The health of my grandparents. At 90 and 87 they are going strong.
  3. The almost unbelievable luck of getting to work for Microsoft getting paid to do something I love to do and am good at doing. At least once a month I think about how lucky I am to be here.
  4. My team, The MCS EPM Global Practice. Scary smart and dedicated to making sure that customers are doing their best work around project and portfolio management.
  5. Multiple Level Undo. I get goose bumps just writing the words.
  6. The Election
  7. The Zune. All you can eat music.
  8. The Amazon Kindle. Books books and more books.
  9. Windows Server 2008 running on a Lenovo T61p with 4 gigs of RAM. Wow!
  10. The promise of the future
Posted by brianken | 1 Comments

Project Server Technical Library in a Single File

I know what you are saying “No way, how could they do it?” But it is all right there. It slices, it dices it makes thousands of julienne fries. But it also lets you have every technical document on Project Server 2007 in one place that you can search. It is amazing. NOW how much would you pay. OK anyway… this is pretty cool and you should download it right now. Tech Docs in a Single File

image

Now when I downloaded it I got a small issue where it would not show me any of the content. I’m not sure if this is an issue based on my OS (I’m running Windows Server 2008 on my laptop) but here is the fix. If you right click on the .chm file and then hit Properties you may see a button that says “Unblock” if you see it then click it and then you will be able to see the content of the file.

image

Posted by brianken | 1 Comments

Reliability\Quality of Data

In the past few weeks I have seen a ton of questions floating around about users of project management systems wanting to see reporting showing resource capacity vs. demand. Now you might be saying “But Brian, that is pretty common. Doesn’t EVERYONE want this kind of data from their PM system?” to which I would reply “Certainly, but these requests were different in that they all wanted to see it for time periods going out as far as 2 years into the future.” My question is what is someone going to do with a comparison between demand (scheduled work) and availability that far into the future? The instant answer I always get is that they want to see how the current load of projects scheduled is placing demand on their resources and that is a good answer. But in my opinion most organizations are just not good enough at scheduling and estimating and forecasting to make schedule data that far into the future of a quality that would support any real decision making around demand\capacity problems. Schedules are hard enough to get accurate for the next 2 months let alone the next 2 years.

There are industries or environments\situations where the type of projects being done are easy to estimate because they have a high similarity with projects that have already been done but for the most part capacity\demand data derived from project schedules should be looked at as ‘fuzzy’ if the time period of the data is farther out than a few months and even fuzzier if it is more than a year out.

There are decisions that can be made based on this data but they should be made with the knowledge that those numbers could swing wildly in some cases depending on changes to the project as it moves forward. The adage that some data is better than no data holds true for the most part but ‘some data’ that is highly suspect but still used in the decision making process as if it was certain is worse than no data.

When you are looking at data that depends on the quality of your schedule estimates and project WBS you need to think about that quality when you make decisions based on that data. Where are those estimates coming from? Are they top-down estimates (like many that are that far out into the future) or are they bottoms-up estimates coming from the resources that will do the work (hard to do when the tasks in question are months or even over a year in the future?

To RBS or Not to RBS?

There can be confusion among those deploying Project Server about if they need to define and use an RBS as part of their security structure. There is lots of information and a lot of opinions. Here is more information and one more opinion. Hopefully one that rings true in your experience.

When you Need RBS

In my experience the use of an RBS is only needed if you need to limit access to project or resource data based on some kind of structure. This structure is almost always an organizational structure.

  • Organization 1
    • 1.1
      • 1.1.1
      • 1.1.2
    • 1.2
      • 1.2.1
  • Organization 2
    • 2.1
      • 2.1.1
    • 2.2
      • 2.2.1

For example if you need to make sure that a Project Server user who sits at 1.2 on the org structure can ONLY see Projects that are managed by or worked on by users at or below 1.2 or a user who sits at Organization 2 cannot see Projects inside Organization 1 then you need to have an RBS in place.

When you Don’t Need RBS

If your security needs are based on role rather than on organization then your don’t need RBS. An example of this is when Project Managers need Write access to their own projects and read access to all other projects and other roles such as managers need read access to all projects. So if the organization a user is in does not have a direct impact on the projects or resources they can see then you don’t need an RBS.

 

For sure there are shades of several colors here but this is the gist. I look forward to your comments.

Posted by brianken | 0 Comments
Filed under:
More Posts Next page »
 
Page view tracker