*** Update - The issue reported in this blog was fixed in the August 2012 client CU - support.microsoft.com/.../2687386 ***
In the February Cumulative Update for Project 2010 we fixed an issue described as:
We are now finding that in fixing this, we broke a couple of other things that you may be running into if you are using a list separator that is a semi-colon (;). This is most likely in Europe or Canada, but I’m sure there are plenty of other places that could see this too. The issues are all related and we are working on a fix for them all, but just wanted to share some workarounds in case you are hitting these. The different scenarios I have seen so far are:
*** Update - For Spanish readers - http://blogs.technet.com/b/elfarodeprojectserver/archive/2012/05/17/project-2010-problemas-desde-el-cu-de-febrero-2012-si-tenemos-un-punto-y-coma-como-separador-de-lista.aspx ***
So here are some examples of what can go wrong – and these examples need certain settings to be in place before you would ever see them, so don’t feel left out if you don’t experience any of these issues.
This first example assumes you have the semi-colon as list separator and also this is used in your resource names as a separator between first and last names. So you have a task that is already assigned to Smith; Brian and Jenkins; Adrian, and you want to add Fiessinger; Christophe. So initially your Task Information dialog looks like this:
Then you add Fiessinger; Christophe – and click OK – then you will see this:
That doesn’t look quite right? Opening up the Task Information dialog again I see:
It has split each name in two, and created 6 new local resources – and assigned them. A couple of things here – it will not lose actual work – any assignments that already have work will be OK – and will not get un-assigned – but the extra local resource will still get created. Undo will also put things right. The same thing can occur even if you are removing a resource using this same dialog. If I removed Jenkins; Adrian, it would create Smith and Brian as two local resources. The workaround here is to use the Resource Names column in one of the views such as the Gantt view – and select/deselect from the drop down.
The second issue is with the Assign Resources dialog (which is why it isn’t a good workaround for the first issues) and it has a couple of different scenarios depending on your use of the list separator in the resource names. If you do have the separator – like the example above – then you cannot assign from the Assign Resources dialog – the Assign button is disabled – as I show here.
However, if I choose a resource with no list separator in the name the Assign button is active:
The further issue with the Assign Resources comes when you make multiple selections that do not contain the list separator, such as the following:
When I click Assign – I see an extra resource in my list, with a very cool name – “adrian jenkins;brian smith;christophe fiessinger” – and he/they has/have been assigned to the task.
If I look at the resource sheet I can see “adrian jenkins;brian smith;christophe fiessinger” has been added as a new local resource. The workaround here, assuming you do not have the list separator in the name, is to assign one at a time, or of course the Resource Name column in the Gantt view can be used as for the previous example.
The last scenario is back to the Task Information dialog, but this time we are looking at the Predecessors tab. Say we have 3 tasks, T1, T2, and, you guessed it, T3. We open the Task Information dialog for T3, go to the Predecessors tab and enter either the IDs of the first two tasks, or select them in the drop down like this,
then press OK, we get the following error message. There is a problem with the predecessor information.
The workaround for this one is to go to a view such as the Gantt view, and use the Predecessors column, and enter 1,2.
For each of these you could also work around them by setting your list separator to not be the semi-colon – but I appreciate that might give you some issues elsewhere – as it is a global setting on your PC. If you wish to try this you can go to Control Panel - Clock, Language and Region - Change the date, time or number format, then select Additional Settings then change the List Separator from a semi-colon to a comma, for example.
Sorry for any inconvenience this problem has caused you – and I will update this posting once I find out when a fix will be coming along – and potentially any other scenarios that I am made aware of where this bug rears its ugly head, and thanks to the customers that have quickly brought this to our attention.
Brian Ru just published a blog post over on the main Project blog announcing the release of all the recorded content from the Project Conference 2012 – on the Project Channel of Microsoft Showcase. So if you didn’t get to Project Conference 2012 this is a great chance to catch up with all the great content. For good support topics see PC319 and PC349 – as recently “leaked” on this very blog…
Enjoy!
Just noticed that the Microsoft Project channel on Microsoft Showcase is hosting the sessions that Adrian and I did at this year’s Project Conference. We covered a few different scenarios and tools that we use in our day to day jobs.
We presented in two parts – part one was called PC319 and can be found at http://aka.ms/uhuix1 and part two was PC349 and can be found at http://aka.ms/frd1nl. Other sessions are available too.
I might also try and embed these – so they may appear below soon… (success!)
PC319
PC349
This problem has been around for a while and I know some customers were running into it very soon after the release, but we had been struggling to get a repro and understand exactly what was causing it. We now understand the root cause and have a fix coming hopefully in the June 2012 Cumulative Update for Project Professional 2010 (no promises – but that is the current target) and there are some ways of working that can limit your chances of running into this – so decided we should share this to avoid continued inconvenience until we get the fix out there.
First lets take a look at the symptoms. The most usual indication of the problem, as the title suggests, is orphan baseline values leading to the error when publishing – a Failed But Not Blocking Correlation problem on a Reporting (Project Publish) job that will show several of the following errors if you click through for the error details:
ReportingProjectChangeMessageFailed (24006) - The INSERT statement conflicted with the FOREIGN KEY constraint "FK_MSP_EpmTaskBaseline_ProjectUID_TaskUID". The conflict occurred in database "ProjectServer_Reporting", table "dbo.MSP_EpmTask". The statement has been terminated.. GeneralQueueJobFailed (26000) - ReportingProjectPublish.ReportProjectPublishMessageEx
ReportingProjectChangeMessageFailed (24006) - The INSERT statement conflicted with the FOREIGN KEY constraint "FK_MSP_EpmTaskBaseline_ProjectUID_TaskUID". The conflict occurred in database "ProjectServer_Reporting", table "dbo.MSP_EpmTask". The statement has been terminated..
GeneralQueueJobFailed (26000) - ReportingProjectPublish.ReportProjectPublishMessageEx
These failures are for the reporting job – so will mean that reports based on the reporting database, and any fresh OLAP cube builds could be missing data.
Sometimes there may also be a crash on saving, either with a fairly generic MSSOAP 16 Send Incomplete error from Project Professional 2010 (though a subsequent save will work fine), or from PWA a queue error -
GeneralQueueException (9131) A Project Operation failed due to a Queue Exception. Sub Job ID is: . Exception details are: System.NullReferenceException: …at Microsoft.Office.Project.DataEdit.Assignments.AssignmentCalendarUpdateHelper.ConvertActualContourToElapsed(,,,
There may then be issues with users accessing timesheets – The view failed to load. Press OK to reload this view… (and OK will not help).
The error that will be found in the ULS logs will refer to a Calendar whose UID cannot be found…
Exception occurred in method Microsoft.Office.Project.Server.BusinessLayer.Statusing.StatusingGetMyWorkForGridJson System.InvalidOperationException: CacheProjectBaseCalendars could not find project calendar for project. CalUid=0c13de33-2a07-4310-b091-c77990d9dd6a
The root of all these issues is that when you use any of the Save & Send options (XML, CSV, Excel etc.) that we are incorrectly changing some of the GUIDs associated with entities such as the tasks and calendars. Now this isn’t affecting the main tasks and assignment GUIDs as these bad values are not persisted back to the database – but we do however create a new baseline for these non-existent new task GUIDs, and can also save a bad calendar GUID – which leads to the Timesheet problem.
First the best way to avoid this issue, and then on to the detection and clean up at the database level.
If you do need to use Save & Send then the best practice until we release the fix for this is to first save the plan to the server, and publish if you need to. Then do whatever you need to with Save & Send, and then immediately after this – close and check in the plan – but do not re-save to the server. Discard changes if it asks – but of course you will have needed to save BEFORE you did the Save & Send (just making sure you are paying attention) to avoid losing any changes you really needed. As the bad stuff will also get persisted to the local cache, this is one of those rare occasions when you will find me suggesting that the project is removed from the local cache – after ensuring that the save and check-in completed successfully.
WARNING – the following steps are direct queries against the Project Server databases – please be sure you are working against the right databases when using these – and have a database backup should any problems occur.
The detection of this condition is pretty straightforward, as we are just looking for baselines that exist for a task that does not exist, so the following query executed against the Draft database will do this (Change the name to match your specific DBs – the default ProjectServer_ names are used below:
-- Detect for orphan baseline task records that can cause reporting publish job failures. USE ProjectServer_Draft -- specify the appropriate draft database select PROJ_NAME, MTB.PROJ_UID,TASK_UID,TB_BASE_NUM from MSP_TASK_BASELINES MTB inner join MSP_PROJECTS MP on MTB.proj_uid=MP.proj_uid where TASK_UID not in (select TASK_UID from MSP_TASKS)
-- Detect for orphan baseline task records that can cause reporting publish job failures.
USE ProjectServer_Draft -- specify the appropriate draft database
select PROJ_NAME, MTB.PROJ_UID,TASK_UID,TB_BASE_NUM from MSP_TASK_BASELINES MTB inner join MSP_PROJECTS MP on MTB.proj_uid=MP.proj_uid where TASK_UID not in (select TASK_UID from MSP_TASKS)
This will return rows if the condition exists – and identify which projects – as before clean-up you will probably want to get them removed from the PM’s local cache as otherwise they could be re-introduced.
The next scripts do the cleaning up in the DB, and they are simply deleting baseline records where the tasks are non-existent.
-- Script to run on the draft DB USE ProjectServer_Draft -- specify the appropriate draft database delete from MSP_TASK_BASELINES where TASK_UID not in (select TASK_UID from MSP_TASKS) -- Script to run on the published DB USE ProjectServer_Published -- specify the appropriate published database delete from MSP_TASK_BASELINES where TASK_UID not in (select TASK_UID from MSP_TASKS)
-- Script to run on the draft DB USE ProjectServer_Draft -- specify the appropriate draft database
delete from MSP_TASK_BASELINES where TASK_UID not in (select TASK_UID from MSP_TASKS)
-- Script to run on the published DB USE ProjectServer_Published -- specify the appropriate published database
I hope this helps to understand the nature of the issue and ways to avoid it until the fix comes along. Our apologies for the inconvenience I know this has caused many of our customers – and hopefully for those who have needed to re-run the clean-up scripts regularly this may give a way to reduce the pain.
If you need any assistance with these steps then feel free to open a support incident – and when I say free I mean free – this is a bug and we do not charge for incidents that are due to bugs (or we will refund – which amounts to the same thing).
The ULS log entry associated with the initial Queue errors above (for the benefit of the search engines):
05/01/2012 11:57:55.67 Microsoft.Office.Project.Server (0x1D74) 0x335C Project Server Reporting atwj Critical Standard Information:PSI Entry Point: Project User: REDMOND\brismith Correlation Id: e1f4e953-7dea-448a-a528-709075c698bf PWA Site URL: http://brismith8100/PWA SSP Name: Project Server Service Application PSError: ReportingProjectChangeMessageFailed (24006) RDS: The request to synchronize change(s) to project Project UID='216733b0-e194-469a-afc3-9235da4ce4c1'. PublishType='ProjectPublish' failed. Message: 'ReportingProjectChangeMessageFailed'. Message Body: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_MSP_EpmTaskBaseline_ProjectUID_TaskUID". The conflict occurred in database "ProjectServer_Reporting", table "dbo.MSP_EpmTask". The statement has been terminated. Error:(null) e1f4e953-7dea-448a-a528-709075c698bf
and for the Timesheet error:
05/01/2012 12:13:29.65 w3wp.exe (0x2444) 0x23D8 Project Server Task Statusing and Updates btw9 High CacheProjectBaseCalendars: could not locate data for calendar 0c13de33-2a07-4310-b091-c77990d9dd6a for project 216733b0-e194-469a-afc3-9235da4ce4c1 e5dd4eaf-551a-469b-a3e0-1f60e2f3d1af
05/01/2012 12:13:29.85 w3wp.exe (0x2444) 0x23D8 Project Server General 0000 Exception Exception occurred in method Microsoft.Office.Project.Server.BusinessLayer.Statusing.StatusingGetMyWorkForGridJson System.InvalidOperationException: CacheProjectBaseCalendars could not find project calendar for project. CalUid=0c13de33-2a07-4310-b091-c77990d9dd6a at Microsoft.Office.Project.Server.BusinessLayer.TimePhasedDataAccess.CacheProjectBaseCalendars() at Microsoft.Office.Project.Server.BusinessLayer.TimePhasedDataAccess..ctor(StatusingPageLoadDataSet dataset) at Microsoft.Office.Project.Server.BusinessLayer.Statusing.ReadStatusTimephasedDataForResource(IList`1 gridChanges, Guid[] vAssnUids, IDictionary`2 assn2proj, StatusingTimephasedPeriod[] tpdPeriods, DateTime tpStart, DateTime tpEnd) at Microsoft.Office.Project.Server.BusinessLayer.Statusing.<>c__DisplayClass57.<CreateTimephasedDataColumnFiller>b__56(IEnumerable`1 Keys) at Microsoft.SharePoint.JSGrid.GridSerializer.BuildOutput() at Microsoft.SharePoint.JSGrid.GridSerializer.ToJson(Serializer s) at Microsoft.SharePoint.JsonUtilities.Serializer.SerializeToJson(Object o) at Microsoft.Office.Project.Server.BusinessLayer.Statusing.GetMyWorkForGridJson(JsGridSerializerArguments gridSerializerArgs, String gridChangesJson, String projectAssignmentsMap, Guid viewUid, String timephasedStart, String timephasedEnd, Byte pane, Int32 durationType, Int32 workType, Int32 dateFormat, Boolean clearPersistedProperties, Nullable`1 rowFilterType) at Microsoft.Office.Project.Server.Wcf.Implementation.PWAImpl.StatusingGetMyWorkForGridJson(JsGridSerializerArguments gridSerializerArgs, String gridChangesJson, String projectAssignmentsMap, Guid viewUid, String timephasedStart, String timephasedEnd, Byte pane, Int32 durationType, Int32 workType, Int32 dateFormat, Boolean clearPersistedProperties, Nullable`1 rowFilterType) e5dd4eaf-551a-469b-a3e0-1f60e2f3d1af
In case you missed it over on the Admin blog site – the April CU announcement went out last week. This covers the April 2012 Cumulative Update (CU) for Microsoft Project 2010, Microsoft Project Server 2010, Microsoft Office Project 2007 and Microsoft Project Server 2007. More details see http://blogs.technet.com/b/projectadministration/archive/2012/04/27/microsoft-project-server-and-sharepoint-server-2007-and-2010-april-2012-cu-announcement.aspx.
The Project Server 2010 April 2012 CU also includes the fix for the duplicate Custom Field problem (unknown error in Project Center relating to filters, and also duplicates displayed in the PDPs) that was released just around the time of the February CU, please see the KB at http://support.microsoft.com/kb/2598251 for the detection and clean up scripts if you suffered from this issue.