Check out my new blog at

Tuesday, October 30, 2007


I am cranking on a small project related to migration to 2007. As always, I will post anything I learn about PSI/.NET/C#. I may be a little quiet for a few days.

Friday, October 26, 2007

Multi-List SharePoint Synchronization to Microsoft Project Enterprise Resource Pool Part II

See my original post here. I have this working on a limited basis (bugs and performance work remain). I implemented a queue in Microsoft SQL Server with .NET XML web services in front of it. Jobs are enqueued and monitored through several web methods: EnqueueJob - Place a job in the queue CancelJob - Cancel a job GetJobStatus - Get status information about a job GetJobErrors - if GetJobStatus indicates an error, a call to this will retrieve the details. The bulk of the synchronization code is implemented as a Windows service that plucks jobs off the queue and processes them. Jobs are composed of meta data that describe how different SharePoint lists relate to the enterprise resource pool. For example, I might have a job that relates SharePoint column "Skills" in a particular site/list to an enterprise resource custom field and its associated lookup table. If the host SharePoint list contains "firefighting, race car driving, and BASE jumping) as skills for Sam, once the job is enqueued and processed, Sam's enterprise resource record will also contain those skills (if all of the skills listed in SharePoint have a corresponding value in the lookup table). The service also supports the concept of "composite fields" where a series of SharePoint columns in a list are concatenate into a single value that is stuffed into a resource text custom field. The need for this came about because our SharePoint lists typically have two columns for name (first and last) whereas Microsoft Project expects resource name as a single string. The Windows service talks to Microsoft Project Server exclusively through the PSI and to SharePoint using the Lists web service. I learned a bunch about the PSI and how to talk to SharePoint using web services. I will look through the code next week and see if anything jumps out as worthy of posting. So, what's next? Next week I am taking a step back from writing code to start doing some planning and I have a few other little projects I am working on. Have a good weekend.

Update Resource Custom Field Text Value

I am working on a framework that updates the enterprise resource pool with data taken from any number of SharePoint sites and lists. I thought I would blog about UpdateResourceCustomFieldTextValue, a method I implemented yesterday. Given a resource GUID, a PROP_UID (which internal to my framework I refer to as a Field GUID), and some text data, update an enterprise resource accordingly:

Every custom field value has its own GUID, so to return a specific value instance in a ResourceCustomFieldDataTable, do the following

Wednesday, October 24, 2007

Adding a Lookup Table Value to an Enterprise Resource's Custom Field

These samples are taken from a much broader framework that I can't post here.  You should be able to figure out the framing you need to get these concepts into play yourself.  If not, comment and I will try to respond.

An enterprise resource custom field "X" defined as Text with Lookup Table is defined.  A resource is created and you need to programmatically add a lookup table value to the resource's X custom field:

Parameter resourceGuid is the Guid of the resource you want to update.

fieldGuid is the MD_PROP_UID defined on the custom field (see ProjTool to see how to get at these programmatically)

valueGuid is the Guid of the specific lookup table value you wish to add to the resource's values.  See below for a code snippet demonstrating how to get at the values.  In particular, the value of LT_STRUC_UID is what you are after here.


Monday, October 22, 2007

Multi-List SharePoint Synchronization to Microsoft Project Enterprise Resource Pool

