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

    Writing and Debugging Event Handlers for Project Server 2007

    • 1 Comments

    Another Visual How-to for Project development is published on MSDN: Writing and Debugging Event Handlers for Project Server 2007

     

    In less than 12 minutes, the video shows the development, testing, and debugging of a simple event handler for publishing projects. The OnPublishing event handler cancels publishing if the project name does not satisfy a specified condition, and then logs an application event on the server. The video shows the use of Visual Basic code; the related article includes both Visual Basic and C# code.

     

    The Visual How-to is based on the Project SDK article, How to: Write and Debug a Project Server Event Handler.

  • Project Programmability and Business Intelligence

    Scrum. Scrum? Scrum Solution Starter for Project 2010!

    • 0 Comments

    Yes – it’s here for few weeks now - http://code.msdn.microsoft.com/P2010Scrum. Details are here.

    Thanks for all the comments, keep them coming!

  • Project Programmability and Business Intelligence

    Getting your Custom Project Guide to work in Project 2007

    • 1 Comments

    Happy Holidays! This post is from Nada Alwarid, a co-worker that is responsible for the project guide:

    In Project 2007, class IDs have changed.  Because of that, your custom Project Guide solutions cannot work until you update those class ID’s.  In this post, I’ll outline what those changes are so you can get your custom solution working.

    We have objects declared like this:

    <object id="TextConv"

          classid="clsid:0F5E0D2C-54F2-41D9-835F-06B3045B7059"

          type="application/x-oleobject"

          style="display: none">TextConv failed to load!

    </object>

    The id of the object is not important, its only used for referencing it within the HTML or Jscript code. The important part is the classID. It is used to actually look up that object in the list of ActiveX objects registered with the OS and load it.

    These IDs have changed from Project 2003 to Project 2007.

    The mapping from Project 2003 to Project 2007 is:

    Object Name

    Project 2003 Class ID

    Project 2007 Class ID

    Text Converter

    1CFC2250-9B5C-4546-ABA1-1F69A06DCA12

    0F5E0D2C-54F2-41D9-835F-06B3045B7059

    Document Event Object

    494B3458-3EFF-4C66-9C86-D47670D69634

    5500517E-1890-48B4-800E-D9FC609E6DC2

    Application Event Object

    04EEB710-3EB7-4B69-9281-E9BBB7B35959

    13D338F1-AA3F-444E-A2B7-BC98EFB03484

    Datepicker

    A709EC93-E1F9-4bc4-A9CB-7FDB51CD0EF1

    03660567-F7F2-4e2b-A13C-C6607A726AF5

     

    Also, you can download the default Project Guide files that has been attached to this post.

     Nada

     

  • Project Programmability and Business Intelligence

    New SQL Reporting Services Sample Reports for Project Server

    • 0 Comments

    Hello,

    Christophe just released the reports that ship with the updated EPM 2007 VPC:

    http://blogs.msdn.com/chrisfie/archive/2008/04/10/new-sql-reporting-services-sample-reports-for-project-server.aspx

    Chris

    Technorati Tags: ,
  • Project Programmability and Business Intelligence

    Using the Reporting Database and Excel – Part 1

    • 1 Comments

    I am not sure if this is a programmability post, but there have been many requests to do a post on writing a report in Excel that collects data from the reporting database. Since this will involve SQL and many developers who write code against Project Server will also need to write reports; this may be useful to the developer community. I am going to break this into two posts because it is fairly long and there is a logical break. In the first post, we will create the SQL query to retrieve the data from the reporting database. In the second post, I will describe the process of using the query in Excel to write reports.

    Before we begin, it should be known that there is a dedicated reporting database in Project Server 2007. This database is separate from the working and publish database that is heavily used by Project Professional and Project Server. Every time a project is published, or resource is updated, the data is pushed to the reporting database. The reporting database provides a supported interface for gathering project data via SQL queries. This reporting database has been setup to easily create reports.

    Someone posted that they wanted a report that showed the assigned work for each resource, grouped by project and then by month. This will allow project managers to better understand the allocation of resources by month. I will try my best writing the query for this, but I shell add the warning that this has not been tested. If you find a mistake, or a better way of writing the query, please post it as a comment.

    To begin, we need to write a SQL query against the reporting database to get at the data we need. I wrote the SQL query in stages. The first step was to get the assignment data from the projects. To do that, I wrote the following query:

    SELECT

    base.ResourceUID as 'Resource',

    assn.TimeByDay as 'Day',

    assn.AssignmentWork as 'Assigned'

    FROM

    MSP_EPMAssignmentByDay_UserView  AS assn

    INNER JOIN MSP_EPMAssignment_UserView AS base

                ON (assn.AssignmentUid  = base.AssignmentUID)

    This gives us all the assignments for each resource by name. We will also want the project name that the assignment is coming from. To do this, we will have to do another join on the MSP_EmpProject_UserView:

    SELECT

    base.ResourceUID as 'Resource',

    assn.TimeByDay as 'Day',

    assn.AssignmentWork as 'Assigned',

    ProjectName

    FROM

    MSP_EPMAssignmentByDay_UserView  AS assn

          INNER JOIN MSP_EPMAssignment_UserView AS base

                ON (assn.AssignmentUid  = base.AssignmentUID)   

    INNER JOIN MSP_EpmProject_UserView

    ON base.ProjectUID = MSP_EpmProject_UserView.ProjectUID

    Now we have all the assignment data for each resource. For this report we will also want to capture assignments outside of a project. An example of this would be vacation time. To get at this information, we are going to query the Timesheet tables in the reporting database.

    SELECT

    MSP_TimesheetResource.ResourceUID as 'Resource',

    ts.TimeByDay as 'Day',

    ts.ActualWorkBillable as 'Assigned'

    FROM

    MSP_TimesheetActual AS ts

          INNER JOIN MSP_TimesheetLine AS tl

                ON (ts.TimesheetLineUID = tl.TimesheetLineUID)

    INNER JOIN MSP_TimesheetClass AS tc

    ON tl.ClassUID = tc.ClassUID

    INNER JOIN MSP_Timesheet AS tsowner

    on tl.TimesheetUID = tsowner.TimesheetUID

    INNER JOIN MSP_TimesheetResource

    ON tsowner.OwnerResourceNameUID = MSP_TimesheetResource.ResourceNameUID

    WHERE

    tc.[Type] = 2

    This returns all the timesheet lines for none project work.

    Now we have all the assignments. The next step is to combine the two queries. To do this, I used the union statement. You will notice that in the timesheet query we do not have a project name in the select. We are going to add the project name to the select by adding 'None Project Time' as ProjectName to the select statement. Here are the combined queries:

    SELECT

    base.ResourceUID as 'Resource',

    assn.TimeByDay as 'Day',

    assn.AssignmentWork as 'Assigned',

    ProjectName

    FROM

    MSP_EPMAssignmentByDay_UserView  AS assn

          INNER JOIN MSP_EPMAssignment_UserView AS base

                ON (assn.AssignmentUid  = base.AssignmentUID)   

    INNER JOIN MSP_EpmProject_UserView

    ON base.ProjectUID = MSP_EpmProject_UserView.ProjectUID

     

    Union ALL

     

    SELECT

    MSP_TimesheetResource.ResourceUID as 'Resource',

    ts.TimeByDay as 'Day',

    ts.ActualWorkBillable as 'Assigned',

    'None Project Time' as ProjectName

    FROM

    MSP_TimesheetActual AS ts

          INNER JOIN MSP_TimesheetLine AS tl

                ON (ts.TimesheetLineUID = tl.TimesheetLineUID)

    INNER JOIN MSP_TimesheetClass AS tc

    ON tl.ClassUID = tc.ClassUID

    INNER JOIN MSP_Timesheet AS tsowner

    on tl.TimesheetUID = tsowner.TimesheetUID

    INNER JOIN MSP_TimesheetResource

    ON tsowner.OwnerResourceNameUID = MSP_TimesheetResource.ResourceNameUID

    WHERE

    tc.[Type] = 2

    So now we have all the assignment data together. The last step is join with the resource table to get the name of the resources and to group by various fields to roll up the data.

    SELECT

    ProjectName,

    MSP_EpmResource.ResourceName,

    CAST(YEAR(Day) as Varchar(4)) + '-' + CAST(MONTH(Day) as Varchar(2)) as Month,

    SUM(Assigned) as Assigned

    FROM

    MSP_EpmResource

    Right Join

    (

     

    SELECT

    base.ResourceUID as 'Resource',

    assn.TimeByDay as 'Day',

    assn.AssignmentWork as 'Assigned',

    ProjectName

    FROM

    MSP_EPMAssignmentByDay_UserView  AS assn

          INNER JOIN MSP_EPMAssignment_UserView AS base

                ON (assn.AssignmentUid  = base.AssignmentUID)   

    INNER JOIN MSP_EpmProject_UserView

    ON base.ProjectUID = MSP_EpmProject_UserView.ProjectUID

     

    Union ALL

     

    SELECT

    MSP_TimesheetResource.ResourceUID as 'Resource',

    ts.TimeByDay as 'Day',

    ts.ActualWorkBillable as 'Assigned',

    'None Project Time' as ProjectName

    FROM

    MSP_TimesheetActual AS ts

          INNER JOIN MSP_TimesheetLine AS tl

                ON (ts.TimesheetLineUID = tl.TimesheetLineUID)

    INNER JOIN MSP_TimesheetClass AS tc

    ON tl.ClassUID = tc.ClassUID

    INNER JOIN MSP_Timesheet AS tsowner

    on tl.TimesheetUID = tsowner.TimesheetUID

    INNER JOIN MSP_TimesheetResource

    ON tsowner.OwnerResourceNameUID = MSP_TimesheetResource.ResourceNameUID

    WHERE

    tc.[Type] = 2

     

    ) b

    on MSP_EpmResource.ResourceUID = Resource

    GROUP BY

    ProjectName,

    Resource,

    CAST(YEAR(Day) as Varchar(4)) + '-' + CAST(MONTH(Day) as Varchar(2)), MSP_EpmResource.ResourceName

    Order By

    Month

    You will notice that I have stripped out the day from the date. This is how we can roll up the assignments for each resource by month.

    We now have our completed query! The next step is to get this data into Excel…

    Chris Boyd

     

  • Project Programmability and Business Intelligence

    ANNOUNCING: 15 upcoming Developer and 2 BI webcasts for Project 2010!

    • 2 Comments

    It’s my pleasure to announce series of upcoming Project 2010 webcasts for developers and BI specialists - spanning from extending User Interface of Project 2010 to deep drill down on workflow creation and extending the BI using Excel Services and Performance Point Services!

    We would like to also announce the Project 2010 Solution Starters! They were created to help in deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! In this regard we offer two series of Web Casts – the introductory series as well as deep code drill-down. Please note the source code and additional documents will be available after the respective webcast.

    What is in this post?

    · Project 2010 Developer webcasts

    · Project 2010 Business Intelligence webcasts

    · Project Developer “Real-World Solutions” series webcasts

    · Additional Resources for Project 2010

    · Q&A

    Project 2010 Developer Targeted webcasts

       image
    (yes – this timeline was created using Project Professional 2010)

     

    Title

    Level

    Date

    Abstract

    Presenter

    URL

    MSDN Webcast: Project 2010 and Project Server 2010 Programmability

    200

    On Demand

    In this webcast, we provide an overview of the programmability enhancements that are in the upcoming versions of Microsoft Office Project 2010 and Microsoft Office Project Server 2010. We highlight Windows Communication Foundation, Ribbon programmability, and the new programmability features such as Workflow. We also discuss writing backwards compatibility for Microsoft Office Project 2007 applications.

    Chris Boyd, Program Manager, Microsoft Corporation

    http://www.microsoft.com/events/series/epm.aspx?tab=Webcasts&seriesid=51&webcastid=7432

    MSDN Webcast: Project 2010 JS Grid Extensibility (Part 1 of 3): Project Web App

    400

    On Demand

    The first in a series of webcasts on extending grid pages in Project Web App it will focus on initializing custom grid code and interactions between the grid and the Project Web App Ribbon.  In particular we will see how to add additional functionality to the project center.

    Pat Malatack, Program Manager, Microsoft Corporation

    http://www.microsoft.com/events/series/epm.aspx?tab=Webcasts&seriesid=51&webcastid=13327

    MSDN Webcast: Project 2010 JS Grid Extensibility (Part 2 of 3): Project Web App

    400

    On Demand

    This second grid talk will focus on the use of events and delegates to interact with the timesheet grid in a way that allows one to at custom features and functionality to that page

    Pat Malatack, Program Manager, Microsoft Corporation

    http://www.microsoft.com/events/series/epm.aspx?tab=Webcasts&seriesid=51&webcastid=13328

    MSDN Webcast: Project 2010 JS Grid Extensibility (Part 3 of 3): Project Web App

    400

    On Demand

    In this final grid extensibility talk we will walk through even more grid customizations including adding custom commands to the column header dropdown and custom row header states

    Pat Malatack, Program Manager, Microsoft Corporation

    http://www.microsoft.com/events/series/epm.aspx?tab=Webcasts&seriesid=51&webcastid=13329

    MSDN Webcast: Project 2010 User Interface Customizations

    300

    On Demand

    This presentation will focus on Project Client user interface customization. In particular, the new Ribbon interface and custom task panes. It will also introduce the Project 2010 VSTO add-in and show how to use the Ribbon designer.

    Chris Boyd, Program Manager, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449001&Culture=en-US

    MSDN Webcast: Project 2010 Workflow Deep Dive (Part 1 of 2): PWA & Admin Experience

    200

    Thursday, May 13, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    This web Cast will cover technical details of how workflows work within Project Server 2010.  We will go into how we are built ontop of sharepoint, how workflows connet with PWA, and what customizations can be done through UI level.

    Sam Chung, Program Manager, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449005&Culture=en-US

    MSDN Webcast: Project 2010 Workflow Deep Dive (Part 2 of 2): Workflows in Visual Studio

    400

    Tuesday, May 26, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    This web Cast will cover the end to end story of creating workflows within Visual Studio.  We will discussing how to setup Visual Studio, how to create a basic workflow, and go over the different activities a developer will need in order to create a Project Server 2010 workflow.

    Sam Chung, Program Manager, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449563&Culture=en-US

    MSDN Webcast: Project 2010 Software Development Kit (SDK) Drill-down

    200

    Thursday, May 27, 2010

    Learn about the Project 2010 SDK content for Project Professional as well as for Project Server. This Web Cast explores the major parts of the SDK and includes development demonstrations using some the new Project 2010 features.

    Jim Corbin, senior Programming Writer, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032450102&Culture=en-US

    MSDN Webcast: Project 2010 Tailored Tools for Workflow Creation

    300

    Tuesday, June 1, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    This Web Cast will cover the different approaches customers and partners can take to create Project Server 2010 Workflows.  Whereas previous only Visual Studio was supported for creating Project 2010 Workflows, investments within this area has now opened up different avenues for our customers and partners to create these workflows.  In particular we will be covering some tools and partnerships which have been created for this particular purpose. 

    Sam Chung, Program Manager, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449569&Culture=en-US

    MSDN Webcast: Project 2010 Powerful Extensibility Using Visual Studio Tools

    400

    Thursday, June 3, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    Using the extensibility features of Microsoft Project 2010, I will show you how to
    1. Create a list of tasks in Microsoft Project that will require updating during a regular status update cycle
    2. Display that list as flexible grid using a Windows Form that can be sorted.
    3. Export the data to an XML file for opening in another program such as Excel or a Browser.
    We'll do this using Visual Studio, so it will be for real.

    Jim Aksel, Project MVP, Director, Celeris Systems

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449571&Culture=en-US

    MSDN Webcast: Project 2010 Solution Starters (Part 1 of 2): Achieve Results Quickly

    200

    Tuesday, June 8, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    The purpose of creating the Project 2010 Solution Starters was to help in the deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! Please check Project 2010 developer center at http://msdn.microsoft.com/project for more details!
    This Web Casts will go over the user experience of these tools.

    Bobby Burns, Sam Chung, Program Managers, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449691&Culture=en-US

    MSDN Webcast: Project 2010 Solution Starters (Part 2 of 2): Achieve Results Quickly

    200

    Thursday, June 10, 2010

    The purpose of creating the Project 2010 Solution Starters was to help in the deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! Please check Project 2010 developer center at http://msdn.microsoft.com/project for more details!
    This Web Casts will go over the user experience of these tools.

    Bobby Burns, Sam Chung, Program Managers, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032450819&Culture=en-US

    MSDN Webcast: Project 2010 Solution Starters Drilldown & Code Walkthrough (Part 1 of 4)

    400

    Tuesday, June 15, 2010

    The purpose of creating the Project 2010 Solution Starters was to help in the deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! Please check Project 2010 developer center at http://msdn.microsoft.com/project for more details!
    These Web Casts will drill down and provide detailed code-level walkthrough for these tools.

    Mike Shughrue, Principal Consultant, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032450823&Culture=en-US

    MSDN Webcast: Project 2010 Solution Starters Drilldown & Code Walkthrough (Part 2 of 4)

    400

    Thursday, June 17, 2010

    The purpose of creating the Project 2010 Solution Starters was to help in the deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! Please check Project 2010 developer center at http://msdn.microsoft.com/project for more details!
    These Web Casts will drill down and provide detailed code-level walkthrough for these tools.

    Mike Shughrue, Principal Consultant, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032450826&Culture=en-US

    MSDN Webcast: Project 2010 Solution Starters Drilldown & Code Walkthrough (Part 3 of 4)

    400

    Tuesday, June 22, 2010

    The purpose of creating the Project 2010 Solution Starters was to help in the deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! Please check Project 2010 developer center at http://msdn.microsoft.com/project for more details!
    These Web Casts will drill down and provide detailed code-level walkthrough for these tools.

    Mike Shughrue, Principal Consultant, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032451063&Culture=en-US

    MSDN Webcast: Project 2010 Solution Starters Drilldown & Code Walkthrough (Part 4 of 4)

    400

    Thursday, June 24, 2010

    The purpose of creating the Project 2010 Solution Starters was to help in the deployment and customization of Project Server 2010. This set of Solution Starters is focusing on Demand Management experience in Project 2010. The Solution Starters source code will be publicly available via MSDN Code Gallery - so anyone can extend the experience! Please check Project 2010 developer center at http://msdn.microsoft.com/project for more details!
    These Web Casts will drill down and provide detailed code-level walkthrough for these tools.

    Mike Shughrue, Principal Consultant, Microsoft Corporation

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032451066&Culture=en-US

    Project 2010 Business Intelligence

    Title

    Level

    Date

    Abstract

    Presenter

    URL

    MSDN Webcast: Project 2010 BI & Portfolio Reporting (Part 1 of 2): Advanced Techniques

    300

    Friday, May 21, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    Web Cast 1 users will have the ability to understand how to utilize Excel Services, Reporting Services and Dashboard Designer to create organizational specific Dashboards.

    Marc Soester, Project MVP, General Manager, i-PMO

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449565&Culture=en-US

    MSDN Webcast: Project 2010 BI & Portfolio Reporting (Part 2 of 2): Advanced Techniques

    300

    Tuesday, May 25, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    Within Web Cast 2 users receive a deep dive experience on how to generate reports utilizing Project Servers data sources. This web cast will also allow users to generate a Visio Services Report and Power Pivot analytics by utilizing the Project Server 2010 Data Sources.

    Marc Soester, Project MVP, General Manager, i-PMO

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449567&Culture=en-US

    “Real-World Solution” Project Developer series

    Title

    Level

    Date

    Abstract

    Presenter

    URL

    MSDN Webcast: Real-World Solutions: Importing Workspace Data into Project Server Custom Fields

    300

    On Demand

    A client has requested a Project Center view that displays the number of active issues for each project. This is not possible out of the box.

    Stephen C. Sanderlin, Project MVP, Vice President,
    msProjectExperts

    http://www.microsoft.com/events/series/epm.aspx?tab=Webcasts&seriesid=51&webcastid=6865

    MSDN Webcast: Real-World Solutions: Leveraging Project Server Security within SQL Reporting Services Reports

    300

    On Demand

    A client has requested a SQL Reporting Services report that displays sensitive financial data. However, they only want executors of the report to see information on projects to which they have access.

    Stephen C. Sanderlin, Project MVP, Vice President,
    msProjectExperts

    http://www.microsoft.com/events/series/epm.aspx?tab=Webcasts&seriesid=51&webcastid=6866

    MSDN Webcast: Real-World Solutions: Filter Resource and Project data based on Custom Fields

    300

    On Demand

    You are creating a custom Windows application for a client that extracts and displays Project and Resource information. Because the PSI provides no way to filter these entities prior to retrieval from the PSI, you must retrieve all of the projects or resources in order to filter them by Custom Field value. Because this client has some international users on slow WAN links, you must minimize the payload sent to the user by the PSI call.

    Stephen C. Sanderlin, Project MVP, Vice President,
    msProjectExperts

    http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032424143&Culture=en-US

    MSDN Webcast: Real-World Solutions: Exporting Project Server Data to CSV

    300

    Monday, May 24, 2010
    1:00 P.M.–2:00 P.M. Pacific Time

    A client would like to export data from Project Server into a legacy Line of Business system. This system only accepts data in a CSV format.

    Stephen C. Sanderlin, Project MVP, Vice President,
    msProjectExperts

    http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032424148&Culture=en-US

    Project 2010 Resources

    Product information

    · http://www.microsoft.com/project/2010/

    · Project Team Blog http://blogs.msdn.com/project/

    Interactive content - Videos & Sessions & Webcast

    · http://www.microsoft.com/showcase/en/US/channels/microsoftproject/

    · http://www.microsoft.com/events/series/epm.aspx

    IT Professional related

    · TechCenter @ TechNet http://technet.microsoft.com/ProjectServer/

    · Admin Blog http://blogs.technet.com/projectadministration/

    Developer related

    · Developer center @ MSDN http://msdn.microsoft.com/Project/

    · Programmability blog http://blogs.msdn.com/project_programmability/

    Additional questions? Project 2010 Forums!

    · http://social.msdn.microsoft.com/Forums/en-US/category/projectserver2010,projectprofessional2010/

    SharePoint 2010 resources

    · http://sharepoint.microsoft.com

    Q&A

    Q: What if I miss the Webcast?

    A: As the nature of the live interaction – you can ask questions during the live Webcast. If you miss it you can watch the recording, but the Q&A option is not available.

    Q: Where do I get more information on Project 2010?

    A: Please check the Project 2010 Resources in this e-mail.

    Q: I’m SharePoint developer and I want to get started with Project Server. What are the best resources?

    A: Beside of the resources above – you can visit our “Project Server Programmability” series of webcasts on http://msdn.microsoft.com/en-us/office/dd334415.aspx.

    Q: Can I get Project 2010 Beta Virtual Image?

    A: Yes- Hosted or Download

    Q: I’m interested in IT Professional Webcasts as well. Where do I find them?

    A: Please check this announcement from Christophe http://blogs.msdn.com/chrisfie/archive/2010/03/03/announcing-microsoft-project-server-2010-it-professional-technet-webcast-series.aspx

     

    Thanks!

    Jan

  • Project Programmability and Business Intelligence

    How to: Modify the Ribbon in PWA

    • 0 Comments

    Note:  For the updated article, see How to: Modify the Ribbon in PWA in the Project 2010 SDK. The attached PWA_Ribbon_Customization.zip file includes the complete Visual Studio 2010 solution.

    The attached PWA_Ribbon_Customization.zip file includes an article that shows how to develop and deploy a SharePoint feature that adds a Close Project button to the Project Details page in Project Web App. You can add a second feature to the same solution that removes, modifies, and disables several buttons and other controls on the Timesheet page, when timesheets are in the single entry mode. The code in the article is based on code samples by Adrian Jenkins and Maria Kouvlaki, Microsoft Corporation.

  • Project Programmability and Business Intelligence

    Using the Ribbon Designer with Project Client

    • 1 Comments

    Hey,

    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:

      image
    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:

      image 
    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;
      6.  
      7.  
      8. using MSProject = Microsoft.Office.Interop.MSProject;
      9.  
      10. namespace ProjectAddIn2
      11. {
      12.  
      13.     public partial class Ribbon1
      14.     {
      15.         public static MSProject.Application Appliction;
      16.  
      17.         private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
      18.         {
      19.  
      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;
      8.  
      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.         }
      17.  
      18.         private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
      19.         {
      20.         }
      21.  
      22.         #region VSTO generated code
      23.  
      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.         }
      33.         
      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;
      6.  
      7.  
      8. using MSProject = Microsoft.Office.Interop.MSProject;
      9. using System.Windows.Forms;
      10.  
      11. namespace ProjectAddIn2
      12. {
      13.  
      14.     public partial class Ribbon1
      15.     {
      16.         public static MSProject.Application Appliction;
      17.  
      18.         private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
      19.         {
      20.  
      21.         }
      22.  
      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:

    image

    Hope this helps,

     

    Chris Boyd

  • Project Programmability and Business Intelligence

    Creating a Project for a Department, and Using the WCF FaultException

    • 0 Comments

    When you add a Project Departments custom field to a ProjectDataSet.ProjectCustomFields table, do not set the value of the MD_PROP_ID property. Project Server automatically adds a value when it creates the project. The CreateProject4Department code example shows the data in the ProjectDataSet before and after the call to QueueCreateProject.

    The WCF-based CreateProject4Department example in the attached  CreateProject4Department.zip file does the following:

    1. Builds a basic ProjectDataSet for one new project, including a row in the ProjectCustomFields table. The project is assigned to a specified department by using the Project Departments custom field that has a value in the Departments lookup table.

    2. After calling QueueCreateProject, waits for the project queue to finish, and then reads the ProjectDataSet back by using ReadProject.

    3. Saves the ProjectDataSet to XML files, once before creating the project and once after calling ReadProject. Shows that Project Server automatically creates the MD_PROP_ID field for the Project Departments custom field.

    4. Shows how to use the WCF FaultException, to display the error stack. Comments in the PopulateData method show how to create errors in the ProjectDataSet that trigger the System.ServiceModel.FaultException when you call QueueCreateProject.

    To get a list of errors if you get a FaultException when you call a PSI method in a WCF-based application, you can extract a PSClientError object from the FaultException object. You can then use GetAllErrors to store the error information in a PSErrorInfo array and enumerate the errors.

    In addition to the data in the PSClientError object, the FaultException object can include other types of errors, such as failure to connect to Project Server. The errOut parameter of the GetPSClientError method in the attached code sample shows additional information. When you make the changes that create errors in the ProjectCustomFields properties, and then run the application, the errOut parameter includes the errinfo element and other data (formatted here from the console output). Following is sample output from the exception handler:

    ==============================
    Error details:
    <errinfo xmlns="">
      <dataset name="ProjectDataSet">
        <table name="ProjectCustomFields">
          <row CUSTOM_FIELD_UID="976d3bd9-95ff-40a2-a938-960c410b0341">
            <error id="11704" name="CustomFieldInvalidTypeColumnFilledIn"
                   uid="aa8a2fab-9262-422f-b022-ca1cb12bc75f"></error>
            <error id="11713" name="CustomFieldRequiredValueNotProvided"
                   uid="dc2e2156-86e9-4aac-bede-d07dc44dfedc"></error>
          </row>
        </table>
      </dataset>
    </errinfo>

    System.ServiceModel.FaultException`1[SvcProject.ServerExecutionFault]:
    ProjectServerError(s) LastError=CustomFieldRequiredValueNotProvided Instructions:
    Pass this into PSClientError constructor to access all error information
    (Fault Detail is equal to SvcProject.ServerExecutionFault).

    ============================
    PSClientError output:
    CustomFieldInvalidTypeColumnFilledIn

    ============================
    PSClientError output:
    CustomFieldRequiredValueNotProvided

    For information about using the attached WCF-based application in Visual Studio 2010, see Prerequisites for WCF-Based Code Samples in the SDK.

     

  • Project Programmability and Business Intelligence

    The full list of Project Server / EPM developer-related WebCasts and Videos

    • 1 Comments

    We are posting full list of Project Server/EPM developer On Demand Recordings and upcoming WebCasts so you can mark your calendar. Some are in process of publishing, as soon as they are out, we will post an update J

     

    Office Project Server Programmability WebCast series

    Name

    Description

    Presenter

    Date/Time

    MSDN Webcast: Office Project Server Programmability (Part 1 of 4): Project Server 2007 Architecture for Developers (Level 400)

    During this webcast, we analyze all of the components that make up Project Server 2007. Once we examine the components, we discuss their importance in programming Microsoft Office Project Server 2007.

    Larry Duff, Microsoft

    On Demand Recording

    MSDN Webcast: Office Project Server Programmability (Part 2 of 4): Project Server Interface Programming Overview (Level 300)

    In this webcast, we provide an overview of what the Microsoft Project Server Interface (PSI) is and how the PSI is built. We also discuss the concepts of using Web services, custom datasets, and error handling.

    Larry Duff, Microsoft

    On Demand Recording

    Revised: MSDN Webcast: Office Project Server Programmability (Part 3 of 4): Review of the Project Server Interface Web Services – PART A (Level 400)

    In this webcast, we walk you through each of the Microsoft Project Server Interface (PSI) Web services, identify key usage of each of the Web services, and provide tips and tricks for working with PSI Web services. 

    Part A of this WebCast covers the following Administrative PSIs: Admin, Archive, CubeAdmin, Events, LoginForms, LoginWindows, Notifications, ObjectLinkProvider, QueueSystem, WssInterop.

    Larry Duff, Microsoft

    Thursday, March 26, 2009

    8:00 A.M.–9:30 A.M. Pacific Time

    Revised: MSDN Webcast: Office Project Server Programmability (Part 3 of 4): Review of the Project Server Interface Web Services – PART B (Level 400)

    In this webcast, we walk you through each of the Microsoft Project Server Interface (PSI) Web services, identify key usage of each of the Web services, and provide tips and tricks for working with PSI Web services.

    Part B of this WebCast covers the following Project PSIs: Calendar, CustomFields, LookupTable, Project, Resource, ResourcePlan, Security, Statusing, TimeSheet.

    Larry Duff, Microsoft

    Thursday, April 2, 2009

    8:00 A.M.–9:30 A.M. Pacific Time

    New Date: MSDN Webcast: Office Project Server Programmability (Part 4 of 4): Project Server 2007 Events and Workflow (Level 400)

    During this webcast, we describe how events extend Microsoft Office Project Server 2007, build handlers for different events explaining when or when not to use them, and demonstrate how to use workflow as a way to illustrate event usage.

    Larry Duff, Microsoft

    Thursday, April 16, 2009

    8:00 A.M.–9:30 A.M. Pacific Time

    MSDN Webcast: Office Project Client Programmability (Level 300)

    We show you how to develop against the Microsoft Office Project client object model. We look at using Microsoft .NET and Microsoft Visual Studio Tools for the Microsoft Office System (VSTO) for programming to supplement standard Microsoft Visual Basic for Applications (VBA), and we examine connecting to Microsoft Office Project Server via the Project client object model.

    Larry Duff, Microsoft

    Thursday, April 23, 2009

    8:00 A.M.–9:30 A.M. Pacific Time

    Other Office Project Server Programmability and solutions-related WebCasts

    Newly scheduled: MSDN WebCast: EPMAuditing Solution Starter Drilldown (Level 300)

    During this webcast, we will explore a new solution starter for Microsoft Office Project Server 2007, EPMAuditing. EPMAuditing provides a framework to capture event data from Project Server 2007 and use the data for reporting, debugging, auditing, or whatever use you find. We will analyze all of the components that make up EPMAuditing. Then we’ll dive into the code, because this solution is made to be extended and customized.

    Larry Duff, Microsoft

    Thursday, May 14, 2009

    8:00 A.M.–9:30 A.M. Pacific Time

    Working with the Project Server 2007 Reporting Database

    This video provides strategies for locating and using the data in the Project Server 2007 Reporting database. The session walks through three examples of building relatively complex queries from the ground up. Note: This video is recorded from a WebCast session, with a logon through Microsoft Office Live Meeting. The meeting audio is interrupted in the first two slides by the logon.

    Patrick Conlan, Microsoft

    On Demand Recording

    Project Server 2007 Timesheet Customizations

    This video covers all options around timesheet customizations in Project Server 2007. The following CodePlex projects are used during the webcast:

    · EPM Timesheet & Statusing Customization Samples

    · Project Server 2007 Timesheet Tied-Mode Service and Event

    · Project Server 2007 Timesheet Data Population Tool

    Christophe Fiessinger, Microsoft

    On Demand Recording

    Project Server 2007 Integration with Team Foundation Server for EPM Specialists

    Watch an overview of the Visual Studio Team Foundation Server - Project Server 2007 Connector to understand how this solution uses features within Project Server 2007 to enable this integration.

    Lenny Fenster, Microsoft

    On Demand Recording

    MSDN Webcast: Project Server and Project Portfolio Server Advanced Customization (Level 100)

    Present two of the latest solution starters produced for Project and Portfolio Server 2007:

    * The Solution Connector is an ASP.NET web service and .NET class library which provides a set of methods for programmatically creating, updating or deleting projects and their attributes in Microsoft Office Project Portfolio Server 2007

    * Project Server audit framework: this solutions give you the ability to audit specific Project Server events within a farm.

    Larry Duff, Microsoft

    On Demand Recording

  • Project Programmability and Business Intelligence

    Working with the Custom Fields Data Table

    • 1 Comments

    There have been a number of inquiries with regards to the custom field column definitions. So here they are:

    MD_AGGREGATION_TYPE_ENUM: Specifies the roll up type for a custom field.

    MD_ENT_TYPE_UID: Specifies the type of entity (project, task, or resource) for the custom field.

    MD_LOOKUP_TABLE_UID: Specifies the GUID of the lookup table to use for the custom field.

    MD_PROP_CHECKOUTBY: GUID of the user who has the custom field checked out for modification.

    MD_PROP_CHECKOUTDATE: Date the custom field was checked out for modification.

    MD_PROP_DEFAULT_VALUE: GUID of the default value in a lookup table for a custom field.

    MD_PROP_FORMULA: Formula that calculates the value of a custom field.

    MD_PROP_GRAPHICAL_INDICATOR: Definition of a graphical indicator for a custom field.

    MD_PROP_GRAPHICAL_INDICATOR_TOOLTIP: Specifies whether the graphical indicator has a tool tip.

    MD_PROP_ID: Integer ID of the enterprise custom field.

    MD_PROP_ID_SECONDARY: Assignment custom field ID for resource and task custom fields.

    MD_PROP_IS_LEAF_NODE_ONLY: Specifies whether the custom field value must be a leaf node in the lookup table.

    MD_PROP_IS_REQUIRED: Specifies whether the custom field is required when the entity (project, resource, or task) is created.

    MD_PROP_MAX_VALUES: Specifies whether the custom field has a single value or uses a multi-value lookup table.

    MD_PROP_NAME: Name of the custom field.

    MD_PROP_PROJ_SUMM_GRAPHICAL_INDICATOR: Definition of the project summary graphical indicator for the custom field.

    MD_PROP_ROLLDOWN_TO_ASSN: Specifies whether the resource or task custom field rolls down to assignments.

    MD_PROP_SUMM_GRAPHICAL_INDICATOR: Definition of the custom field graphical indicator for the summary task.

    MD_PROP_TYPE_ENUM: Type of the custom field.

    MD_PROP_UID: GUID of the custom field.

    MD_PROP_UID_SECONDARY: Assignment custom field GUID for resource and task custom fields.

    MD_PROP_USE_FOR_MATCHING: Specifies whether to use the resource custom field for matching generic resources.

    Chris Boyd

  • Project Programmability and Business Intelligence

    Synchronizing Membership Provider for Project Workspaces

    • 2 Comments

    Back on May 17th I posted code that showed how to update the workspace data with the RDB:

    http://blogs.msdn.com/project_programmability/archive/2007/05/17/syncing-project-workspaces-with-the-rdb.aspx 

    Here is a similar program to synchronize project workspace membership. The interesting twist is that I show how to be kinder to the Project Queue by adding a few jobs at a time and waiting for them to complete.

    Here is the code: 

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Data;
    using System.Web.Services.Protocols;
    using System.Diagnostics;
    using PSLibrary = Microsoft.Office.Project.Server.Library;

    namespace WorkspaceUpdate
    {
        class Program
        {
            static void Main(string[] args)
            {
                int count = 0;
                bool verbose = false;           // Verbose Output switch
                Guid job = Guid.Empty;          // The latest job submitted to the queue.
                int timeOut = 60;               // Default timeout before terminating the queue job

                string ls_projURL = "";
                const string PROJECT_SERVICE_PATH = "_vti_bin/psi/Project.asmx";
                const string WSSINTEROP_SERVICE_PATH = "_vti_bin/PSI/WSSInterop.asmx";
                const string WSQUEUESYSTEM_SERVICE_PATH = "_vti_bin/PSI/QueueSystem.asmx";

                if (args.Length == 0 || args.Length > 3)
                {
                    Message();
                }
                else if (args[0] == "/?")
                {
                    Message();
                }
                else
                {
                    ls_projURL = args[0];

                    if (args.Length > 2 && args[2].ToLower() == "verbose")
                    {
                        verbose = true;
                    }

                    try
                    {
                        timeOut = Convert.ToInt32(args[1]);
                    }
                    catch
                    {
                        Event("Warning: Invalid timeout, defaulting to 60 seconds.", EventLogEntryType.Warning, verbose);
                    }
                   
                    WSProject.Project ws_Project = new WSProject.Project();
                    WSSInterop.WssInterop ws_WssInterop = new WSSInterop.WssInterop();
                    WSQueueSystem.QueueSystem qsWS = new WSQueueSystem.QueueSystem();
                  
                    if (!ls_projURL.EndsWith("/"))
                    {
                        ls_projURL += "/";
                    }

                    try
                    {


                        ws_Project.Url = ls_projURL + PROJECT_SERVICE_PATH;
                        ws_Project.Credentials = CredentialCache.DefaultCredentials;

                        ws_WssInterop.Url = ls_projURL + WSSINTEROP_SERVICE_PATH;
                        ws_WssInterop.Credentials = CredentialCache.DefaultCredentials;

                        qsWS.Url = ls_projURL + WSQUEUESYSTEM_SERVICE_PATH;
                        qsWS.Credentials = CredentialCache.DefaultCredentials;
                       

                        Guid lo_projGUID;
                        string ls_projName;
                       
                        WSProject.ProjectDataSet lo_projs = null;
                        WSProject.ProjectDataSet lo_projDS;

                        try
                        {
                            lo_projs = ws_Project.ReadProjectList();

                            DataRowCollection lo_projects = lo_projs.Tables[lo_projs.Project.TableName].Rows;

                            for (int i = 0; i < lo_projects.Count; i++)
                            {
                                lo_projGUID = new Guid(lo_projects[i][0].ToString());
                                ls_projName = lo_projects[i][1].ToString();

                                try
                                {
                                    lo_projDS = ws_Project.ReadProjectEntities(lo_projGUID, 1, WSProject.DataStoreEnum.PublishedStore);

                                    // Check if the Project has a Workspace
                                    if (lo_projDS.Tables[lo_projDS.Project.TableName].Rows[0][lo_projDS.Project.WSTS_SERVER_UIDColumn.ColumnName] != null && lo_projDS.Tables[lo_projDS.Project.TableName].Rows[0][lo_projDS.Project.WSTS_SERVER_UIDColumn.ColumnName].ToString() != "")
                                    {
                                        Message("Synchronizing Workspace for Project" + ls_projName, verbose);
                                       
                                        //Wait to let the server process the work
                                        if (count % 4 == 3)
                                        {
                                            if (WaitForQueue(timeOut, job, qsWS) == false)
                                            {
                                                Event("Warning: Queue Job not Processed for Project:" + ls_projName + " Check Project Server Queue.", EventLogEntryType.Warning, verbose);
                                            }
                                        }

                                        job = Guid.NewGuid();

                                        ws_WssInterop.QueueSynchronizeMembershipForWssSite(lo_projGUID, job);


                                        count++;
                                    }
                                    else
                                    {
                                        Message("Notice: Project" + ls_projName + " does not have a workspace.", verbose);
                                    }
                                }
                                catch (SoapException lo_ex)
                                {
                                    PSLibrary.PSClientError psiError = new PSLibrary.PSClientError(lo_ex);
                                    PSLibrary.PSErrorInfo[] psiErrors = psiError.GetAllErrors();

                                    if (psiErrors.Length == 1)
                                    {
                                        if (psiErrors[0].ToString() == "ProjectNotFound")
                                        {
                                            Message("Notice: Project" + ls_projName + " is not published.", verbose);
                                        }
                                    }

                                }
                            }

                            Event("Successfully Synchronized Membership for Workspaces", EventLogEntryType.Information, verbose);
                        }

                        catch (WebException lo_ex)
                        {
                            Event("Error:" + lo_ex.Message, EventLogEntryType.Error, verbose);
                        }
                        catch (Exception lo_ex)
                        {
                            Event("Unknown Error:" + lo_ex.Message, EventLogEntryType.Error, verbose);
                        }
                    }
                    catch (UriFormatException lo_ex)
                    {
                        Event("Unknown Error:" + lo_ex.Message, EventLogEntryType.Error, verbose); ;
                    }
                }
            }

            private static bool WaitForQueue(int timeOut, Guid jobId, WSQueueSystem.QueueSystem qsWS)
            {
               

                int sleep = 3;
                int timeSlept = 0;        // Total time slept (seconds)
                bool jobSuccess = false;
                string xmlError;

                WSQueueSystem.JobState jobState; // Status of the queue job

                timeOut = timeOut * 1000;

                while (true)
                {
                    jobState = qsWS.GetJobCompletionState(jobId, out xmlError);

                    if (jobState == WSQueueSystem.JobState.Success)
                    {
                        jobSuccess = true;
                        break;
                    }
                    else if (jobState == WSQueueSystem.JobState.Unknown
                        || jobState == WSQueueSystem.JobState.Failed
                        || jobState == WSQueueSystem.JobState.FailedNotBlocking
                        || jobState == WSQueueSystem.JobState.CorrelationBlocked
                        || jobState == WSQueueSystem.JobState.Canceled)
                    {
                        jobSuccess = false;
                        break;
                    }
                    else if (timeSlept > timeOut)
                    {
                        jobSuccess = true;
                        //qsWS.CancelJobSimple(jobId);
                        break;
                    }

                    System.Threading.Thread.Sleep(sleep * 1000);

                    timeSlept = +sleep * 1000;
                }

                return jobSuccess;
            }

            static private void Message()
            {
                System.Console.WriteLine("");
                System.Console.WriteLine("WorkspaceUpdate url timeout [verbose]");
                System.Console.WriteLine("  url - The URL to the project server.");
                System.Console.WriteLine("  timeout - Seconds to wait for the queue job to process the User Sync");
                System.Console.WriteLine("  verbose - An optional parameter that outputs progress.");
            }

            static private string Message(string as_msg, bool verbose)
            {
                as_msg = DateTime.Now.ToString() + ":" + as_msg;

                if (verbose)
                    System.Console.WriteLine(as_msg);

                return as_msg;
            }


            static private void Event(string as_msg, EventLogEntryType eventType, bool verbose)
            {
                EventLog lo_eventLog = new EventLog();
                lo_eventLog.Source = "WorkspaceUpdate Sync Job";

                as_msg = Message(as_msg, verbose);
               
                lo_eventLog.WriteEntry(as_msg, eventType, 3652);

            }
        }
    }

  • Project Programmability and Business Intelligence

    Connection Strings…

    • 2 Comments

    Hey,

    Here is a great post:

    http://projectserver.cz/cms/index.php?itemid=35

    It shows how to get the connection string to the Project Server 2007 Reporting Database (and the other three databases which are not supported programming interfaces). This is extremely helpful when creating PSI extensions. Just one caveat, this may break after a hot fix or service pack install.

    Chris Boyd

  • Project Programmability and Business Intelligence

    Sweeten your Project 2010 environment with Custom Fields

    • 1 Comments

    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 (http://msdn.microsoft.com/en-us/library/ee767683(office.14).aspx)

    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 (http://msdn.microsoft.com/en-us/library/ee767700(office.14).aspx)

    Using graphical indicators in Project

  • Project Programmability and Business Intelligence

    Tied Mode between Timesheet & My Tasks

    • 1 Comments

    We have published today an EPM 2007 solution starter that introduces Tied Mode between Timesheet & My Tasks on CodePlex: http://www.codeplex.com/EPMTSST

    MWSnap024 2007-11-15, 16_16_05.jpg

    Project Server 2007 provides for full separation between the project-focused My Tasks “Statusing” functionality and the time-period-focused Timesheet functionality, together with the ability to manually import data from one set of functionality to the other to keep them synchronized.

    This solution attempts to address this frustration by treating the timesheet system as the master system and attempting to synchronize the data into the My Tasks functionality (including task approvals) whenever a timesheet is saved (similar to Project Server 2003 integrated (“Tied”) timesheet and statusing functionality).

    This solution starter includes a 18 pages document as well as source code and a compiled DLL ready to deploy and test.

    A special thank you to Julie Ripoteau and Olivier Laymand from MCS France for testing the code extensively, as well as Patrick Conlan and Chris Boyd from the Product Group for reviewing the code and documentation. 

  • Project Programmability and Business Intelligence

    SharePoint 2010: 3 New Visual Studio 2010 Extensibility Projects for SharePoint 2010

    • 0 Comments


    Pretty cool – check this out http://www.sharepointproconnections.com/blogs/MicrosoftInsider/tabid/1948/entryid/12761/3-New-Visual-Studio-2010-Extensibility-Projects-for-SharePoint-2010.aspx

     

    These projects will help you automate some common development tasks when creating SharePoint 2010 solutions using Visual Studio 2010.

    These three SharePoint 2010 Extensibility Projects can be downloaded from the MSDN Code Gallery here, http://code.msdn.microsoft.com/vsixforsp.

    All of the projects contain a Hands On Lab and a walkthrough video. Follow the links below to blog posts providing further details for each project template.

     

    clip_image001

    Silverlight Web Part Project Template

    The Silverlight Web Part Project template will create a fully functioning Silverlight Web Part project ready for deployment. The project template also uses a Silverlight control generator that replaces some of the functionality that was deprecated from the Silverlight 3.0 SDK. This makes it easy for developers to quickly create a custom Silverlight application that goes beyond the functionality of the built in Silverlight Web Parts. Developers have total control over the Web Part such as how the Silverlight plugin code is generated and other Web Part behavior.
    For more details and a quick walkthrough visit: Silverlight and SharePoint project template

    clip_image002

    Server Ribbon Project Item Template

    One of the new features in SharePoint 2010 is the Server Ribbon. The Server Ribbon brings all of the goodness that the Client Ribbon provides to SharePoint. Creating a ribbon requires that the developer code the ribbon xml by hand. Doing this by hand has a steep learning curve to get started. The Server Ribbon Project Item template makes it easy to create a Server Ribbon by following the wizard. In addition to the wizard there are code snippets for create all of the ribbon controls. This is a great way to learn the correct ribbon xml to make powerful user interfaces in SharePoint.
    For more details and a quick walkthrough visit: SharePoint Ribbon project template

    clip_image003

    OBA Deployment Project Item Template

    SharePoint enables you to create custom content types that can be attached to document libraries. Creating rich OBA document templates using Visual Studio and deploying them to SharePoint is a common pattern that developers use to enable Line of Business applications. If you’ve deployed a document-level add-in to SharePoint you are familiar with the number of steps involved in this process. The OBA Custom Content Types Project Item template removes all of these steps and reduces the process down to a simple wizard and an F5 deployment. The extensibility project does all of the work making the developers more productive.

    For more details and a quick walkthrough visit: OBA Deployment project template

  • Project Programmability and Business Intelligence

    Two new Project Server 2007 tools have been released on CodePlex today

    • 1 Comments

    Hello,

    Two new Project Server 2007 tools have been released on CodePlex today:

    EPM 2007 Log File Report tool EPM 2007 Queue Watch tool
    http://www.codeplex.com/EPMLogFileReport http://www.codeplex.com/EPMQueueWatch
    The Project Server 2007 Log File Report Tool enables the import and the reporting of log file generated by your EPM & SharePoint farm. The Log File Report Tool will import log files (in an SQL database) from all servers in your farm with the ability to filter them by date. Once the import is complete you can easily search for specific log file messages using the following filtering criteria: Area, Category, Level, Process, Server as well as date and created reports.

    The Project Server 2007 Queue Watch Tool will help you monitor all queue activities for a specific Project Web Access (PWA) instance. This tool leverages the standard Project Server Interface publically documented web services to query and retrieve jobs in the Project Server queues, further you can configure the tool to filter the information retrieved by Message Types and Job types.

    The Queue Watch Tool is available as a WinForms application. It was written by EPM World Wide Center of Excellence (WW COE) to efficiently monitor and troubleshoot queue activities for Project Server 2007 farms.

    MWSnap052 2007-12-12, 10_44_28 MWSnap071 2007-12-14, 12_45_33
    This release contains documentation, setup, and source code. This release contains documentation, setup, and source code.


    About CodePlex

    CodePlex is Microsoft's open source project hosting web site. You can use CodePlex to create new projects to share with the world, join others who have already started their own projects, or use the applications on this site and provide feedback. A word about Microsoft’s role: Microsoft does not control, review, revise, endorse or distribute the third party projects on this site. Microsoft is hosting the CodePlex site solely as a web storage site as a service to the developer community.

    Q&A

    Q: Is the tool supported?

    A: There is no support in terms of CSS/PSS. We expect the support being a CodePlex community effort. Please note that the customization code uses standard supported web service calls available out of the box in EPM2007.

    Q: Is the tool free?

    A: Yes.

    Q: Can I distribute the tool and the source code to customers and partners?

    A: Customers and Partners can use both. Please point them to CodePlex as they have to agree on the license terms

    Q: Can a partner distribute the tool and code as is?

    A: No, but he can point his customer to the website to download it, so he makes sure that the customer agrees with the license terms.

    Q: Can a customer install the customization and use it?

    A: Yes the customer can, but he/she is responsible for testing it and running it.

    Q: Can I suggest changes to it?

    A: Yes, join the CodePlex community or send us an email: epmssdev@microsoft.com

    Q: Will this tool be distributed in other ways (i.e. DVDs)?

    A: No.

    Q: What skills do I need to modify or change the tool?

    A: C#, Project Server Interface, and a good understanding of the EPM 2007 data schema.

    Q: I’m trying to modify the code and do have questions. Who do I ask?

    A: Go to the Discussions forums on CodePlex.

    Q: What are all the EPM projects released on CodePlex?

    A. Check this: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=epm

    Regards,

    Christophe Fiessinger

  • Project Programmability and Business Intelligence

    Using the updated ChangeXML utility for Statusing

    • 2 Comments

    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 ChangeXMLUtility.zip 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.

            ChangeXML_LogOn_AppConfig

    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.

            ChangeXML_Main_Empty

    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.

            ChangeXML_Generate_4User_Assign_HealthCF

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

            ChangeXML_Main_4User_Assign_HealthCF

    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="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Proj ID="a3e78597-2302-45fc-bb15-7f23d74efdf8">
        <Assn ID="b001d2d9-69eb-49a0-aa9f-6bbe53f9484c"
    ResID="aa3a6f6f-bb70-4d2e-92da-b06580ae6376"> <LookupTableCustomFieldChange IsMultiValued="false"
    CustomFieldType="Text"
    CustomFieldGuid="00004f6d-90a2-439a-8cc2-1c1ef6d2da4f"
    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.

            WinProj_OpenProject_AssnHealthCF_Changed

    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:

    SQLSrv_ReportingDB_EpmAssignment

    The ChangeXML utility is useful for creating and testing values of the changeXml parameter for the UpdateStatus method,
    where
    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

    Using ReadCustomFieldsByEntity(...)

    • 0 Comments

    Phil Smail, a fellow PM on the Project Team, just passed along a helpful hint: 

     

    I am writing a cool little app and I wanted to pull back all the Resource Custom fields. Thankfully there’s a PSI to do this call ReadCustomFieldsByEntity, where the entity can be Project, Resource or Task. This is pretty neat except that the SDK docs don’t mention what the potential GUIDs options can be. After a bit of digging around I found out what the correct item was within the Project.Server.Library assembly.

     

    using PSLibrary = Microsoft.Office.Project.Server.Library;

    ...

    CustomFieldsDataSet ds = CustomFields.ReadCustomFieldsByEntity(new Guid(PSLibrary.EntityCollection.Entities.ResourceEntity.UniqueId));

    ...

  • Project Programmability and Business Intelligence

    Upcoming “Project Server Report Pack II - The top reports” WebCast

    • 1 Comments

    Please mark your calendar if you are interested! Are you asking what is the difference between the SDK Report Pack and this one? Think about the SDK version as the starter on “HOW” to write queries against Reporting database. This should go one step further – once you know HOW – you are interested in “WHAT” to bubble into your reports and “WHY” :)  This report pack has been built by top Microsoft Consultants who deploy/manage and enhance the “our” EPM solution for individual customers and contains very valuable know-how that they have collected over the years...

    Start Date: Wednesday, August 19, 2009 8:00 AM Pacific Time (US & Canada)

    Overview

    The “Microsoft Office Enterprise Project Management (EPM) 2007 Report Pack II -  The top reports” provides rich reports for common information needs. The EPM 2007 Report Pack II is a collection of 12 Microsoft SQL Server Reporting Services (SSRS) reports designed for various user groups of the EPM solution. In this webcast, we provide an overview and demonstration of the EPM 2007 Report Pack. We discuss the different usage scenarios the reports are tailored to fit and review the components used to move, store, and render the reports. With this information, you should have a better understanding of how to use the EPM 2007 Report Pack II to provide business value for your organization.

    Presenters: Bulent Guzel, Senior Consultant, Microsoft Corporation and T.R. Sloan, Solutions Architect, Microsoft Corporation

    Registration: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032423031

    Enjoy!

  • Project Programmability and Business Intelligence

    Update of the Project 2010 SDK (March 2011)

    • 0 Comments

    The Project 2010 SDK download and the MSDN online release are both updated. They have the same URLs as previous releases:

    New conceptual and how-to topics:

    Topic updates since January 14, which was the previous MSDN online update:
    18 conceptual and how-to topics have relatively minor updates.
    50 managed code types (plus subtopics for properties, methods, and events) are updated, including new code samples for:

    New / updated items in the Project 2010 SDK download, which was last updated Sept. 2010:

    • Project2010SDK.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 local VBA Help file that was shipped with the Project RTM release.
    • IntelliSense files are updated for the PSI proxy assembly and the Project Server assemblies, to show descriptions of classes and members while programming in Visual Studio.
    • Event handler solutions: TestCreatingProject, TestCreatedCustomField
    • OLP sample is a solution that uses the following PSI methods: ReadProjectList, ReadProject, ReadWssData, ReadTaskWebObject, CreateWebObjectLinks, ReadTaskLinkedWebObjects, DeleteWebObjectLink
    • ProjTool complete solution, updated for Project 2010.
    • PWA Ribbon Customization solution.
    • New PSI code samples include complete WCF-based solutions for code samples that are published in the managed code reference, for the following methods: CreateResource, ReadResource, ReadResourcePlan, QueueCreateResourcePlan, QueuePublishResourcePlan, ReadDriverList, ReadPrioritization, and CreatePrioritization.
    • Microsoft.Office.Project.Server.Library.dll, file version 14.0.4999.1061, and redistribution license.

    --Jim

  • Project Programmability and Business Intelligence

    Office 2010 Interactive Developer Map

    • 0 Comments

    The Microsoft Office 2007 interactive developer map has been available for several years, which is very handy for finding documentation on all Office 2007 products. Now Office 2010 has its own: See Microsoft Office 2010 Developer Map.

    Want to find documentation for OneNote Mobile on Windows Phone 7? Just click Mobile Applications in the Developer Map, click OneNote Mobile, and it takes you to the correct documentation  page. Yes, Project and Project Server are there, too.

    The interactive map includes relationships of all of the Microsoft Office client applications, server applications, mobile applications, services and Office 365 applications, and related technologies, development tools, and platform components. Just what we have been waiting for.

    The Learn Office Development page on MSDN is recently updated. It includes links to both of the Office Developer Maps, and also a link to the Office 2010 Developer Map poster.

  • Project Programmability and Business Intelligence

    Agile Custom Project Guide - Second File Attachment

    • 7 Comments

    Due to the size of the Zip file, I need to split the file into two. This post has the second file. The main post will have the first file attached.

  • Project Programmability and Business Intelligence

    My VBA macro from Project 2007 doesn't work in Project 2010!

    • 0 Comments

    If you have a VBA macro that worked in Project 2007 and doesn't work in Project 2010, here are some things to try.

    There are quite a few members from Project 2007 that are deprecated and hidden in Project 2010. Some of the hidden members still work as they did in Project 2007, some simply do nothing, and using some directly results in an error. If the macro relies on a hidden member that does not work the same way in Project 2010, you can get a variety of errors. For example, the Application.AnswerWizard property and the Office.AswerWizard object are both hidden -- and the AnswerWizard no longer exists. The following macro results in a run-time error 1004 in Project 2010:

    Sub GetAnswerWizard()
        Dim aw As Office.AnswerWizard
        Set aw = Application.AnswerWizard
    End Sub

     To see the hidden members, go the VBE, press F2 for the Object Browser, right-click in the Members pane, and then click Show Hidden Members. The hidden members are in a light gray font. VBA Help does not include documentation of hidden members.

    Check the macro for members that are hidden in Project 2010, and get documentation for any of those from Project 2007 VBA Help on MSDN. Then set a breakpoint to see whether the member does what is expected.

    If the macro does not use any hidden members, trace through the macro by using breakpoints, to see what is going on. Some members in Project 2010 have additional parameters. For example, if you specify a parameter by position, such as Method(,,,"Value"), the parameter could be in the wrong order. When you use only a few parameters in a method that has many, is often best to use named parameters, for example, Method MyParam:="Value".

    Note: The September update of the Project 2010 SDK includes an update of the Project 2010 VBA Help file for local use.

  • Project Programmability and Business Intelligence

    Building an app for Project Server 2013

    • 1 Comments

    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 http://epmsource.com/2013-apps/. 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.

Page 4 of 11 (255 items) «23456»