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

    Using the updated ChangeXML utility for Statusing


    The Statusing methods in the Project Server Interface (PSI) in Microsoft Project Server 2010 enable one user to read, submit, and update assignment and task status for another user, without resorting to impersonation. In the Project Server 2007 SDK, the How to: Generate ChangeXML for Statusing Updates article shows how to generate the changeXml parameter for the UpdateStatus method, validate the XML, and use the ReadStatus and SubmitStatus methods. The Project 2007 SDK download includes the complete Visual Studio 2005 solution for the ChangeXML utility. However, the ChangeXML utility could only update status for the current user.

    The ChangeXML utility  is now updated for Project Server 2010, in the attached file. With it, you can generate the changeXml parameter and update status for the current user or for another user. To update status for another user, the utility uses the ReadStatusForResource and UpdateStatusForResource methods. In addition, the utility checks whether the current user has the global StatusBrokerPermission security permission, adds the ResID attribute to the changeXml parameter, and validates the XML against the updated ChangeList.xsd schema in Project Server 2010. For more information about the ChangeList.xsd schema, see Introduction to the ChangeList Schema and Statusing ChangeXML.

    Note: The ChangeXML utility is designed for use only on a test installation of Project Server 2010, as an example of a programming utility for statusing. It should not be used on a production installation.

    The updated ChangeXML utility also has several other changes. The previous version uses the ASMX interface, which was the only choice available for Project Server 2007. In the updated version, you can choose to programmatically initialize the WCF interface of the PSI by entering the Project Web App URL, or by using the WCF endpoint values in the app.config file. In the following screenshot, the login is automatic if you use the app.config value.


    Note: To use the app.config file, change the URL to the value for your PWA instance, for each PSI service endpoint.

    In the main window, after you log on Project Server, choose Build Change XML.


    You can choose to update the status of available assignments for the current user, or – if you have the StatusBrokerPermission – you can choose another user and update assignments for that user. In the following screenshot, the update is for another user. The Items available for update list shows the Project name : Task name : User name values for each item. You can choose to update assignment values or task values for that assignment. The Generate a Change dialog box shows different controls in the Update section, depending on what kind of update you choose. For example, if you choose to update an assignment custom field, you can choose the custom field and the lookup table value, if the custom field uses a lookup table.


    When you choose Update XML, the tool generates the changeXml parameter value, as follows:


    Following is the changeXml parameter value in the case shown, for updating the Health assignment custom field. Note that the XML value includes the ResID attribute for the Assn element.

    <Changes xmlns:xsi="" xmlns:xsd="">
      <Proj ID="a3e78597-2302-45fc-bb15-7f23d74efdf8">
        <Assn ID="b001d2d9-69eb-49a0-aa9f-6bbe53f9484c"
    ResID="aa3a6f6f-bb70-4d2e-92da-b06580ae6376"> <LookupTableCustomFieldChange IsMultiValued="false"
    CustomFieldName="Health"> <LookupTableValue
    Guid="0000c45d-8a43-4eb0-9b74-e535b391988a">Late</LookupTableValue> </LookupTableCustomFieldChange> </Assn> </Proj> </Changes>

    You can clear the Run Update check box to just validate the changeXml parameter. For example, manually change one of the elements, attributes, or values in the XML, and see if it still validates. Or, you can check Run Update to validate and run the change.

    When the change is completed, try opening the project in Project Professional. If you are the project manager, you are prompted to review the status change in PWA. If you accept the change in PWA, to see the change, open the project in Project Professional. For example, if you changed the Health assignment custom field, go the the Task Usage view, and then add the Health field to the view.


    After you save and publish the project, you can also see the change in the Reporting database. For example, run the following query in SQL Server Management Studio for the RDB:

    SELECT TOP 1000 [AssignmentUID]
          , [ResourceUID]
          , [Health_T]
        FROM [ProjectServer_Reporting].[dbo].[MSP_EpmAssignment_UserView]

    Find the correct assignment and resource GUIDs in the Results pane:


    The ChangeXML utility is useful for creating and testing values of the changeXml parameter for the UpdateStatus method,
    you can create and test changes for the current user and for other Project Server 2010 users. It also contains code examples
    that show how to check for a security permission of a resource and use statusing methods.

    Updating the ChangeXML utility

    Here are the main steps that were used to update the application from Project Server 2007 to 2010. The user interface had only
    minor tweaks, because that was not an issue for a test tool.

    1. Open in Visual Studio 2010 to update the solution; change the target to .NET Framework 3.5.
    2. Add a reference to the updated ProjectServerServices.dll, which contains a proxy WCF interface of the PSI services.
    3. Remove ASMX initialization; initialize PSI services for WCF (programmatic and/or with app.config). This step is not
      essential, but the WCF interface is recommended for moving forward.
    4. Modify the login dialog box; use the WCFHelpers.dll assembly from ProjTool for login routines. The ProjTool code for
      Project Server 2010 is in the SDK download.
      Note: The logon routines for Forms authentication are not updated in this sample.
    5. Get and display the StatusBrokerPermission value for the current user. Enable the Update for user option if the current
      user has the correct permission.
    6. Get the list of active resources, by using ReadUserList; add the ResourceItem class for combobox display and values.
    7. Refresh the list of items to update, by using ReadStatusForResource.
    8. Add ResID to classes for generating and displaying the changeXml parameter (ChangesProj, ChangesProjAssn,
      ChangesProjTask, and Items).
    9. Remove the empty ResID attribute in the changeXml value for the current user.
    10. Run statusing updates for a selected user, by using SubmitStatusForResource.
    11. Test

    In actuality, testing occurs after each step is completed.

    —Jim Corbin

  • 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

    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

    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

    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

    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

    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

    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

    Using the Ribbon Designer with Project Client



    In this post, I will be showing how you can use the Ribbon designer in Visual Studio 2010 to create custom ribbons in Project Client 2010. To get started, you will need a copy of Visual 2010 with the Office Tools installed and Project Client 2010 installed.

    1. To get started, open Visual Studio and create a new Project 2010 add-in:

    2. Next, you need to add the Ribbon Designer by adding a user control to you project:

      image image
    3. In the Ribbon Designer, add the controls you want to include on your ribbon. In my example, I am going to add a simple button, which when clicked, will display a message box with the name of the active project:

    4. Double click on the button to view the code for the ribbon. Here, we are going to add a reference to the Project interop assembly and a static variable that will reference the application:     

      Code Snippet
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. using Microsoft.Office.Tools.Ribbon;
      8. using MSProject = Microsoft.Office.Interop.MSProject;
      10. namespace ProjectAddIn2
      11. {
      13.     public partial class Ribbon1
      14.     {
      15.         public static MSProject.Application Appliction;
      17.         private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
      18.         {
      20.         }
      21.     }
      22. }

    5. The next step is to set the Application variable in the start up method of the add-in:

      Code Snippet
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. using System.Xml.Linq;
      6. using MSProject = Microsoft.Office.Interop.MSProject;
      7. using Office = Microsoft.Office.Core;
      9. namespace ProjectAddIn2
      10. {
      11.     public partial class ThisAddIn
      12.     {
      13.         private void ThisAddIn_Startup(object sender, System.EventArgs e)
      14.         {
      15.             Ribbon1.Appliction = Application;
      16.         }
      18.         private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
      19.         {
      20.         }
      22.         #region VSTO generated code
      24.         /// <summary>
      25.         /// Required method for Designer support - do not modify
      26.         /// the contents of this method with the code editor.
      27.         /// </summary>
      28.         private void InternalStartup()
      29.         {
      30.             this.Startup += new System.EventHandler(ThisAddIn_Startup);
      31.             this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
      32.         }
      34.         #endregion
      35.     }
      36. }

    6. Last step is to add a message box that displays the name of the project:

      Code Snippet
      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. using System.Text;
      5. using Microsoft.Office.Tools.Ribbon;
      8. using MSProject = Microsoft.Office.Interop.MSProject;
      9. using System.Windows.Forms;
      11. namespace ProjectAddIn2
      12. {
      14.     public partial class Ribbon1
      15.     {
      16.         public static MSProject.Application Appliction;
      18.         private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
      19.         {
      21.         }
      23.         private void button1_Click(object sender, RibbonControlEventArgs e)
      24.         {
      25.             MessageBox.Show("Active Project: " + Appliction.ActiveProject.Name);
      26.         }
      27.     }
      28. }

    When you compile and run the application, you should see Project client boot and have the ribbon appear:


    Hope this helps,


    Chris Boyd

  • 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

    MSDN Webcast: Project 2010 JS Grid Extensibility: Project Web App


    Pat Malatack (Program Manager, Microsoft Corporation) has a comprehensive series of webcasts on extending the JS Grid in Project Web App.

    Note:  This blog post was originally created Monday, April 19, 2010. The webcasts were missing for the past several months, but have been reinstated on the Microsoft Events site (

    MSDN Webcast: Project 2010 JS Grid Extensibility: Project Web App (Part 1 of 3) (Level 400)
    Tuesday, April 20, 2010
    1:00 P.M.-2:00 P.M. Pacific Time
    This is the first webcast in a three-part series on extending grid pages in Microsoft Office Project Web App. In this webcast, we focus on initializing custom grid code and interactions between the grid and the Project Web App Ribbon. In particular, we show you how to add additional functionality to the Project Center.
    MSDN Webcast: Project 2010 JS Grid Extensibility: Project Web App (Part 2 of 3) (Level 400)
    Thursday, April 22, 2010
    1:00 P.M.-2:00 P.M. Pacific Time
    This is the second webcast in a three-part series on extending grid pages in Microsoft Office Project Web App. In this webcast, we focus on the use of events and delegates to interact with the timesheet grid in a way that allows for the addition of custom features and functionality to that page.
    MSDN Webcast: Project 2010 JS Grid Extensibility: Project Web App (Part 3 of 3) (Level 400)
    Tuesday, April 27, 2010
    1:00 P.M.-2:00 P.M. Pacific Time
    This is the third webcast in a three-part series on extending grid pages in Microsoft Office Project Web App. In this webcast, we walk you through more grid customizations, including adding custom commands to the column header dropdown and custom row header states.

  • 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

    Sweeten your Project 2010 environment with Custom Fields


    The Project 2010 SDK nicely documents Custom Field functionality – very important functionality for customizing Project 2010 - Custom Fields enable you to capture and calculate additional metadata for Projects, Resources, Tasks and Assignments. Project 2010 SDK: “You can filter, group, sort, and create OLAP cubes and reports based on custom field values. Project 2010 extends the functionality and ease of use of custom fields compared to previous versions of Project.” – lot of power and relatively easy to do! However – proper planning is strongly advised :)

    Project 2010 SDK: Custom Fields in Project 2010 (

    Many executives like graphical indicators – that simple graphically show the values in your Custom Fields (Visual Studio not required, all could be configured via PWA or Project Desktop User Interface, even when an advanced calculation formula is required) -

    Using Formulas and Graphical Indicators with Custom Fields (

    Using graphical indicators in Project

  • 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

    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

    Project Conference


    I just wanted to give everyone a heads up about the upcoming Project Conference. Details can be found here:

    There will be a Developer/IT Professional track that we will be presenting on a verity of development topics that cover the PSI, Events, Reporting and Project Client. I will provide further details about my presentation as I start to develop my slide decks.

    Chris Boyd

  • Project Programmability and Business Intelligence

    The future is here! Project 2010 is announced at the Project Conference!


    Ladies and gentlemen – if you were not able to come in person to see the Chris Capossela’s keynote at the Project Conference in Phoenix – please check this out

  • Project Programmability and Business Intelligence

    Forms Authentication in SQL Reporting Services


    Phil passed along a blog entry from one of our SQL colleagues which mentions how to support Forms Authentication in SQL Reporting services. It isn’t enabled out of the box but it can be supported. This is cool news for all forms users who want to access reports. We haven’t tried it out yet but let us know if you get it working:


  • 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

    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

    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

    Building an app for Project Server 2013


    Alex Burton, a Project MVP, has published a series of posts titled Building your first Project Server app on the EPMSource blog. The app is named Publish All; it publishes all enterprise projects for the PWA instance where the app is installed. The Publish All app is developed by using the Project Server JavaScript object model (JSOM) with "Napa" Office 365 Development Tools, and can be deployed to Project Online and to an on-premises installation of Project Server 2013.

    The blog series includes the following parts:

    Alex has even gone so far as to add a support page for the Publish All app, at It looks to be a very useful series.

    For more information about the Napa tools, see How to: Create a basic app for SharePoint by using Office 365 Development Tools on MSDN. For information about using Visual Studio 2012 with the JSOM for Project Server, see Getting started with the Project Server 2013 JavaScript object model.

  • 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

  • Project Programmability and Business Intelligence

    Channel 9 videos on VSTS 2010 and Business Alignment



    Ameya just did a blog post about VSTS 2010 plans. One in particular is about Enterprise Project Management and Visual Studio Team System 2010:


  • Project Programmability and Business Intelligence

    Project Server Developer Bookmarks




    Christophe posted a great set of Project Server Developer bookmarks: 


Page 6 of 11 (255 items) «45678»