Wednesday, November 26, 2014

Very simple oData Portfolio Report #projectserver

Reporting in Project Server 

Yes I know you have PWA for showing a cross-project view of the world, but it's not the most customisable is it.

With Project Centre and Project Schedule views being the primary value add of Project Server, it's a shame is just not a bit more... useful!  You could show milestones, have easier filter options (one click not 4) that kinda thing.

So lots of people ask "can I have Project Centre, but in a report please".

OK, here you go...

This is made up of just a couple of components:

1) a simple oData feed to the Project View table
2) some formulas to do the drawing
3) Slicers to drill down into the portfolio
4) Status date grid highlight (where set on the project) - this is done using another grid formula

The report shows a couple of example view options (date periods to show), handled by the formulas

This can then be published onto any SharePoint site as a Portfolio view, e.g. IT Customer Portal, reducing 


Office 365 just started to make sense


Microsoft have redesigned O365 into a meaningful portal to all Office Online products

However the upgrade does seem to have caused some authentication glitches along the way!

And by the way if you have lost your Site Admin bit, its here...

Tuesday, August 19, 2014

August Cumulative Update

Have I been waiting on this patch :)

Project Server August Cumulative Update 2014 looks like a biggy guys.  If you use Timesheets, or Task Status Updates, or even just Baseline, this patch is the place to be.  Looks like the Scheduling/Project Calculation Service has had a rework....

Project Pro 2013 August Cumulative Update 2014 also looks significant for anyone saving projects OUT of Project Server or working with Protected Actuals

Monday, July 28, 2014

#projectserver Generic Resources with 0% capacity skew FTE calculations in resource plans

** Update **
Having looked at the data, the general rules are now 

  • Dont use TAP flag unless it is explicitly for the Team Assignments functionality (which no-one uses anyway)
  • And if you want to use Generic Resources on Resource Plans using FTE planning, make sure (for now) that they have some capacity, and design this out of your capacity planning reports.

Generic Resource Capacity

in times gone by I have picked up the habit of using the "Team Assignment Pool" flag on Generic Resources to avoid setting the Max Units to 0% and still have zero capacity for the resources in the RDB.  This was a throwback to the heady days of PS2007 and its complete lack of stability (0% resources used to cause havoc when using the Assign Resources dialogue in MS Project).

It looks as if this is a habit I am going to have to break.

Today I have found a new issue in Resource Plans on PS2013 where setting the Team Assignment Pool OR setting Max Units to 0% on a resource has a negative effect on the FTE calculation.


  • Create three generic resources (r1, r2, r3)
  • set R1 with Max Units = 0% and Team Assignment Pool is No
  • set R2 with Max Units = 100% and Team Assignment Pool is Yes
    These are the two trouble settings
  • Set R3 with Max Units = 100 and Team Assignment Pool is No
    this one should work fine
Now create a new project and assign these three resources to the Resource Plan
  • Set Timescale = Weeks
  • Set units = FTE
Now enter one FTE for each resource across the periods and save

Now, when switching Units to Hours you will see two of the resources (R1 and R2) will have more hours per week than R3.  In my environment, R3 had 40 hours per week and R1/2 had 54 (no idea where 54 came from)

So this takes us into some further thinking on this:
  • How on earth is the FTE calculation working this out?
  • Does PS now assume Generic Resources do not have capacity elsewhere in the tool (such as the little used and mostly redundant Resource Availability chart, MSP_EpmResourceByDay capacity data, OLAP, etc) as this will have a significant bearing on how we use Generic Resources going forward.

In my mind Generics are buckets of planned work.  They do not have capacity in most scenarios.  They may (or may not) be used as Team Assignment Pool resources (if the functionality was useful).  They should not be included in Capacity calculations but MUST contribute towards the total Team demand.  I have never found another useful "capacity" based solution for these guys, so why on earth do we continue with capacity numbers for them.

So, a word to the wiser.  If you want to use Resource Plan FTE scheduling, leave your generic resources with capacity or see strange results.

