Tuesday, January 24, 2012

Quick and dirty "Portfolio Gantt" report

We all like Project Centre, with its lists of projects and useful fields, but sometimes you just want it to do a little more.  For example:
- what if you could display some key milestones on the gantt
- what if you could easily display colour-coded gantt bar by phases.

The second point above (or variant of)  has been requested so many times and as of yet I have not seen anyone deliver such a report or view, so I decided to give it a go.

Now, before we go ahead, the following is done with no coding and no complex Reporting Services reports.  I am sure (and have seen) some amazing report views in SRS similar to this requirement, but this is a Proof of Concept solution.  Go work out your own way :P

So, a Portfolio Report:

- Excel
- SP2010 Farm with Excel Services configured
- an ODC
- Some formulas
- Some conditional formatting

Step 1:  Define
This PoC is done working on the following:
- There are 5 Phases for each project
- The Gantt should include coloured bars by each of the 6 phases for the project
- This should update automagically based on current planned dates
- The date periods should be weeks across the columns

Note:  In this scenario I haven't added any other Project Categories into the Table view, or report filters.  I may get onto this later when defining the ODC connection

Step 2:  mockup in excel
- Create a new file
- Create a table to include the following columns.  This will be the basis for the data connection data later:
  1. Project Name (COL B)
  2. Phase 1 Start (COL C)
  3. Phase 1 finish
  4. Phase 2 Start
  5. Phase 2 Finish
  6. ......
  7. Phase 6 Finish (COL N)

Now in adjoining colums to the above table, create the same number of columns (two for each phase), using data formatting of Number, and reference the first set of colums, so:
  1. IF([COL C] = "","",[COL C]
  2. IF([COL D] = "","",[COL D]
  3. etc
  4. IF([COL N] = "","",[COL N]
So now we have

Now we want to set up our timephased column headers.  Initially we will do this manually so:

- on your first available column, enter the date you wish to start from:
- then on the next column, same row, create a formula to add 7d to the previous date
- copy this formula field to the right as far as you wish the report to go.
- once done, create a formula in the cell row above the dates entered (ive done this in Row 2), and convert each date to a number field (as we did before)

Now then.  How do we colour scheme our table by phase?  we are going to write a nested IF Statement that compares the Date Value fields for each phase (created in the second image above) to the column date value created in the step previous to identify whether the formula will result in:
"1" = Phase 1
"5" = Phase 5

Note: In this example, one phase can only happen in one week.

The formula:

$P7 = Project Phase 1 Start
$Q7 = Project Phase 1 End
$AA7 = Phase 6 End
AB$2 = the timephased period in column AB2 (the first date period)

Now copy this formula down the column to the bottom of the table, and across to the end of the timephased period defined 

Now we will do the conditional formatting on the timephased periods:

Now once this report is published to a SP2010 report library it looks like this:

Next Steps:

- Add a Current Date marker
- Make this a live report by connecting the Excel file to a SP2010 Data Connection and Project Server 2010 Reporting Database
- Improve on formatting

Monday, January 9, 2012

Someone killed your farm #projectserver

** WARNING ** following this post may kill your already sickly farm....

Imagine the scenario:
- during some troubleshooting, someone deletes some EPM databases that they believe no longer point to a PWA Site (but actually do)
- when deleting a PWA Site, some environmental issue interrupts the process before it completes
- an issue occurred during PWA Site provisioning
- who knows what, sometimes bad things happen......

what you will see:

Sharepoint will continually report events such as :

An exception occurred while running the job scheduler.   Reason: Cannot open database "ProjectServer_Published" requested by the login. The login failed.  Login failed for user xxxxxxxxxxxxxxxxx.  Technical Details: System.Data.SqlClient.SqlException: Cannot open database "ProjectServer_Published" requested by the login. The login failed.  Login failed for user xxxxxxxxxxxxxx     at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception


Project Server Queue 7626  Critical  Cannot start queue. SSP: 150e20ee-631b-420d-9de8-7f47b43fc67e  SiteUID: 5afc4aab-f94e-4e69-b7ba-7127a75535c4 Url:  Queue: ProjectQ
Project Server Queue 7626   Critical Cannot start queue. SSP: 150e20ee-631b-420d-9de8-7f47b43fc67e  SiteUID: 5afc4aab-f94e-4e69-b7ba-7127a75535c4 Url:  Queue: TimesheetQ

- your event log will clog up with the above
- any other EPM site queues will begin to slow down
- users get very angry

What's happening under the hood?

basically deleting stuff from a SP farm WITHOUT doing so via STSADM, Powershell or the CA UI will cause all kinds of horrible problems that will mean you will either have to recreate Service Apps OR the whole farm (Depending on the scenario) to resolve.

What can you do:
well, beside hitting the person that did it in the first place, there is an STSADM command that could save you.  However I will repeat the warning at the top of this page.  running this command may kill your farm completely so ensure you have a DR strategy in place and ready to implement.

The command is:  stsadm -o deleteconfigurationobject -id {GUID}

Now the GUID bit is the ID of the object you wish to delete from the Configuration Database "Objects" Table.  

Which object should I delete, there are 1000's

- Objects are linked together via the Dependencies table
- your aim should be to attempt to identify the PWA site object that links to these now orphased DB objects.  therefore start with any GUIDs linked to errors in the event log
- passing the PWA site GUID through the STSADM command will delete the site (this is your only option) but SHOULD also delete all the dependent orphaned objects, thus stopping the errors occurring as all trace of the site will be removed.

Note:  In some scenarios, dependencies may be broken, which may cause some residual records to remain and problems to persist.  It is worth identifying all the dependant objects prior to beginning this process.

An Example of a query that will help identify the relevant PWA Site Objects from the Farm is as follows:

  FROM [SharePoint_Config].[dbo].[Objects]
  where Properties like '

an example query to identify orphaned records is here (mileage may vary)

FROM Objects
INNER JOIN Dependencies ON O.ID = D.ObjectID
INNER JOIN Objects AS OD ON D.DependantID = OD.ID

                        above query courtesy of this post http://viksrini.blogspot.com/2010/04/delete-orphaned-project-server-database.html

have fun!