Wednesday, June 8, 2016

Reporting from Project Server 2016 - multiple sites and userviews

Just a quickie...
I've been interested in how MS have handled the "multiple PWA sites in a Content DB" thing since I read that this was their new approach.  Most of my reporting is via SSRS so i am reliant (still... in 2016) on DB queries rather than OData feeds (tsk) and this "querying a PWA DB with more than one PWA site in it is unsupported" quote was worrying me.

So it looks like what is happening is this.

When you create the first PWA site in a Content DB it hard-codes the SiteID into the _Userview view design elements.  This means that your first PWA Site is the default.  All the data for subsequent sites are still held in the tables against separate SiteID's but you cannot utilise the OOTB _Userview components (see below)


SELECT        ProjectFields....
FROM            pjrep.MSP_TVF_EpmProject('FF19B767-CA6D-4C4C-B123-C0B5AE5354D6') AS MSP_EpmProject 
LEFT OUTER JOIN
                      pjrep.MSP_TVF_EpmInternalProjectHierarchies('FF19B767-CA6D-4C4C-B123-C0B5AE5354D6') AS MSP_EpmInternalProjectHierarchies              ON    MSP_EpmInternalProjectHierarchies.ChildProjectUID = MSP_EpmProject.ProjectUID 
LEFT OUTER JOIN
                      pjrep.MSP_TVF_EpmTask('FF19B767-CA6D-4C4C-B123-C0B5AE5354D6') AS MSP_EpmTask 
             ON    MSP_EpmTask.ProjectUID = MSP_EpmProject.ProjectUID 
             AND  MSP_EpmTask.TaskIsProjectSummary = 1

now you can see lots of references to pjrep.MSP_TVF....  these are Table Functions that allow the Site ID to be passed and perform a SELECT against the core table.

The above views have the initial SIteID hard coded so (** WARNING:  NOT SUPPORTED APPARENTLY **) if you want to leverage _UserViews you will have to make your own using the appropriate SiteID references for the Table functions.

Or alternatively just use the Custom Field joins from the UserView view design in your own select statement to get just the fields required and avoid the userviews (ideal but hey... we can all be lazy sometimes).

So here's your lesson:  MANAGE YOUR CONTENT DATABASES!  Only allow one PWA site to be stored in the ContentDB otherwise it is just pain and anguish (hot topics for an England fan given its nearly the start of Euro2016)







Friday, June 3, 2016

Issue provisioning PWA on Root (HNSC or Site) in #projectserver2016

Following on from my previous 2016 PWA Setup post, I am encountering an issue with PWA on the root of a HNSC with PWA in ProjectServer Permission Mode.

Scenario

 I want to create a pwa site on a HNSC at http://pwa.domain.com,  I don’t PWA as a pathed web under the HNSC (‘/pwa’) and I would like to avoid using a Host Header on a separate webapp with PWA provisioned at ‘/’ if poss as its horrible and ikkie

Method

  1. Create a web app on server name http://fe1
  2. Create a root Site Collection on the web app
  3. Lock Content DB down
  4. Create new Content DB for the PWA site
  5. Create a HNSC called http://pwa.domain.com pointing to the above web app using the PWA#0 template etc

    New-spsite "http://pwa.domain.com" -hostheaderwebapplication "http://fe1" -name "PWA" -Description "Project Web App" -owneralias "Domain\user" -language 1033 -template "PWA#0"
  6. Lock the content db down
  7. Enable PWASite features and all that jazz
  8. Switch to Project Server permission mode
  9. Add a user to a PWA User Group to trigger the sync


At this point adding resources returns this in the ULS

An unexpected exception occurred while processing queue messages of type PSPermissionSynchronizePWASite, Exception: System.ArgumentException: Trying to get name of an SPWeb at the root web app is not allowed. 
SPweb?  huh?  I created an SPSite surely!


And this in the queue
 GeneralQueueJobFailed (26000) - PSPermissionSynchronizePWASite.PSPermissionSynchronizePWASiteMessage. Details: id='26000' 
name='GeneralQueueJobFailed'
uid='2712a0fb-fa27-e611-80bb-00155d940402'
JobUID='2112a0fb-fa27-e611-80bb-00155d940402'
ComputerName='6ce47b31-e9bf-41c3-ae1d-0ebdf5c14dc6'
GroupType='PSPermissionSynchronizePWASite'
MessageType='PSPermissionSynchronizePWASiteMessage'
MessageId='1'
Stage=''
CorrelationUID='81e4819d-d915-3091-14dc-6f20bb3fa683'
For more details, check the ULS logs on machine 6ce47b31-e9bf-41c3-ae1d-0ebdf5c14dc6 for entries with JobUID 2112a0fb-fa27-e611-80bb-00155d940402.
name='GeneralQueueJobFailed'
uid='2712a0fb-fa27-e611-80bb-00155d940402'
JobUID='2112a0fb-fa27-e611-80bb-00155d940402'
ComputerName='6ce47b31-e9bf-41c3-ae1d-0ebdf5c14dc6' GroupType='PSPermissionSynchronizePWASite' MessageType='PSPermissionSynchronizePWASiteMessage'
MessageId='1'
Stage=''
CorrelationUID='81e4819d-d915-3091-14dc-6f20bb3fa683'
For more details, check the ULS logs on machine 6ce47b31-e9bf-41c3-ae1d-0ebdf5c14dc6 for entries with JobUID 2112a0fb-fa27-e611-80bb-00155d940402.

So what does work so far and what doesn't....


  1. new-SPSite on an explicit managed path ('/pwa') or under a wildcard path '/pwasites/pwa1' - OK
  2. new-SPSite on Root of a Web App with hostheader as '/'  - FAIL (expected as it seems to be SPSite on Root that the issue is
 So it seems that PWA cannot yet be on root anywhere.... YIKES!