I hope to get around to writing about Project Server, but these days I am solving a bunch of perimeter problems like integrating existing systems into a coherent source for our eventual Project deployment. One interesting problem came across my desk today. We use Microsoft SharePoint Team Services heavily, across all aspects of our business, to manage everything from sales to production. Of course, we struggle like most companies with establishing ownership of parts of our corporate schema or data model. This schematic delegation is hard...really hard. In the absence of an ERP system, most companies end up with integration at the core of their systems (or the lack of integration). Because we have multiple, distinct systems that each have their own definition of a customer, a resource, an event, or any other myriad components of our corporate schema, we have to integrate the systems to present a sort of federated data model to new systems. At the same time, we are looking to phase-out older systems that currently hold the token for certain components of our schema. What does this mean? It means we have a lot of SharePoint sites that are serving as temporary and even permanent solutions for our business. With Project Server coming in after the fact with respect to existing SharePoint solutions, I have a problem: how do I integrate data from multiple SharePoint workspaces, lists, and sites into our enterprise resource pool? For example, we have a list of all our employees that contains all the normal HR stuff you would expect like address, cell phone, years of employment, etc. There are certain restrictions regarding access to this information, so we have another view of the same data that is trimmed up for general consumption. We have lists of data about trainers as well--for example, the certifications they hold, the courses they are qualified to deliver, and other important attributes. An important part of our to-be information architecture is Microsoft Project Server and I need to build an enterprise resource pool from all of these SharePoint sources. The solution also has to accommodate the ongoing use of the existing SharePoint solutions. With both SharePoint and Project offering web services, all that is missing is a framework to tie the different data sources into the enterprise resource pool. So, I am working away building a data access layer with a source/field mapping mechanism to drive changes from the SharePoint sites (if they hold precedence over the data resident in the resource pool) into the enterprise resource pool. Our SharePoint lists become enterprise resource custom field “editors”. I am just getting into this, working on some prototypes and basic designs. If useful work comes out of it, I will try to post what I learn.

Project Conference

I am not able to attend this year due to family commitments.

Saturday, October 20, 2007

Cool Credits

My wife and I were watching a movie and during the credits I hit pause as I was getting up to go into the kitchen. I looked up and this is what was on the screen (my son's name is Parker). Cool credits!

Where Did You Go?

Several people have asked me lately why I "went dark" on the project management industry for several years. I was out in the community quite frequently for many years, mainly in the public speaking arena, but also in the project management content and publishing spaces as well (PM Boulevard & Project Management Review). Well, I really didn't go dark, I just took a little side road called CIO. I worked at Robbins Gioia as president of PM Boulevard for a couple of years and then opted to be CIO when the opportunity presented itself. The experience there, and the experience of being CIO for the International Institute for Learning, were just another aspect of my project management career. Both companies are project and program management companies, but more importantly I was doing real project management (with various decrees of success). It was the best thing for me. When I was technical product manager for Microsoft Project back in the late 90's, Microsoft put me on the road to spread the word about the 98 release. One speaking engagement was memorable. I was speaking in Germany at some airport hotel about Microsoft Project 98's extensibility story (mainly the new support for saving to a SQL/Oracle database). The talk went well I thought, but after the panel discussion a gentleman approached me with this to say: "Experts are like wine, the older the better". I was only 23 years old at the time, so who could blame him? The comment stuck with me and effected subsequent career decisions. My work at Pacific Edge with Scott Fuller, Ken Inglis, and Brian Kennemer marked a real turning point for me with respect to my career in project management. I learned a ton about project management (mainly what not to do, see this article--there is a picture there but it isn't me... have to ask NASA about that one!). We built a good product. After Project Office 3.0 shipped, I was looking for a change. I wanted to move East and experience the East Coast. Eric Gioia and John Gioia were happy to have me at PM Boulevard (located in Alexandria, VA -- a beautiful town). We worked hard on the site. Eric Gioia, Jim Tisch, and my development crew there were awesome. We shipped a new version of PM Boulevard complete with a serious content management system and a great look. After that, I was off to be CIO and then CTO of Robbins Gioia. After Robbins Gioia's acquisition, I was looking to move back to Seattle or try something different. I decided to come to New York and work for LaVerne Johnson at IIL. So, now I am back working at core project management problems. In particular, I have been working with a great team to build a project management competency framework. The resultant technology is quite interesting. I spent about 6 months building a .NET/C# framework to enable a highly flexible assessment delivery and analysis platform. These days I am working on Microsoft Project Server. This blog serves as a repository for the things I have and will learn. Not much content exists right now, but I type like a bandit so expect more. I enjoy being back in touch with my community again. Thanks to all for the encouragement. I live in Missouri now (a story for another day.)

Friday, October 19, 2007