I am going to go find out whether i need to update my capacity planning reports now :(

I decided to do a quick check on what exactly 2013 is doing from a Generic Capacity perspective these days

  • The use of Team Assignment Pool removes the resource completely from the MSP_EPMResourcebyDay table so no capacity can be held.  This is probably a tad extreme and could break some reports where joins don't allow for this
  • Use of 0% Max Units zeros capacity in the ByDay table as you would want, and doesn't seem to cause any issues with assigning resources (I didn't expect it would any more, but it's always good to check).  
  • User of >0% Max Units adds capacity to the resource data as you would expect.

Tuesday, July 22, 2014

#ProjectOnline #ProjectServer #PowerQuery missing timesheet report

This has been painful

Project Online reporting has been a fairly significant limitation of the Online experience for me so far.  Besides the complexity in building the oData stream, the fairly fundamental limitations of the data filtering of the URI's has been a major falling down point for me.

To digress for a moment, most reports people want are timephased in some way, either Actual Work by period, planned work by period, or timesheet data by period.  All of these reports lead to a "time by day" feed.  Now the thing with timephased reports is you are usually looking for a "last three months, next three months" view (or similar).  Also the thing with the Time By Day feeds is that they are HUGE!

Add these things together and you really need a way of limiting your data feed to avoid extremely lengthy refresh times.

Easy enough I hear you say.  Just put a timebyday ge '2014-01-01T00:00:00' select statement in your URI before adding it into your PowerPivot data model.

Yup, that's sweet. However when you come to change the date parameter, two things will happen

1) the table relationships are broken
2) any links within the sheet (pivots, calculations, custom columns in the model) will have to be recreated

Basically - the report breaks or needs to be maintained by someone "with experience" on a periodic basis.

Enter PowerQuery with PowerPivot

The purpose of this blog

So with the above findings for standard PowerPivot limitations, we look at the requirement for a "missing timesheet" report.

1) It should show the status of timesheets for last week
2) it should highlight where a timehseet hasnt been created
3) it should show the hours currently in the timesheet and the timesheet status (where created)
4) It will be run weekly so shouldn't require maintenance, and should refresh fast
5) It should include resource level custom fields (Department, Team, Employment Type)

To do this we need to grab data from the following feeds
1) Timesheets
2) TimesheetLines
3) TimesheetActualDataSet (the time by day data)
4)  Resources

To do this we will use PowerQuery to support the rolling filtering

PowerQuery timephased filtering

There are two really handy functions in PowerQuery that allows you to filter on rolling periods:

( DateTime.FixedLocalNow() ) works as a todays date marker

#duration(n, 0, 0, 0) allows you to stipulate an elapsed number of days (or hours, minutes, seconds) where n is the number of days in question

add these two items together and you can set up a filter on the Time by Day table to show you records that exist where time by day is greater than or equal to for the last 15 days and into the future (in this scenario we're not worried about future hours as there shouldn't be much in timesheets except holiday time, and we will join this data out using the timesheet periods data.  We could add an additional filter if we wished)

