Project Programmability

This blog focuses on customizations and programming for Project Web App, Project Server, Project Professional and Project Standard. Includes User Interface (UI) customizations, Project Server Interface (PSI) and Visual Basic for Applications (VBA) Programming. It also covers Business Intelligence.

  • Project Programmability and Business Intelligence

    Upcoming WebCast: Project Server Development for SharePoint Developers (Level 300)



    Let me highlight the following webcast that we conduct Thursday, May 05, 2011 8:00 AM (GMT-08:00) Pacific Time. Make sure to register now to get automatic reminder!

    MSDN Webcast: Project Server Development for SharePoint Developers (Level 300)

    Language(s): English.

    Product(s): Microsoft Project 2010

    Audience(s): Pro Dev/Programmer

    This webcast covers the Microsoft Project Server development features from a Microsoft SharePoint developer's perspective. We explain the logical architecture of Project Server in a SharePoint farm and compare the development features. We also give real world examples such as the ribbon UI, Windows Communication Foundation (WCF) server programming, web part with JS Grid, Workflow for Demand Management, and cmdlets for Windows PowerShell. The key takeaway is for SharePoint developers to understand the similarities in development to be able to join the Project Server developer community.

    Presenters: Steven Haden, Senior Consultant, Microsoft Corporation and Olivier Laymand, Senior Consultant, Microsoft Corporation

    Steven Haden is a senior consultant working for Microsoft Services in France. He is involved in large Microsoft Project Server and Microsoft SharePoint deployment. Steven is interested in both the architecture and the development of solutions and is the author of the white paper "Hitchhiker's Guide to Demand Management" (

    Olivier Laymand is a senior consultant from Microsoft Services working on large Microsoft SharePoint and Microsoft Project Server deployments. He's involved in solution architecture definitions, development of best practices, and governance.

  • Project Programmability and Business Intelligence

    MSDN Webcast: Project Server Events and Workflows, Demos & Q&A


    Hi All,

    Thank you for attending my MSDN webcast Project Server Events and Workflows.  Don’t forget about next weeks webcast on Project Client programmability.   Below is some of the Q&A I got during the webcast.  Attached is the demos from the webcast.

    Question Answer

    Will you chat at all about Project Server 2010? Are there any plans for changes in the new version?

    Still too early to talk about Project Server 2010 other than to to say I’m looking forward to it.  We’re a few months away from announcing the features. 

    What should you be thinking about as a developer?  Project is committed to the PSI and designed it to be extensible.  The new functionality will be extensions to existing functionality.  This means your work today should be backward compatible.  I did say should so please don’t shoot me if there are a couple “gotchas.”

    Is the command (i.e save project) already queued, when an event is raised?

    The event will be raised when the call executes from the queue.

    Based on your description of pre and post, the "project published" event is raised after save to the db. Would you say its best to eval business rules afterward, log violations, notify user and delete from db? is there an ability to only delete from PDB and leave in DDB so user can correct and attempt re-publish?

    I hate to waffle in my answers, but in this case it depends on the context.  I put together a little matrix below to help with this question.

    Is it or is the correct DLL.

    Is there anything to pay special attention for (i.e. concurrency, locking, etc.) with events on heavy loaded systems or is this solved by "serialized" execution through the project server queue?

    The queue helps to solve issues with heavily loaded systems.  Specifically with events you need to pay attention to the length of processing in pre-events.  In a pre-event you are disrupting the flow of Project Server, you should keep your processing to a minimum.

    Using events to enforce business rules

      Easy Rollback Difficult Rollback
    Short Business Rule Evaluation Evaluate in pre-event, rollback unnecessary. Evaluate in pre-event, rollback unnecessary.
    Long Business Rule Evaluation Consider using a post event. This is the hardest case.  You’ll really need to evaluate the complexity of the rollback.  Maybe you could break the business rule evaluation in phases?
  • Project Programmability and Business Intelligence

    Identifying Surrogate Timesheets in the Reporting Database


    When we shipped Project Server 2007 we made sure that timesheet data was readily available to query in the Reporting Database, however one thing that we didn't do was make it super easy to spot a surrogate timesheet (defined as a timesheet entered on a team member's behalf by another Project Server user who has the surrogate timesheet permissions) - one reason was that we wanted mainline timesheet reports to not have to care, and be able to aggregate/report on the data without special case code.

    If you are faced with the need to identify surrogate timesheets the query below, run against the RDB, will help:

    SELECT DISTINCT TS.OwnerResourceNameUID AS N'Team Member'

                  , TSA.LastChangedResourceNameUID AS N'Surrogate Team Member'

                  , TS.TimesheetUID

    FROM dbo.msp_timesheet AS TS

    INNER JOIN dbo.msp_timesheetline AS TSL

      ON TS.TimesheetUID = TSL.TimesheetUID

    INNER JOIN dbo.msp_timesheetactual AS TSA

      ON TSL.TimesheetLineUID = TSA.TimesheetLineUID WHERE TSA.AdjustmentUID = N'00000000-0000-0000-0000-000000000000' -- Not an adjustment

      AND TS.OwnerResourceNameUID <> TSA.LastChangedResourceNameUID -- Submitter <> TS Owner

    We are basically looking at the timesheet lines that haven't been adjusted - if the person who last saved them isn't the same as the person who owns the timesheet then we know its a surrogate - the lines were submitted by another user.

    Usage Note: The two resource UID can be used to join to other timesheet tables - don't join on these directly to the MSP_EPMResource_UserView or other tables in the EPM schema as you won't get a match - instead you should join though the RDB slowly changing resource name table (MSP_TimesheetResource) to get the base ResourceUIDs and use these for the EPM schema. 

    Hope this helps - if you are struggling to get a question answered from RDB data feel free to post a response to this article and we'll see what we can do.

    Happy New Year for 2009 (Chris - first post!) 


  • Project Programmability and Business Intelligence

    TechED Europe - Microsoft Project 2010 Overview PowerPoint Deck


    We did two Project 2010 sessions at TechEd Europe – Christophe (thanks!) posted the decks on SkyDrive here as he mentioned here

    We have also shot two short videos on the 2010 news for Developers and  IT Professionals as mentioned here.

    Happy holidays!

  • Project Programmability and Business Intelligence

    Is it the right time to rearm the Project 2010 Beta Demo Image?


    This procedure is described in the document “Setting up the Virtual Machine” that accompanies the Project 2010 Beta Demo VM.


    Some of you might be running into activation messages, like “You must activate Windows today” or your virtual machine will be rebooting every 2 hours. To prevent spoiled demos please read on -


    Perform re-arming (no Internet connectivity required) – temporary solution

    Please perform the “re-arming” of your image (

    1. Start your image

    2. Logon into the image as Administrator

    3. Start -> Run, type CMD

    4. Into the command prompt window type “slmgr -rearm” (without quotes)

    5. You should see dialog saying “command completed successfully”.


    6. Reboot the VM

    7. After reboot the VM your evaluation period has been extended

    8. Please remember to warp-um all pages before your demo!


    Q: What is the demo VM, where do I get it?

    A: “The Project 2010 Solution demo provides a comprehensive overview of the new  and existing capabilities included in Microsoft Project Professional 2010 and Microsoft Project Server 2010. The demo follows the life of a software development project from inception through to completion.” More on the second part here - 




  • Project Programmability and Business Intelligence

    Who builds the Project 2010 Solution Starters?


    Some of you are asking how and who builds the Solution Starters.

    The Solution Starter specifications were done by the same group of people who design new components of Microsoft Project – the Program Managers inside of Microsoft. The specifications (“specs”) were then handed off to external company who coded, tested and released them into the MSDN Code Gallery.

    The company is called Internet Commerce Corporation (ICC)

    ICC is one of the first companies that started working with Microsoft Project Server 2010 as part of Microsoft's TAP program and continues to gain experience being involved in the development of a number of solution starters for Project Server 2010. Since then, ICC has built strong expertise in building EPM solutions based on the Microsoft Project Server 2010 Platform.

    Major focus areas in Enterprise Project Management for ICC are:

    • EPM Solution Implementation
    • Project Server 2010 deployment and configuration
    • Project Server 2010 customization and custom report development

    If you plan to do a coding project for Project 2010 and you need great developers with vast experience, feel free to consider them too!


  • Project Programmability and Business Intelligence

    Free online courses for developers - MSDN Ramp Up



    Check out the Ramp Up program ( if you have not done already. It has interesting tracks including SharePoint...

  • Project Programmability and Business Intelligence

    Project 2013 Preview SDK and related resources


    The Project 2013 Preview SDK download is published. The conceptual, how-to, and reference documentation in the download closely matches the Project 2013 developer documentation online content published on MSDN. In addition, the download also contains:

    • Ten complete code solutions, including two task pane apps for Project, six client-side object model (CSOM) solutions, and two solutions for querying the ProjectData service for reporting.
    • DLLs and a license for redistribution of the three Project Server CSOM assemblies, JavaScript files for the CSOM, and the Microsoft.Office.Project.Server.Library assembly.

      Note: Project CSOM solutions also require the redistributable DLLs for the SharePoint 2013 CSOM, which are at SharePoint Server 2013 Client Components SDK.
    • Intellisense files for the PSI and CSOM, source code for creating a PSI proxy assembly, and instructions on how to update the PSI proxy files.
    • XML schemas for the Project client, AppProvisioning, and the Statusing PSI.

    The top-level online landing page for the Project SDK is Project for developers (

    For additional Project-related SDK content, see Office for developers (, SharePoint for developers (, and Build apps for Office and SharePoint ( The two articles on Task pane apps for Project are in the Apps for Office and SharePoint SDK, and the JavaScript API for Office reference includes information specific for Project, the ProjectDocument object with eleven methods and three events, and four enumerations for Project. Those SDK downloads are now published:

    Want to try out Project 2013?

    1. Sign up for the Project Online Preview with Project Pro for Office 365
    2. Download Project Professional 2013 Preview & Project Server 2013 Preview
  • Project Programmability and Business Intelligence

    Myths about Project 2010 Beta virtual Image HW requirements


    Just heard from number of you the confusion on the HW requirements, let attempt to clear some of it by this post.

    We advice the following two components that extremely enhance the performance:

    • 8GB of RAM is optimal on the host machine so you CAN allocate 6GB to the image
      • Please NOTE SharePoint 2010 – (platform for Project Server 2010) does NOT support less than 4GB of RAM - SharePoint Server 2010 system requirements – so 4GB on your host machine will not work as it will not allow you to assign 4GBs to the image.
      • Attempts to assign less than 4GBs to the virtual machine will cause number of processes not starting – this is not supported


    • Fast Hard drive – preferably SSD (Solid State Drive)
      • What is SSD?
      • How big you recommend? We recommend 80GB+ as the base image size is approx. 40GB
      • Recommendations on maker? We had a great experience with Intel, Kingston with Intel Controller (M-Series or E-Series).


    Does 2 versus 4 core make a big difference? No in our testing – the biggest speed improvement is the SSD.

    What configuration are you using for most of your demos?

    • We mostly use DELL E6400 (3GHz, duo Core, 8GB RAM, fast SSD) – this offers optimal size/portability and performance. The Project Conference KeyNote and demos ran from it and all Project 2010 Ignite demos I do, run from it as well! Some partners use the DELL Precision M4400.
    • We also use HP EliteBook 8530w (Quad core, 8GB RAM, fast SSD) – this one is slightly bigger and heavier – Christophe uses this one for his Project 2010 Ignite demos.
    • We are sure that similar specs from other manufacturers will rock as well!
  • Project Programmability and Business Intelligence

    September update of the Project 2010 SDK


    The September 2010 update of the Project 2010 SDK download and the MSDN online release are both published.

    They have the same URLs as previous releases:                                                                                             


    ·         SDK Online:

    ·         SDK Download:

    ·         Project Developer Center  

    What's New in the conceptual and how-to topics:

    Following are the major new and updated topics in the Project 2010 SDK, since the RTM release. There were a series of changes related to ASMX web services, Windows Communication Foundation (WCF) services, and claims authentication since the beta release. The Project 2010 SDK in the MSDN online library was updated in July; the last update of the SDK download  was in May. They are in sync again.


    Updates of RTM topics:

    ·         Using Formulas and Graphical Indicators with Custom Fields

    ·         Creating Lookup Tables and Enterprise Custom Fields

    ·         Custom Fields and the Reporting Database

    ·         Overview of WCF and the PSI

    ·         Walkthrough: Developing PSI Applications Using WCF

    ·         How to: Use Impersonation with WCF

    ·         Prerequisites for WCF-Based Code Samples

    ·         Developing Project Server Workflows

    o   How to: Install and Test a Project Server Workflow

    o   How to: Deploy a Project Server Workflow

    ·         Project Server Error Codes now includes a WCF-based code example for getting a list of errors.


    New conceptual and how-to topics:

    ·         Developing PSI Extensions

    o   Creating a PSI Extension for Project Server 2010

    o   How to: Create a PSI Extension to Read Custom Fields in the RDB

    ·         Developing Project Server Web Parts

    o   Walkthrough: Creating a Project Server Web Part with a JS Grid


    In addition, the Class Library and Web Service reference for the PSI has many updated type and member descriptions, and several new code samples for PSI methods.


    What’s New in the Project 2010 SDK download:

    ·         pj14SDK.chm is an HTML Help file that includes the same updated content that is online.

    ·         WINPROJ.DEV.hxs is an update of VBA Help that includes the latest changes in the VBA object model documentation. There are also instructions for replacing the VBA Help file shipped with the Project RTM release.

    ·         Managed code reference samples contains WCF-based solutions for code samples in the managed code reference for the following methods: QueueCreateProject, ReadCustomFields2, and ReadLookupTables. The solutions also use the WriteFaultOutput method for listing errors, which is described in the Project Server Error Codes topic.

    ·         Multi-authentication samples includes the ASMX- and WCF-based solutions for multi-authentication, which are described in the Prerequisites for ASMX-Based Code Samples and Prerequisites for WCF-Based Code Samples topics.

    ·         Project Guide Add-in shows how to use Project Guide files in Project 2010, with a custom ribbon tab. The sample code uses Office development tools in Visual Studio 2010.

    ·         PSI Extensions includes the Hello solution described in Creating a PSI Extension for Project Server 2010 and the ListProjects solution described in How to: Create a PSI Extension to Read Custom Fields in the RDB.

    ·         Web Parts includes two related Web Part solutions:

    o   ListProjects is described in Walkthrough: Creating a Project Server Web Part with a JS Grid.

    o   ListProjects_Sorting extends the ListProjects solution to implement column sorting in the JS Grid control.

  • Project Programmability and Business Intelligence

    Importing SharePoint List Data into Project Server 2007 Custom Fields


    Check this out - by Stephen C. Sanderlin, MSProjectExperts. Awesome real-world project article, extensive sample code!


    If you are heading to Project Conference – Steve has a 3 sessions about PSI – they span from 200 to 400 level. Worth attending…

    DEVDM 200: Project Server Programmability Overview

    Speaker(s):  Stephen Sanderlin, MSProjectExperts | 200 - Intermediate Level
    This session will provide an overview of the Project Server Interface (PSI) and the Reporting Database (RDB), along with discussions concerning their capabilities, usage, and limitations. This session seeks to build a foundational understanding of these components for the new Project Server developer.

    DEVDM 303: Best Practices: Consuming the PSI

    Speaker(s):  Stephen Sanderlin, MSProjectExperts | 300 - Experienced Level
    The Project Server Interface (PSI) contains a wealth of functionality spread across numerous components. Developers who are new to Project Server often find the sheer complexity and depth of the PSI to be extremely intimidating. In this session, we will show you how to build a basic PSI consumer application and provide some best practices. This session seeks to increase the new developer’s comfort level with the PSI.

    DEVDM 401: Building a PSI Wrapper for Application Integration

    Speaker(s):  Stephen Sanderlin, MSProjectExperts | 400 - Advanced/Expert Level
    When developing an interface between Project Server and an external Line of Business (LoB) application, the depth and complexity of the Project Server Interface (PSI) can present a whole host of issues. One of the most challenging issues is the substantial effort required for a developer that is unfamiliar with Project Server to gain solid experience and comfort with the PSI. One possible approach is to assign a small team to encapsulate the PSI interactions inside of a custom API. In this session, we will demonstrate and discuss various strategies and best practices for PSI encapsulation.

    See you at Project Conference!


  • Project Programmability and Business Intelligence

    ANNOUNCING: Recordings from EPM University 2007 are available


    We are pleased to announce the availability of recordings from the popular EPM University 2007 courses. Individual courses could be found in the following locations:

    · Microsoft EPMU - Admin Professional - Functional Implementation & Configuration of Project Server 2007 (On-Demand Recorded Training)

    · Microsoft EPMU - IT Professional - Technical Implementation & Configuration of Project Server 2007 (On-Demand Recorded Training)

    · Microsoft EPMU - Office Project Server 2007 Developer Training (On-Demand Recorded Training)

    · Microsoft EPMU - Deploying Office Project Portfolio Server 2007 (On-Demand Recorded Training)

    Or easily accessible via


    Q: When I can take the training?

    A: Anytime, you can download the recordings and watch them based on you convenience.

    Q: Are there any Virtual Labs for these courses I can use?

    A: There are no EPMU specific Virtual Lab available, however in many cases you can benefit and practice using the hosted Microsoft EPM 2007 Lab

    Q: As a PMP could I claim PDUs after finishing the course?

    A: Yes you can, all details on the process are available during registration.



  • Project Programmability and Business Intelligence

    SharePoint 2010: Professional Developer Evaluation Guide and Walkthroughs


    Hi everyone – in the Project 2010 blog posts, WebCasts, presentations and seminars we stress on how SharePoint is important for Project 2010 – not only for IT professionals, but especially for developers – YOU. This is a great resource that SharePoint has put together, if you have not seen yet, worth looking!

  • Project Programmability and Business Intelligence

    Project 2010 Customization and Programming Forum just launched!

    Project 2010 Customization and Programming

    Discuss customizations and programming for Project Web Access 2010, Project Server 2010, Project Professional 2010 and Project Standard 2010. Includes User Interface (UI) customizations, Project Server Interface (PSI) and Visual Basic for Applications (VBA) Programming.


    All available Project 2010 forums are here -,projectprofessional2010/.

  • Project Programmability and Business Intelligence

    Upcoming MSDN Webcast (6/23): Understanding Project Server Interface (PSI) in Project Server 2010 (Level 300)


    Just to highlight a webcast not to miss…

    Starts: Thursday, June 23, 2011 8:00 AM, Time zone: (GMT-08:00) Pacific Time (US & Canada)
    Duration: 90 Minutes

    This webcast helps you understand the changes and new features of Project Server Interface (PSI) in Microsoft Project Server 2010. We cover the following topics: dual interface ASMX and WcfImpersonation with WCFTimesheet, event handlers with impersonation, Single Entry Mode (SEM), and using a Project Web App (PWA) web part in other Microsoft SharePoint sites.

    Steven Haden, Senior Consultant, Microsoft Corporation and Olivier Laymand, Senior Consultant, Microsoft Corporation
    Steven Haden is a senior consultant working for Microsoft Services in France. He is involved in large Microsoft Project Server and Microsoft SharePoint deployments. Steven is interested in both the architecture and the development of solutions. He is the author of the white paper "Hitchhiker's Guide to Demand Management"; to download it, visit
    Olivier Laymand is senior consultant from Microsoft Services working on large SharePoint and Project Server deployments. He is involved in solution architecture definitions, development best practices and governance.

    More details and registration.

  • Project Programmability and Business Intelligence

    MSDN Webcast: PSI Review, Demos and Q&A


    Hi All,

    Thank you for attending my PSI review MSDN webcasts, I really enjoyed delivering them.  I think if I deliver again it’ll need to be three webcasts, I barely finished part A, and left out three web services in part B.  Below is some of the Q&A I’ve gotten.

    Question Answer

    Create a custom timesheet import UI. So create timesheet from data in Excel for example (each row as a new timesheet maybe?)

    This is totally possible through the timesheet and statusing web services. The biggest challenge will be keeping your external line items names in sync with internal ones you define in Project Server.
    Right now the rates table, you can only put 5 rates in there. Explore ways to put more than 5 rates per resource. Your right that there are only 5 rate available. There are a couple possibilities, all involving custom fields. You would save your extra rate information in a custom field. Then by some event triggering (either client or server side) you could move the appropriate cost information into the table. It’s not the best solution, but could be the start of a workaround for you.

    I want to work on top of various projects that have a certain CustomField value. Going into every project's dataset takes waaaay too long. Is there a better way to do this with PSI?

    There really is no shortcut.  My best advice is to write some helper methods that get you to the values you want.

    Is it ok to use VB for all this stuff or is it much better to use C#?

    VB.Net is just as good for this as C#.  Actually any .NET language will work great.  I “cut my teeth” in C.  So my natural progression was from C to C++ to C#.

    I am trying to sync the values in a Look up table with an external SQL table so the two stay in sync. What is the best way to do this? the table is a customer table from the accounting system

    Going from the accounting system to Project Server should be easy with all the PSI calls available to update the business entities (Project, Resource, etc.).  Going from Project Server to the accounting system is more challenging.  The event system in Project Server will only tell you an entity changed, not the specifics of what changed.  So you’ll need to detect the change and then go into the entity to check for changes.

    What types of programming tasks are going to take existing GUIDs, and what tasks will require us to generate our own GUID? Queueing? Object Creation? It would seem like Project Server would want to own the GUID, for sync'ing and stuff, right?

    Calls that create new entities will have you create a new Guid, for instance QueueCreateProject.  The most common thing you’ll create a new Guid for is the JobUid that’ll you’ll pass to queue enabled calls.

    I don't mean to oversimplify, but if we have an admin backup scheduled daily, isn't that what you are referring to as the 'archive' (although with code you can have more control rather than an all or nothing).

    Archiving is moving entities to the archive database so they are no longer taken into account in the operational system.  BUT… they are available to restore when you need.  It’s way more complicate than that, you should look at the books online to get a good handle on the archive process.

    Do you have any customers that are automatically tweaking the queue configuration settings in a production environment?

    None that I know of.

    For AD Credentials, I use the NetworkCredentials class, which class do I use for the Forms logins? I don’t use it, just curious.... It blocks my outbound webservices connection, I can't seem to authenticate properly, any tips?

    Use the LoginForms web service and pass the username and password via that.
  • Project Programmability and Business Intelligence

    Thinking about getting your certifications?


    In case you are thinking about taking one or more exams towards your certification - for example the following:

    You might appreciate the Microsoft Certification Pack voucher codes with Prometric -

  • Project Programmability and Business Intelligence

    Recently updated Project 2010 Solution Starters


    Few months ago we have announced releasing of the Solution Starters for Project 2010. We are still committed to continue evolving them - and we will showcase many of them in the future version of our wonderful Project 2010 Demonstration and Evaluation Virtual Image.

    We have not only released the source code and the deployable package, but also number of WebCasts that introduce the functionality, but also conduct deep dive into the code.

    You can find many of the solution starters in the following location -

    Go ahead to check them out - if you encounter an issue or have a question, please post the issue or question into the related Discussions library and we will follow-up shortly. 


    What's new?

    • Bulk Import Tool - made to ease migration of data from Project Portfolio Server 2007, now enables to update existing project data with new data from PPS. For more information about PPS 2007 migration - please visit Upgrade and Migration Center on Microsoft TechNet.
    • Workflow Visualization Web Part  - we had this Web Part for some time, however we updated it with a newer version that mimics to certain extent the workflow visualization you know from our Project 2010 Demonstration and Evaluation Virtual Image. It's very smart as it builds the whole workflow visualization dynamically based on the pictures you provide and highlights the current workflow stage.
    •  Report Builder Tool - now pulls down some more project workflow related-data.

    Thanks to all who work hard on this - including Sam and ICC!


  • Project Programmability and Business Intelligence

    Fearing the Password Expired Message


    Since is it common practice for passwords to expire after a set number of days, this can cause a bit of a pain for developers who have setup their Project Server development environment using their own credentials. This happens to me all the time, so I figured I would share a couple of solutions that I use to get around this:

    ·         Create a local administrator and setup Project Server using that account

    ·         Or follow Christophe Fiessinger's blog post on how to change the password:

    Chris Boyd

  • Project Programmability and Business Intelligence

    Project Server <—> TFS 2010 Integration (beta)


    The Visual Studio Team Foundation Server (TFS) group has released a beta version of the Feature Pack for integration of TFS 2010 with Project Server. The beta version is a “go live” release. If the user agrees to the pre-release license agreement, the Feature Pack can be installed and will be supported in a production environment. However, it is not the final release, and is still subject to change, so you should first test it in a non-production environment.

    Note   The TFS Feature Pack requires the Microsoft Visual Studio 2010 Ultimate edition, SP1, and TFS 2010 SP1. It can work with either Project Server 2010 or Project Server 2007.

    For an article in the Project team blog, see Announcing Visual Studio Team Foundation Server 2010 and Project Server Integration Feature Pack Beta.

    For an article that describes the major features, benefits, and installation of the TFS-PS Feature Pack, see Brian Harry’s blog: Portfolio Management: TFS <-> Project Server Integration in Beta.

    If you have worked with TFS, you know what a great advantage that is for large development projects – and even for small ones. You already know what an amazing tool Project Server is. The TFS-PS Feature Pack brings together the two best-in-the-world tools for team collaboration on development projects, and enables development-focused and project-focused people to keep working with the tool they know best and to truly combine forces.

  • Project Programmability and Business Intelligence

    Detecting Project Client Version


    We have heard from a lot of customers that they want to block the Project Client from connecting to the server if it does not have the latest updates to install. To solve this, you can add one of the two VBA scripts to the enterprise global to check the client version. Both solutions are not perfect, but they may help solve the problem.

    The first solution looks at the file version. The only slight issue with this solution is determining the location of the Program Files directory.

    Sub projVersion()
        Dim MainFolderName As String
        Dim LastMod As String
        Dim Created As String
        Dim Size As String
        Dim projVersion As String
        Set objShell = CreateObject("Shell.Application")
        MainFolderName = "C:\Program Files\Microsoft Office\Office12"
        Set FSO = CreateObject("scripting.FileSystemObject")
        Set oFolder = FSO.GetFolder(MainFolderName)
         'error handling to stop the obscure error that occurs at time when retrieving DateLastAccessed
        On Error Resume Next
        For Each fil In oFolder.Files
            Set objFolder = objShell.Namespace(oFolder.Path)
            Set objFolderItem = objFolder.ParseName(fil.Name)
            Select Case UCase(fil.Name)
                Case Is = "WINPROJ.EXE"
                    LastMod = fil.DateLastModified
                    Created = fil.DateCreated
                    Size = fil.Size
                    MsgBox ("File: " + fil.Name + " Last Modified: " + LastMod + " Created: " + Created + " Size: " + Size)
                    'do all of the normal tests here to determine which version you need and which you have. See above.
            End Select
    End Sub

    The second solution looks at a registry key for the Project Client version and it was written with the help of

    Const MIN_PROJ_VERSION = 6330
    Const HKEY_CLASSES_ROOT = &H80000000
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003
    Const ERROR_SUCCESS = 0&
    Const REG_SZ = 1&                          ' Unicode nul terminated string
    Const REG_DWORD = 4&                       ' 32-bit number
    Const KEY_QUERY_VALUE = &H1&
    Const KEY_SET_VALUE = &H2&
    Const KEY_CREATE_SUB_KEY = &H4&
    Const KEY_NOTIFY = &H10&
    Const KEY_CREATE_LINK = &H20&
    Const READ_CONTROL = &H20000
    Const WRITE_DAC = &H40000
    Const WRITE_OWNER = &H80000
    Const SYNCHRONIZE = &H100000
    Sub ProjectVer()
        Dim projVersion As String
        Dim version As String
        projVersion = RegGetValue$(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\00002109B30000000000000000F01FEC\InstallProperties", "DisplayVersion")
        version = Mid(projVersion, 6, 4)
        If (CInt(version) < MIN_PROJ_VERSION) Then
            MsgBox "Your version of Winproj.exe is not valid and may cause problems." & Chr(13) & Chr(13) & _
            "The installation of new version of Microsoft Project is required!" & Chr(13) & Chr(13) & _
            "Required Version: " & Left(projVersion, 5) & MIN_PROJ_VERSION & ".XXXX" & (Chr(13)) & _
            "Found Version:     " & projVersion & Chr(13) & Chr(13) & _
            "Microsoft Project will now Exit." _
            , vbExclamation, "Program Version Check"
            Application.FileExit pjDoNotSave
        End If
    End Sub
    Function RegGetValue$(MainKey&, SubKey$, value$)
       ' MainKey must be one of the Publicly declared HKEY constants.
       Dim sKeyType&       'to return the key type.  This function expects REG_SZ or REG_DWORD
       Dim ret&            'returned by registry functions, should be 0&
       Dim lpHKey&         'return handle to opened key
       Dim lpcbData&       'length of data in returned string
       Dim ReturnedString$ 'returned string value
       Dim ReturnedLong&   'returned long value
       If MainKey >= &H80000000 And MainKey <= &H80000006 Then
          ' Open key
          ret = RegOpenKeyExA(MainKey, SubKey, 0&, KEY_READ, lpHKey)
          If ret <> ERROR_SUCCESS Then
             RegGetValue = ""
             Exit Function     'No key open, so leave
          End If
          ' Set up buffer for data to be returned in.
          ' Adjust next value for larger buffers.
          lpcbData = 255
          ReturnedString = Space$(lpcbData)
          ' Read key
          ret& = RegQueryValueExA(lpHKey, value, ByVal 0&, sKeyType, ReturnedString, lpcbData)
          If ret <> ERROR_SUCCESS Then
             RegGetValue = ""   'Value probably doesn't exist
            If sKeyType = REG_DWORD Then
                ret = RegQueryValueEx(lpHKey, value, ByVal 0&, sKeyType, ReturnedLong, 4)
                If ret = ERROR_SUCCESS Then RegGetValue = CStr(ReturnedLong)
                RegGetValue = Left$(ReturnedString, lpcbData - 1)
            End If
        End If
          ' Always close opened keys.
          ret = RegCloseKey(lpHKey)
       End If
    End Function
  • Project Programmability and Business Intelligence

    New Office Project Server 2007 Developer Training


    This course is designed for Developers extending, developing and integrating with Project Server 2007. This online, instructor-led course provides a deep dive into using Project Server 2007 as a Developer Platform with numerous code demonstrates and hands-on labs. Concepts and topics include architecture for developers, best practices on programming with Project Server Interface (PSI), extending Project Web Access (PWA), migrating applications and security.

    For more information, visit:

    Chris Boyd

  • Project Programmability and Business Intelligence

    New VBA classes and members in Project Professional 2013 Preview


    The What’s new for developers in the new Project desktop (besides task pane apps) article is available in the Office Developer Blog. The VBA and VSTO object model includes includes classes that support new reports with charts, tables, and Office Art. Other new members in the Project object model support the new task paths feature, cache status, and working with tasks lists in SharePoint 2013.

  • Project Programmability and Business Intelligence

    Project Server Cache Synchronization


    Microsoft Office Project Server 2007 and Microsoft Project Server 2010 internally manage cache synchronization by tracking revisions to major entities such as projects and maintaining records for deletions of those entities. Although the Draft, Published, and Archive databases in Project Server are not documented, and direct access to those databases is not supported, a basic understanding of cache synchronization in Project Server can be useful in determining issues of performance optimization. (This article was written by Patrick Conlan, Microsoft Corporation.)

    Warning:   The information in this article is applies only to the specified versions of Project Server, and is subject to change without notice.

    In Project Server 2007, we made a series of changes that were designed to improve the scalability and reliability of Project Server, especially when it is under usage stress. One of the most significant changes was the introduction of several caches, specifically:

    • Client side Active Cache, which creates the *.mpc files that Project Professional users can see on their client computers.
    • Server side Published, Statusing and Reporting SQL schema, which are used to store a project plan of record, enable simultaneous status reporting, and help to make server reporting easy.
    • Server side Archive SQL schema, which caches older data and enables fast administrative restore from the Archive database.

    The location of the master copy of data varies by content. Projects use the Draft database; most other data uses the Published database.

    The caches are synchronized during data movement operations such as the following:

    • Project Professional opens a project from Project Server.
    • Publishing a project, where data is copied from the Draft database to the Published database.
    • Publishing to the reporting database, which is implicit in publishing a project.
    • Many metadata operations move data within a database and between databases.

    We use a fairly complicated versioning scheme to work out what data needs to move as part of the synchronization. Some of you may have already worked out some of the versioning processes!

    Depending on the number of project managers who use Project Professional within an organization, there can be hundreds or even thousands of caches - one on every Project Professional desktop plus the caches in the SQL Server databases. Depending on when they were last synchronized, the caches can contain different versions of project entities.

    Each entity has a primary table that controls the entity version number. For example, MSP_Projects is the primary table for projects. When an entity is created and each time the entity is saved, Project Server uses the entity version to aggregate the edit session changes.

    Version Tracking Schema

    The following schema fragment from the MSP_Projects table shows the fields that are used to track changes at the project level:


    The REV_RANK and PROJ_CURRENT_REV_RANK fields are used to signal an archive restore. If synchronization shows a disparity of rank between caches, then Project Server performs a full resynchronization (in effect resetting the REV_RANK field with a revision = 0)

    The REV_NEXT_SEED field contains the next version number to be used for any changes. The PROJ_CURRENT_REV_COUNTER and MOD_REV_COUNTER contain the active version number. There are two numbers to enable us to see when the document was lasted edited by Project Professional or by another application.

    The CREATED_REV_COUNTER field is either 1 or 0, depending on how the project was created. When Project Professional creates a project, CREATED_REV_COUNTER = 1.

    Handling Deletes

    We had two options for handling deletes in the cache coherency model:

    • Flag the existing data as deleted (an update), or
    • Delete the data and record the deletion, so synchronization can propagate the deletion onward.

    Flagging would give better short term performance (less impact on SQL Server), but would quickly cause data bloat within the most important tables. We decided to use the second option of deleting the data and creating a record of the deletion.

    We use shadow tables to record delete operations for tables that are in the cache synchronization scheme. Shadow tables are very narrow tables that contain the minimum data needed to track deletes. Project Server updates the shadow tables when major entities are deleted.

    The following schema is for the project shadow table, MSP_PROJECTS_SHADOW.

    [PROJ_UID] [dbo].[UID] NOT NULL,
    [DELETED_DATE] [datetime] NOT NULL

    When a project is deleted, it uses just 28 bytes of data in a row of the MSP_PROJECTS_SHADOW table (16 bytes for the GUID + 4 bytes for the INT + 8 bytes for the DATETIME value), plus normal SQL Server page overhead.

    Administrators of Project Server installations that have a lot of data churn should maintain an active archive and delete policy to take advantage of the shadow tables and improve performance.

  • Project Programmability and Business Intelligence

    Getting the PSI URL from an Event Handler



    There have been a few question with regards to how to get the PSI URL from an event handler. To get the URL, you will need to call into the SharePoint object model. So the first step is to create a reference to it:

    using Microsoft.SharePoint;

    Then you are going to need to create a SPSite object, passing in the Site GUID which is a property of the ContextInfo object that is passed into the event handler:

    SPSite ss= new SPSite(contextInfo.SiteGuid);

    From the SPSite object, you can build up the URL to the PSI:

    string.Format("{0}/_vti_bin/psi/{1}.asmx",ss.Url, wsName);

    For impersonation, you will want to use:

    string.Format("{0}//{1}:56737/{2}/psi/{3}.asmx", ss.Protocol, ss.HostName, sspName, wsName);

    Chris Boyd

Page 6 of 11 (255 items) «45678»