Cascade Skyline - with Microsoft Logo and Project Support header - author Brian Smith

May, 2012

  • Brian Smith's Microsoft Project Support Blog

    Project Server 2007: Reporting (Project Publish) queue job fails to complete

    • 14 Comments

    ** Update 6/27/2012 - The June 2012 CU is available.  Project Server 2007 - http://support.microsoft.com/kb/2687258 - the Office Server package (Includes Project Server)  - http://support.microsoft.com/kb/2687256 No clean up required - the June CU will stop the problem happening. ***

    *** Update 10/16/2013 If you happened upon this post and are using Project and Project Server 2013 then we can confirm this has been identified as an issue there too - and fixed in the October 2013 Cumulative update for Project Server 2013 - http://blogs.technet.com/b/projectsupport/archive/2013/10/15/microsoft-project-server-2010-and-2013-october-2013-cu-announcement.aspx The macro option will usually work too - but we have seen cases where manually scheduled tasks or date constrained tasks will not be corrected by the macro. ***

    This is an issue that several of my readers raised in response to the posting about the orphan baseline posting a few weeks ago, and we know that this is something that more and more customers are now hitting.  The problem was introduced with the February 2012 Cumulative Update for Project Server 2007, and was also present in the April CU too – so if you have installed either of these and have started seeing Reporting (Project Publish) queue job fails to complete then read on.

    The symptoms are that a project will successfully save and publish, but the Reporting (Project Publish) job will fail to complete, and the error will look something like this (truncated – but the ReportingProjectChangeMessageFailed piece will be repeated based on your queue setting for the retry limit.

    Error summary/areas:
    Reporting message processor failed
    ReportingProjectChangeMessageFailed
    Queue
    GeneralQueueJobFailed
    Error details:

    <?xml version="1.0" encoding="utf-16"?>
    <errinfo>
      <general>
        <class name="Reporting message processor failed">
          <error id="24006" name="ReportingProjectChangeMessageFailed" uid="d120becb-26a3-4fbe-8341-38a5c273453d" QueueMessageBody="Project UID='0b9e52ec-6bb6-4ca3-823b-d7561d821d1c'. PublishType='ProjectPublish'" Error="Object reference not set to an instance of an object." />
        </class>
        <class name="Queue">
          <error id="26000" name="GeneralQueueJobFailed" uid="4c6270ce-0735-44b3-ac1c-59bb0ff69efc" JobUID="a4a1f651-0997-4770-8099-efe02340967a" ComputerName="BRISMITH2007" GroupType="ReportingProjectPublish" MessageType="ReportProjectPublishMessageEx" MessageId="1" Stage="" />
        </class>
      </general>
    </errinfo>

    The issue occurs because we are missing a NULL check when accessing the task baseline cost – so if it is NULL we get the “Object reference not set to an instance of an object” message.  We are working on a hotfix to correct this behavior, but we also have a workaround that can provide some immediate relief.  This is a macro that can be run on affected project and will set a zero (non-NULL) assignment baseline fixed cost in place of the NULL we are tripping up on.  Below is the macro code that will need to be added to Project in the macro editor, and executed against the plan.  DISCLAIMER: As with any macro code you should review and understand exactly what this code is doing and that you are comfortable to run this on your own plans (and read the disclaimer) – and should also execute this in a test environment first.  It would also be good practice to take an Administrative Backup in your production system to ensure you have good backup copies of your plans (in addition to any normal SQL Server backup).  Also worth mentioning at this point that you should really have the number of project administrative backups set to give you several versions of your plan (Project Retention Policy (versions) – under Server Settings, Database Administration, Schedule Backup.

    'DISCLAIMER OF WARRANTY
    '
    'THIS FIX CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
    'MICROSOFT FURTHER DISCLAIMS ALL IMPLIED WARRANTIES INCLUDING WITHOUT
    'LIMITATION ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR OF FITNESS
    'FOR A PARTICULAR PURPOSE. THE ENTIRE RISK ARISING OUT OF THE USE OR
    'PERFORMANCE OF THE CODE REMAINS WITH YOU.
    '
    'IN NO EVENT SHALL MICROSOFT OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES
    'WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
    'BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
    'OR OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
    'THIS MACRO, EVEN IF MICROSOFT HAS BEEN ADVISED OF THE POSSIBILITY OF
    'SUCH DAMAGES. BECAUSE SOME STATES DO NOT ALLOW THE EXCLUSION OR
    'LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE
    'ABOVE LIMITATION MAY NOT APPLY TO YOU.

     

    'This macro attempts to work around the reporting publish failure that occurs when there are tasks
    'with baselines and where the BaselineCost contour is NULL. The symptoms that you see in the queue
    'for the "Reporting (Project Publish)" job has details similar to:
    '
    '<class name="Reporting message processor failed">
    '<error id="24006" name="ReportingProjectChangeMessageFailed"
    'uid="c72e20a7-9b7f-487b-9da2-19460b2e6c32"
    'QueueMessageBody="Project UID='8e074f24-1064-47dd-bce5-c2dad8d556c8'.
    'PublishType='ProjectPublish'" Error="Object reference not set to an instance of an object." />


    'This code simply walks through the tasks in the tasks in the project and if there are
    'baseline(s) set, then the code sets a time scaled baseline cost = 0 on the day prior to
    'where the baseline start is scheduled.  This sets the baseline contour so that the
    '"Object reference not set to an instance of an object" problem can be overcome during the
    'reporting publish job.

    Sub FixPublish()

    Dim t As Tasks
    Dim tsv As TimeScaleValues
    Dim i As Long
    Dim bCalc As Boolean

    On Error Resume Next

    'get the current application calculation state
    bCalc = Application.Calculation
    'set calculation to manual (helps with performance while the code runs)
    Application.Calculation = pjManual

    Set t = ActiveProject.Tasks

    'walk through the tasks in the project. If a task as a baseline(s) then set a timescaled baselinecost = 0
    For i = 1 To t.Count
        If Not t(i) Is Nothing Then
            If t(i).BaselineStart <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).BaselineStart - 1, t(i).BaselineStart - 1, pjTaskTimescaledBaselineCost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline1Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline1Start - 1, t(i).Baseline1Start - 1, pjTaskTimescaledBaseline1Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline2Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline2Start - 1, t(i).Baseline2Start - 1, pjTaskTimescaledBaseline2Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline3Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline3Start - 1, t(i).Baseline3Start - 1, pjTaskTimescaledBaseline3Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline4Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline4Start - 1, t(i).Baseline4Start - 1, pjTaskTimescaledBaseline4Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline5Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline5Start - 1, t(i).Baseline5Start - 1, pjTaskTimescaledBaseline5Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline6Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline6Start - 1, t(i).Baseline6Start - 1, pjTaskTimescaledBaseline6Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline7Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline7Start - 1, t(i).Baseline7Start - 1, pjTaskTimescaledBaseline7Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline8Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline8Start - 1, t(i).Baseline8Start - 1, pjTaskTimescaledBaseline8Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline9Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline9Start - 1, t(i).Baseline9Start - 1, pjTaskTimescaledBaseline9Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
            If t(i).Baseline10Start <> "NA" Then
                Set tsv = t(i).TimeScaleData(t(i).Baseline10Start - 1, t(i).Baseline10Start - 1, pjTaskTimescaledBaseline10Cost, pjTimescaleDays)
                If tsv(1).Value = "" Then
                    tsv(1).Value = 0
                End If
            End If
        End If
    Next

    'fix the project summary task
    With ActiveProject.ProjectSummaryTask
        If .BaselineStart <> "NA" Then
            Set tsv = .TimeScaleData(.BaselineStart - 1, .BaselineStart - 1, pjTaskTimescaledBaselineCost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline1Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline1Start - 1, .Baseline1Start - 1, pjTaskTimescaledBaseline1Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline2Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline2Start - 1, .Baseline2Start - 1, pjTaskTimescaledBaseline2Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline3Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline3Start - 1, .Baseline3Start - 1, pjTaskTimescaledBaseline3Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline4Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline4Start - 1, .Baseline4Start - 1, pjTaskTimescaledBaseline4Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline5Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline5Start - 1, .Baseline5Start - 1, pjTaskTimescaledBaseline5Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline6Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline6Start - 1, .Baseline6Start - 1, pjTaskTimescaledBaseline6Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline7Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline7Start - 1, .Baseline7Start - 1, pjTaskTimescaledBaseline7Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline8Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline8Start - 1, .Baseline8Start - 1, pjTaskTimescaledBaseline8Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline9Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline9Start - 1, .Baseline9Start - 1, pjTaskTimescaledBaseline9Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
        If .Baseline10Start <> "NA" Then
            Set tsv = .TimeScaleData(.Baseline10Start - 1, .Baseline10Start - 1, pjTaskTimescaledBaseline10Cost, pjTimescaleDays)
            If tsv(1).Value = "" Then
                tsv(1).Value = 0
            End If
        End If
    End With
               
    'set the application calculation state back the way it was
    Application.Calculation = bCalc
               
    End Sub

    To use this macro you can follow these steps:

    1. Open Project Professional 2007 and connect to your server instance having the problem.

    2. Go to Tools > Macro > Security.

    3. Note the Security Level.

    4. Set Security Level to Low or Medium.  This will allow the macro to run.

    5. Go to Tools, Macro, Visual Basic Editor (or alt+F11)

    6. Copy the text from the macro above, from the first line of the disclaimer to the End sub line

    7. Double click ThisProject in the Visual Basic Editor, and paste in the macro to the window that opens (probably titled Project1 – ThisProject(Code)

    8. Save this plan as a file if you need to use again, as FixPublishError.mpp, and return to the normal Microsoft Project view (Alt+F11)

    9. Open the plan whose Reporting (Project Publish) job fails.

    10. Go to Tools > Macro > Macros…

    11. Select the FixPublishError.mpp!FixPublish macro.

    12. Click Run. It will take a few seconds to a minute for the macro to run.

    13. Save and publish the plan.

    14. Monitor the queue by going to PWA > Personal Settings > My queued jobs.

    15. Confirm that the jobs related to your plan complete successfully.

    16. Reset Security Level to what is was before changing it to Low.

    There is one condition that currently isn’t resolved by the macro, and that relates to hitting the NULL value for any ghost tasks you might have in your plan (these can exist due to dependencies on tasks from other plans).  It is possible that this will be resolved if the source project has already been fixed up – we are still reviewing this.

    Thanks to Adrian for the fix up macro, Sriram for helping get this blog post out and for DFS and Christoph for the posts on my blog raising the issue.

    Sorry for the inconvenience this issue has caused you, and I will update this post as we get more information regarding a more permanent fix.

    Finally here are some lines from the ULS logs that relate to this problem – just to ensure that the search engines have something to digest and to help those searching on these terms.

    05/23/2012 10:38:09.29    Microsoft.Office.Project.Server (0x0AE4)    0x0EE8    Project Server    Project Server Reporting    9e09    High    PWA:http://servername/PWA, SSP:SharedServices1, User: DOMAIN\User, PSI:   [RDS] ReportProjectPublishMessage for project 0b9e52ec-6bb6-4ca3-823b-d7561d821d1c failed. Error: System.NullReferenceException: Object reference not set to an instance of an object.     at Microsoft.Office.Project.DataEdit.Reporting.ReportingData.GetTaskBaselineCoreTimephasedDataSet(BaselineEntity[] baselineEntityArray, Int32 nIntervalLengthMinutes)     at Microsoft.Office.Project.Server.DataAccessLayer.ReportingProjectDal.TransferTimephasedData[T](Guid projectUID, TimephasedTransferInfo transferInfo, ReportingData timephasedReportingData, ProcessSourceData`1 processSourceData, GenerateTimephasedDataSet`1 generateTimephasedData, Int32 pageSize, LogStatsMethod logStats)     at Microsoft.Office.Project.Server.DataAccessLayer.ReportingProjectDal.UpdateTasksTimephasedData(Guid projectUID, ReportingProjectData projectData, ReportingData timephasedReportingData, Int32 pageSize, String& transferPhase, LogStatsMethod logProjStats)     at Microsoft.Office.Project.Server.BusinessLayer.ReportingLayer.ProjectPublishMessageProcessor.SaveProjectTimephaseData(String& transferPhase)     at Microsoft.Office.Project.Server.BusinessLayer.ReportingLayer.ProjectPublishMessageProcessor.runRDSTransformation(ReportProjectPublishMessageEx projectChangeMessage). Phase: SetAssignmentBaselineTimephasedFixedCost    3ff34f2c-815e-4f95-9798-7f17dc5737db

    05/23/2012 10:38:09.29    Microsoft.Office.Project.Server (0x0AE4)    0x0EE8    Project Server    Project Server Reporting    9e05    Critical    Standard Information:PSI Entry Point:   Project User: Domain\User Correlation Id: 3ff34f2c-815e-4f95-9798-7f17dc5737db  PWA Site URL: http://servername/PWA  SSP Name: SharedServices1  PSError: ReportingProjectChangeMessageFailed (24006) RDS: The request to synchronize change(s) to project Project UID='0b9e52ec-6bb6-4ca3-823b-d7561d821d1c'. PublishType='ProjectPublish' failed.  Message: 'ReportingProjectChangeMessageFailed'  Error:Object reference not set to an instance of an object.    3ff34f2c-815e-4f95-9798-7f17dc5737db

    05/23/2012 10:38:10.30    Microsoft.Office.Project.Server (0x0AE4)    0x0D18    Project Server    Project Server Queue    7h5x    Medium    PWA:http://servername/PWA, SSP:SharedServices1, User: DOMAIN\SSPAdmin, PSI:   [QUEUE] ProjectQ: Group  d4364343-3402-45ef-afd0-f84c8834e5d3 type = ReportingProjectPublish aborted at Message 1    e45e8c63-38fa-49d8-9555-710851b22c90

  • Brian Smith's Microsoft Project Support Blog

    Project 2010: Problems since the February CU if you have a semi-colon (;) as your list separator

    • 6 Comments

     

    *** 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:

      • You create an .mpp file that was saved from a Project server by using the Save for Sharing command. When you try to resave the .mpp file back to the Project server in Project 2010, the save process fails, and you receive the following error message:
        • Project Server was unable to find the specified resource. If the problem continues, contact your server administrator.
      • This issue occurs when the list separator character that is contained in resource names within the .mpp file on the client differs from the list separator character on the server.

    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:

     

      • Using Task Information dialog to remove or add resource assignments to a task
      • Using the Assign Resources dialog to add multiple resource assignments
      • Using the Task Information Dialog to set predecessors or successor information

    *** 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:

    image

    Then you add Fiessinger; Christophe – and click OK – then you will see this:

    image

    That doesn’t look quite right?  Opening up the Task Information dialog again I see:

    image

    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.

      image

    However, if I choose a resource with no list separator in the name the Assign button is active:

    image

    The further issue with the Assign Resources comes when you make multiple selections that do not contain the list separator, such as the following:

    image

    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.

    image

    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,

    image

    then press OK, we get the following error message.  There is a problem with the predecessor information.

    image

    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 Smith's Microsoft Project Support Blog

    If you didn’t get to Phoenix…

    • 1 Comments

    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!

  • Brian Smith's Microsoft Project Support Blog

    Troubleshooting sessions from the Project Conference 2012

    • 0 Comments

    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

  • Brian Smith's Microsoft Project Support Blog

    Project Server 2010: Orphan baselines breaking the reporting publish

    • 16 Comments

    *** Update 7/31/2013 - This was fixed in the June 2012 Cumulative Update for Project 2010 – and was a client fix - http://support.microsoft.com/kb/2598351.  Customers can load the latest Cumulative Update for Project 2010 and it will include this fix.  The fix will stop the problem happening again but does not fix up any existing issues – so they may need to clean up the database using the guidance below.  If you need help then open a support incident with us – we do not charge for bug related incidents – so we can help you through this.  You should also use the feature on the server to control which patch level  of Project 2010 can connect to Project Server to ensure that this problem is not re-introduced by a user with an unpatched version of Project 2010. ***

     

     

    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

    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).

    image

    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)

    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)

    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

Page 1 of 1 (5 items)