FilteredRows = Table.SelectRows(TimesheetLineActualDataSet1, 
   each [TimeByDay] >= (DateTime.FixedLocalNow() - #duration(8, 0, 0, 0))),

The step by step is:

  1. install PowerQuery addin for Excel first :)
  2. create a PowerQuery connection to your ProjectOnline instance using either Windows or Organisatinoal account
  3. use the ProjectData URI
  4. Select the oData stream you want from the list provided in the Navigator panel (lets do the TimesheetLineActualDataset)
  5. once query editor opens, select the timebyday column and create a date filter on it (something like AFTER dd/mm/yyyyy) to set up the filter structure
  6. Apply any other data filters required by your report data definition
  7. now select the VIEW tab, and click Advanced Editor

You should see something like this:

    Source = OData.Feed(""),
    TimesheetLineActualDataSet1 = Source{[Name="TimesheetLineActualDataSet"]}[Data],
    FilteredRows = Table.SelectRows(TimesheetLineActualDataSet1, each [TimeByDay] > #datetime(2014, 7, 1, 0, 0, 0))

The date filter you created is seen here:
 FilteredRows = Table.SelectRows(TimesheetLineActualDataSet1, each [TimeByDay] > #datetime(2014, 7, 1, 0, 0, 0))

And you want to change this to something like this:

FilteredRows = Table.SelectRows(TimesheetLineActualDataSet1, each [TimeByDay] >= (DateTime.FixedLocalNow() - #duration(15, 0, 0, 0))),

Once done to your satisfaction, select Home tab in query editor and select Apply and Close.

In Excel the data table you've created with your filtered query should be returned.  At this point i would double check you are happy wit this.

Now Select your PowerPivot tab and click "Add to Model"

Repeat the above steps for your Timesheet and TimesheetLines data feeds.

Sample TimesheetLines Query

    Source = OData.Feed(""),
    TimesheetLines1 = Source{[Name="TimesheetLines"]}[Data],
    RemovedColumns = Table.RemoveColumns(TimesheetLines1,{"AssignmentId", "CreatedDate", "LastSavedWork", "LCID", "TimesheetPeriodStatusId"}),
    FilteredRows = Table.SelectRows(RemovedColumns, each ([TimesheetPeriodStatus] = "Opened")),
    FilteredRows1 = Table.SelectRows(FilteredRows, each [PeriodEndDate] <= (DateTime.FixedLocalNow() ))

Sample Timesheets Query

    Source = OData.Feed(""),
    Timesheets1 = Source{[Name="Timesheets"]}[Data],
    FilteredRows = Table.SelectRows(Timesheets1, each [EndDate] < (DateTime.FixedLocalNow() )),
    FilteredRows1 = Table.SelectRows(FilteredRows, each [Description] <> "Closed")

Now the important bit....

In order to understand who has not created timesheets, normally in SQL we would use some outer join mechanism to a master list of resources who SHOULD be submitting, so as to know who is NOT IN the master set.  This is because until the timesheet is created, the data is not in the database.

We do this by:

  • Creating the Resource datafeed with the appropriate filters to show only those resouorces who SHOULD be submitting a timesheet
  • Add this to the datamodel
  • Create the relationships in the PowerPivot datamodel (I am going to assume you know how to do this)
  • Create a pivot table based on the datamodel to show submitted hours
  • Convert this pivot to a flat structure (classic display mode, no totaling)

  • now on the tab that has your resource table on it, navigate to the right hand side of the table.  You want to create three custom columns, both using vlookup references to the pivot table you just created.  One example is here, you can work the rest out!

    =IF(ISNA(VLOOKUP([@ResourceName],'Submitted Hours Summary'!B$4:E$200,4,FALSE)),0,VLOOKUP([@ResourceName],'Submitted Hours Summary'!B$4:E$200,4,FALSE))

    This looks at the resource name in the table, finds the name in the Pivot Table and returns either the Total Timesheet Hours, or 0 if a record is not found
  • The three columns you need are
    • Sum of Timesheet Hours
    • Timesheet Status - your ISNA value should be "Not Created"
    • Period ending
  • Once done, make a pivot from the Resource table with the extended columns, adding the Resource Name, Status and Hours Total
  • here's what you end up with is something like this after some quick conditional formatting


Wednesday, July 16, 2014

Three tier #projectserver and custom project site creation failure

1x WFE
1x APP
1x SQL

Web Front End Service on WFE
Project Server enabled on APP

so a traditional 3tier scenario.  nothing complicated

When deploying new Web features to the Farm, you are unable to create a Project Site based on a custom template.

Microsoft.SharePoint.SPException: The site template requires that the Feature {17843394-988a-4a4e-9d5e-8b419bdc1340} be installed in the farm or site collection

Now we know this IS enabled at the SC level.  Only un-installing these features enables the site provisioning to successfully complete.  Redeploying and enabling these features then breaks it again

Well... it turns out the features are required on the server where Project Server is enabled.
as these are site features, that means you have two options
1) enable the Web Front end service on the App Server - which seems like a crazy thing to do to me
2) copy the features from /15/Template/Features from WFE to APP - again, mad mad mad.  Why should you need file system coping?

Anyway, option 1 did resolve the problem and I believe option 2 would also.  But surely neither of these solutions is a real world fix

·         CreateWssSiteContent: Creating project site failed! Project Uid=448aa1e5-5e07-e411-9430-005056010737, site URL=http://siteaddress - activated feature at PWA level, site name=site address activated feature at PWA level. Microsoft.SharePoint.SPException: The site template requires that the Feature {17843394-988a-4a4e-9d5e-8b419bdc1340} be installed in the farm or site collection. at Microsoft.SharePoint.Utilities.SPUtility.ThrowSPExceptionWithTraceTag(UInt32 tagId, ULSCat traceCategory, String resourceId, Object[] resourceArgs) at Microsoft.SharePoint.SPWebTemplateElement.VerifyFeatures(XmlNodeList xmlNodeFeatures, SPWeb applyTemplateToThisWeb, SPFeatureScope featureScope, SPFeatureDependencyErrorBehavior featureDependencyErrorBehavior, List`1& featureDependencyErrors) at Microsoft.SharePoint.SPWebTemplateElement.VerifyFeaturesInWebTemplate(SPWeb applyTemplateToThisWeb, SPFeatureDependencyErrorBehavior featureDependencyErrorBehavior, ICollection`1& featureDependencyErrors) at Microsoft.SharePoint.SPWeb.LoadFeatureWebTemplateContent(SPFeatureWebTemplate featureWebTemplate, SPFeatureDependencyErrorBehavior featureDependencyErrorBehavior, ICollection`1& featureDependencyErrors) at Microsoft.SharePoint.SPWeb.ProvisionWebTemplate(SPWebTemplate webTemplate, String webTemplateToUse, SPFeatureWebTemplate featureWebTemplate, Page page, SPFeatureDependencyErrorBehavior featureDependencyErrorBehavior, ICollection`1& featureDependencyErrors) at Microsoft.SharePoint.SPWeb.ApplyWebTemplate(SPWebTemplate webTemplate, Page page, SPFeatureDependencyErrorBehavior featureDependencyErrorBehavior, ICollection`1& featureDependencyErrors) at Microsoft.SharePoint.SPSite.CreateWeb(String strUrl, String strTitle, String strDescription, UInt32 nLCID, String strWebTemplate, Boolean bCreateUniqueSubweb, Boolean bConvertIfThere, Guid webId, Guid rootFolderId, Boolean createSystemCatalogs, Guid appInstanceId, String appWebDomainId) at Microsoft.SharePoint.SPSite.SPWebCollectionProvider.CreateWeb(String strWebUrl, String strTitle, String strDescription, UInt32 nLCID, String strWebTemplate, Boolean bCreateUniqueSubweb, Boolean bConvertIfThere, Guid appInstanceId) at Microsoft.SharePoint.SPWebCollection.Add(String strWebUrl, String strTitle, String strDescription, UInt32 nLCID, String strWebTemplate, Boolean useUniquePermissions, Boolean bConvertIfThere, Guid appInstanceId) at Microsoft.Office.Project.Server.BusinessLayer.AdminProjectSiteAllocator.CreateSPWeb(ProjectSiteConfigurationInfo configInfo, SPSite topSite):

·         WSSCreateSiteFailure (16400). Details: id='16400' name='WSSCreateSiteFailure' uid='b7860ae6-5e07-e411-942f-0050560104c8' projectUID='448aa1e5-5e07-e411-9430-005056010737' workspaceUrl=siteaddresst - activated feature at PWA level/sitename- activated feature at PWA level' projectWorkspaceName='sitename - activated feature at PWA level'. 

Friday, July 11, 2014

Using the RESUME field to reschedule incomplete work #projectserver

Since MS provided the ability to plan only using PWA, this has been a really useful feature for some users.  However there has always been a (certainly from my perspective) perceived issue, in that the ability to reschedule incomplete work into the future (a key component of the planning cycle) was only available in MS Project client.

The other day I was asked by a customer how they could get around this issue.  They use PWA extensively (cost reasons) for planning but were struggling with realising correct resource forecast data as they PM's were not able to re-forecast their remaining work schedule.

As we had recently patched the Project Server to 2013 SP1 + 0614CU I thought I would look at the STOP/RESUME fields in the Project views to see if these were editable, and surprise surprise they were.

The stop/resume fields are how MS Project handles task splits and the "update remaining work to restart after" component of rescheduling.  The Stop field will indicate the last day that progress was added to the task (either via % Complete or Timephased Actual Work edits/status updates) and by default the resume field will be the next day (or minute, in truth)

If you edit the resume field to a date in the future, then the task becomes split and the remaining work moves forward to restart from that date.

Don't ask me to explain multiple or manual splits.  I can't

Anyhoo... the repro

Firstly create a new project, with one task on it with 10d duration for simplicity of querying, and assign one resource to the assignment and publish the schedule

As the user assigned to the task, complete the first day of actual work and submit

As the Project Owner, approve the task.  Then go into Approval History and publish the assignment

Wait until it publishes

Then open the project in PWA for editing.

Set the Resume date to some time in the future, in this example 18th August
Note the finish date changes

Now query the assignmentbyday table and see the work move forward (ignore the nulls in my results, these have been replaced in my query to make it easier to discern between 0's and 8's!)

Notice that the planned work now has a gap between the 1d actuals assigned and the Resume date of 18 August


Tuesday, July 1, 2014

#projectserver SQL to calculate running totals by month (work, actuals, Baseline)

When calculating running totals (for S-Curve/BurnUp reports) I have had to transform the periodic data returned from SQL into running totals in a pivot or used the running value SQL RS command to transform the data.

So, fast forward to happy SQL2012 land, and we have some useful script commands that can now be used.  Lets face it, our SQL boxes are usually packed to the brim with RAM and Cores these days so why not use them for what they're built for!

The following script calculates the running totals by month by project for all the normal useful measures. I am in no way saying this is an optimised script, it's just my first kick out at this.

In all honesty you'd probably want to remove the _userview references and go to the tables.  

Enjoy, ignore, laugh at the naivety to your hearts content

--SQL Script to return running totals (RTx) for Projects by Month
Select p.ProjectName

select a.Projectuid,dateadd(month,datediff(month,0,a.timebyday),0) as month

,sum(a.assignmentwork) over (PArtition by a.projectuid ORDER BY dateadd(month,datediff(month,0,a.timebyday),0) ) as RTAssnWork

,a.AssignmentWork as work

,sum(a.AssignmentActualWork) over (PArtition by a.projectuid ORDER BY dateadd(month,datediff(month,0,a.timebyday),0) ) as RTAssnActualWork

,a.AssignmentActualWork as Actwork

,sum(a.AssignmentBaseline0Work) over (PArtition by a.projectuid ORDER BY               dateadd(month,datediff(month,0,a.timebyday),0) ) as RTAssnbaseWork
,a.AssignmentBaseline0Work as Basework

from MSP_EpmAssignmentByDay_UserView a 
Group by a.projectuid,dateadd(month,datediff(month,0,a.timebyday),0), AssignmentWork,AssignmentActualWork,assignmentbaseline0work

left join msp_epmproject_Userview p on data.projectuid = p.ProjectUID

group by p.ProjectName,data.month,data.RTAssnWork,data.RTAssnActualWork,data.RTAssnbaseWork

order by p.ProjectName, data.month

Monday, June 23, 2014

Slightly off topic... choosing a new laptop

** Update ** decided to plump for the ThinkPad Yoga on an i7 and 8GB RAM.  I wish there was a 16GB option, and I will miss Quad Core but my back will be much happier! The final deciders were 

1) ability to use it on a train
2) "good enough" screen res (not this stupid high res fad thats going around) 
3) its an i7, even if its only dual core.  
4) It's a nicely made machine.  