Working on a book review...

This 1972 book about the Polaris Missisle System is a great overview of a pioneering project. More to come.

Titles are working now...

Thanks Brian.
Visual Studio 2005 bury the immediate window? The only way I could get it up is to open the command window and type 'immed'. Of course, the immediate window is kind of evil. It reminds me of my Excel VBA days when one would do sort of dynamic programming, hack and compile, hack and compile...

Identifying available and qualified resources for project work is certainly not a technology problem but technology can help. I have built a resource availability search tool. The search engine takes inputs such as skills, languages (spoken), location, and any other combination of enterprise resource custom fields (lookup table values only) and returns a list of resources who fit the bill. A date range can also be provided to narrow the search further.

Underneath, the code expects name value pairs of field guids and the guids of the values of the lookup table you want to match. For example, one might have an enterprise resource custom field called "language" with PROP_UID ='2558a2d1-a3a5-43c1-aae9-57f806ec6058' with values:

  • English LT_STRUCT_UID = '4e3ab663-a54b-475e-b04b-0df00d9fd504'
  • Mandarin LT_STRUCT_UID = '04ca2ccb-ede9-4118-b2a2-820b7e829ab2'
  • Dutch LT_STRUCT_UID = 'e544e03a-2382-4654-88f6-a865cedb5110

The search tool's backend is implemented as two web services:

  1. RegisterResourceAvailabilityRequest - Takes an instance the Availability class and loads it up in some SQL tables. I chose to save the query parameters (or resource availability request) because I wanted to track which queries are frequently requested. In later versions, I hope to offer those queries pre-packaged in the user interface.

2. GetAvailableResources - Takes the request ID just generated from the previous call to RegisterAvailabilityRequest and processes it. The return dataset contains the Resource names and guids of the resources who matched the availability request. If request.IncludeAll is set to true, all resources who matched the criteria are selected.

The Project team agonizes over extenisbility features every release. I know, I used to work there. They have done a masterful job this time out! I remember in the days of Proj 98, I was so stoked to be able to save out a project to a SQL database. I am having fun with the PSI

The code snippet below will unpack PSClient error data and append it to a textbox or stuff it in the event log. Click the image for the source. I lifted this from the SDK (
Microsoft Project AddIn Part II Here is a video of the UI coming down and then bringing it back up.
Microsoft Project 2007 COM AddIn
I am working on a COM AddIn for MSP 2007, using VS2005 (C#). The add-in will do many things, but one requirement in particular is interesting: detect when a project of a specific "type" (explained in a minute) is opened and completely reconfigure the Project user interface, So, how far can you take configuring the Project UI? Pretty far. In fact, take a look at this image.  Microsoft Project 2007 with Minimum User Interface The Application.CommandBars collection gives the developer quite a bit of control over the menus and toolbars expressed in the user interface.  I opted to remove them all, so I can start with a clean Microsoft Project user interface.  The next step was to create my own replacement menus and toolbars.  Also, I have to restore the user interface when the user closes one of the specially "typed" projects.  An enterprise custom field exists that sets the "type" of the project.  Without going into specifics, the point is to radically modify the user interface of Project for these types of projects.  More on this is subsequent posts.

Thursday, October 18, 2007

Adventures in Microsoft Project Server 2007 Programming -- Custom Fields & Filters The latest release from Microsoft is interesting. I am doing some exploratory work with the SDK at the moment. To retrieve lookup table values from a Multilanguage lookup table, something like this is required (click the image); I would rather have access to docs on the resultant XML (filter.GetXml())rather than dealing with building filters using the syntax above. On the upside, the read methods of different variaties seem to perform quite well. Brian Kennemer mentioned Christophe's article on perf:

Here are a couple of important links to follow regarding using filters with the PSI: How to: Use a Filter Parameter with PSI Methods PSI: Filter constraints and escaping the recursive event handler


Content on this site is provided "AS IS" with no warranties and confers no rights. Additionally, all content on this site is my own personal opinion and does not represent my employer's view in any way.