Hoping to get it in a couple of weeks

My trusty (not) Lenovo W520 is approaching three years old now, and the heft of this machine is really starting to get to me, or should I say get to my ageing back.  So I reckon it's time to look at replacing her.

When I chose this beast back in 2011, things we're very different.  If I needed to demo SharePoint, I would have to bring along a Windows Server laptop running Hyper-V with some serious RAM and SSD add-ons, which meant my laptop options were limited.  The main contenders were some nameless HP thing, a Dell Precision and the Lenovo W520.

Now this lappy is 6lb or 2.8KG which is bad enough but the power cable weighs about as much as I do, and I think this has contributed to a rather nasty shoulder complaint!

Fast forward to 2014 and we have SharePoint Online, Project Online and decent enough upload speeds on cable to support RDP to my home server, all of which - assuming the customer has a wifi/guest network access point - mean the need for a workstation has dropped significantly.  Even without a network access point i can usually fall back on 3/4G and get "good enough" results.

So... the window of opportunity now presents itself for an "80% of the time" machine for doing the everyday stuff (docs, browsing, customer support and some BI stuff), whilst the Lenovo can sit at home to be called upon for the 20% that needs more grunt.

A colleague recently went for the Lenovo Yoga 2 Pro which is an ok machine but not really what I want.  I cant see me making use of Tent Mode et al, and it looks a bit plasticky (sic!) for me.  

Dell XPS13 - Well, its a Dell so it's dull dull dull.  Sounds like there's some issues around the cooling system (fan noise) which wouldn't be cool.  I find it hard to get excited about it

Lenovo X1 Carbon - Expensive.  Crappy keyboard

Yoga2Pro / Thinkpad Yoga - Could be the best of an average bunch. Thinkpad Yoga gets very expensive with a decent screen, and I am not sure of the necessity for the "mad resolution" of the Y2P.

Samsung Series 9 - seems impossible to buy, and i dont like buying computers from companies that sell Hoovers.  It's a bit shiny for my liking too (not picky, much!)

Macbook Pro 13 / Macbook Air - well I would have to run windows 8.1 on these machines which is a horrible thing to do to a Mac.  Potential for driver/software issues too.  MBA is a little behind the times on screen resolution now too.  The MBP is still a possible though.... 

Surface Pro 3 - I am worries about the typing position, which I suppose could be resolved by a keyboard when at home.  Docking station seems difficult to buy in the UK (I think I'd want something) and I am not 100% on hooking this up to multiple monitors, although it appears possible (USB hub or DP Daisychain)

I think my heart wants a Surface Pro 2 but the costs on purchase including keyboard, dock, etc do rocket up quite quickly.  It'd need to be a 256GB min on i5 (£1100) although I would prefer an i7 for those BI moments (£1339-1649) but those prices are way steep, the base i7 taking me to £1493 (including portable mouse as that trackpad won't cut it).  

well as we dont get the SP3 until the end of August 2014 over here in the UK, I guess it's a waiting game for now.

Tuesday, May 13, 2014

Unassigned Resources and Project Templates #projectserver2013

Quick publish on this one.

When creating a project from a template (with templated tasks) in PWA, if you assign resources to those tasks via PWA, the assignments appear in the Reporting Database as Unassigned Resource

workaround 1
assign resources via MSP

workaround 2 (varying mileage)
assign resources
remove resources
reassign resources

tested on SP1, April14CU

Wednesday, March 12, 2014

#projectserver2013 VIEW FAILURE: The view failed to load. Press OK to reload this view with the default settings. Press cancel to select another view.

** UPDATE ** includes notes relating to secondary bug where Timesheet is created without Administrative tasks.

Does this ring any bells?

This has been bugging me for months, but finally I have a repro for this:

Issue Summary:  When a task is deleted from a plan that is approved into a previous or current timesheet - even when there are no actuals on the task - you can no longer view the timesheet

The following repro has been proven:
- Setup system with Single Entry Mode, with enforced Status Approval before Timesheet Approval
- Create resource as own timesheet manager
- Create new project
- Create two tasks in the same week, starting monday with 5 days duration:  1) Task to assign actuals, 2) Task to delete post submission
- Assign Resource to tasks
- publish project
- as Timesheet User, go to the appropriate timesheet period for the tasks created
- Assign actual work to one task (task 1), leaving task 2 with no actual work
- Submit timesheet
- as Project Status Manager, approve the time on task 1 in web
- as Timesheet user, confirm timesheet approved
- as Project Status Manager, delete the task with no actual work on it from the plan
- publish plan
- as timesheet user, go to Manage Timesheets and select the approved timesheet to view it
- VIEW FAILURE:  The view failed to load.  Press OK to reload this view with the default settings.  Press cancel to select another view.

** Update **

This section is repeatable but I haven't 100% confirmed the repro yet.

Once the above bug has been triggered, if i then create a timesheet for the next period following the erroring timesheet I now see this:

"The timesheet creation failed because of problems with the Project Web-App or with data validation, such as resources not being valid work resources or users.  Check your environment, and then try again"

And now if I OK the error and view this timesheet I now see that the timesheet has been created without Administrative Tasks.

Now deleting this Timesheet will cause the following error:

  • Reporting message processor failed:
    • ReportingTimesheetDeleteMessageFailed (24011) - Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.. Details: id='24011' name='ReportingTimesheetDeleteMessageFailed' uid='7f5d116f-caa9-e311-93f7-00155d010a15' QueueMessageBody='TimesheetUid='74794350-caa9-e311-93ff-00155d010a0f'' Error='Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.'.
    • ReportingTimesheetDeleteMessageFailed (24011) - Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.. Details: id='24011' name='ReportingTimesheetDeleteMessageFailed' uid='825d116f-caa9-e311-93f7-00155d010a15' QueueMessageBody='TimesheetUid='74794350-caa9-e311-93ff-00155d010a0f'' Error='Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.'.
    • ReportingTimesheetDeleteMessageFailed (24011) - Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.. Details: id='24011' name='ReportingTimesheetDeleteMessageFailed' uid='845d116f-caa9-e311-93f7-00155d010a15' QueueMessageBody='TimesheetUid='74794350-caa9-e311-93ff-00155d010a0f'' Error='Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.'.
    • ReportingTimesheetDeleteMessageFailed (24011) - Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.. Details: id='24011' name='ReportingTimesheetDeleteMessageFailed' uid='865d116f-caa9-e311-93f7-00155d010a15' QueueMessageBody='TimesheetUid='74794350-caa9-e311-93ff-00155d010a0f'' Error='Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.'.
    • ReportingTimesheetDeleteMessageFailed (24011) - Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.. Details: id='24011' name='ReportingTimesheetDeleteMessageFailed' uid='885d116f-caa9-e311-93f7-00155d010a15' QueueMessageBody='TimesheetUid='74794350-caa9-e311-93ff-00155d010a0f'' Error='Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.'.
    • ReportingTimesheetDeleteMessageFailed (24011) - Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.. Details: id='24011' name='ReportingTimesheetDeleteMessageFailed' uid='8a5d116f-caa9-e311-93f7-00155d010a15' QueueMessageBody='TimesheetUid='74794350-caa9-e311-93ff-00155d010a0f'' Error='Invalid call to MSP_EpmDeleteTimesheetAdminAssignments. Timesheet UID (74794350-CAA9-E311-93FF-00155D010A0F) was not found in MSP_Timesheet.'.
  • Queue:
    • GeneralQueueJobFailed (26000) - ReportingTimesheetDelete.ReportTimesheetDeleteMessageEx. Details: id='26000' name='GeneralQueueJobFailed' uid='8b5d116f-caa9-e311-93f7-00155d010a15' JobUID='1a73e66e-caa9-e311-93f7-00155d010a15' ComputerName='dfb372a8-1525-4404-857b-a694b4254aca' GroupType='ReportingTimesheetDelete' MessageType='ReportTimesheetDeleteMessageEx' MessageId='1' Stage='' CorrelationUID='a1a45d6c-caa9-e311-93ff-00155d010a0f'. For more details, check the ULS logs on machine dfb372a8-1525-4404-857b-a694b4254aca for entries with JobUID 1a73e66e-caa9-e311-93f7-00155d010a15

Wednesday, March 5, 2014

Project Server SP1... meh #projectserver

SP1 came and went, and unfortunately it was a little more about bugs and what we didnt get, than what we did.

SharePoint got some Office365/Yammer integration baked in (yet to be played with but i did see Use Yammer for Social during the User Profile Service Creation).

Looks like Project Server "On Prem" for bug fixes and no functionality unfortunately.  The big loss for me was the new paradigm added to Project Online some time ago (the three little dots for shortcut menu against each project) that I was hoping to be included in SP1.  Actually I fully expected it, and hoped in addition for some extension to this really useful navigation tool (option to add custom links for reports, embed status indicators, that kind of thing) but no, not this time.

It is beginning to feel that on-prem solutions are suffering at the hands of Microsoft's "Cloud First" strategy.  

Monday, March 3, 2014

first bug of #Project2013 #sp1

Interesting - Setting Baseline0  adds values to ALL baselines.  Then editing Baseline0 costs changes all baseline costs


  • Create task of 1d
  • Add a cost resource
  • Set Task Usage at bottom window
  • Add Baseline 0 Cost, Baseline 10 cost, baseline 4 cost (or some others too)
  • Add some Timephased costs into Cost timephased field
  • Set baseline
  • All baselines are set with a value
  • Edit Baseline0 Cost TImephased entry
  • All Baseline Values change
  • Scream and bang head on table
** UPDATE **

Having looked further into this it appears that this only impacts baseline cost timephased values.  However this is a MASSIVE impact as it could increase file sizes fairly significantly as the Baseline Cost Timephased Values for Baselines >=1 are no longer independent values.  Put simply, BAseline 1-10 Cost Timephased will equal Baseline0Cost, and cannot be set independently.

Here is an updated repro

- Firstly create split view with task usage on the bottom and gantt at the top
- add Cost, baseline Cost, Baseline1 cost, other baseline cost fields to the Task Usage Timephased section
1) Create a task (any duration)
2) assign a resource to the task that has a standard rate so we see costs timephased in task usage pane
3) Now set Baseline0
BUG:  See that Baseline 1-10 Cost values in timephased data now all have a value, not just the baseline0cost value
4) Now edit an element of the timephased baseline0 cost data
BUG:  All Baseline Cost Values change in that time segment to the value you edited
5) Now try edit a timephased segement for basline 1 cost
BUG:  Notice the edit wont set
6) now try settings Baseline 1 (or another >0)
BUG:  Timephased BaselineX Cost Values NOT Created

here's what a plan can look like when baseline0 is set.  In the bottom pane I have added Basline0 Cost, Baseline1 Cost and Baseline10 Cost but the same issue applies for all of them.

Note;  baseline work values do not show this issue

Thursday, February 13, 2014

#projectserver2013: curious tale of the 2010 site template...

well this is new!

When creating a project site, we are intermittently seeing the following:

NOTE:  This is Project Server 2013 (not an upgrade)

more to follow (I hope).....

Monday, February 3, 2014

The evil that is the task field "Published = No" #projectserver

Just a word to the wise...

If you are running timesheets in a Project 2013 (online/on prem) solution, you must never set the task level field "Publish" = No

Some things that can happen:

- you wont be able to view timesheets that include assignments where this flag is in place (web part error)

- you wont be able to view Status Approval history where tasks include this flag - General Unhandled Exception in _Statusing.ReadStatusApprovalHistoryForGridJson_

there are other issues... as I catch them I will update the post