次の方法で共有


Project 2010 の開発を開始する

概要:  Microsoft Project Server 2010 と Microsoft Project 2010 クライアント アプリケーションの開発とカスタマイズに関する主要機能について説明します。Project Server 2010 には、Windows Communication Foundation (WCF) サービスと ASMX Web サービスのデュアル インターフェイスに加えて、Project Server の拡張機能をカスタマイズおよび開発するための新しい主要機能が備わっています。

適用対象: Office 2010 | Project 2010 | Project Server 2010 | SharePoint Server 2010 | VBA | Visual Studio

この記事の内容
Project Server 2010 の概要
Project のドキュメント - 必要な情報の場所
Project 2010 での VBA の使用
Project Server のアーキテクチャ
Microsoft SharePoint Server 2010 との統合
Project Server Interface
Project Server 2010 のイベント
Project 2010 での EPM レポート
Project Server 2010 でのエラーの確認
まとめ
その他の技術情報

提供元:  Jim Corbin、Microsoft Corporation

目次

  • Project Server 2010 の概要

  • Project のドキュメント - 必要な情報の場所

  • Project 2010 での VBA の使用

  • Project Server のアーキテクチャ

    • Project Server 2010 データへのアクセス

    • Project 2010 でのキャッシュ、キュー、イベント、およびサーバー側スケジュール

  • Microsoft SharePoint Server 2010 との統合

    • Project Server のセキュリティ

    • Project Server Web パーツ

    • プロジェクト サイト

    • Project Server のワークフロー

    • Project Web App の SimpleUI URL オプション

  • Project Server Interface

    • デュアル インターフェイス: ASMX と WCF

    • PSI での DataSet オブジェクトの使用

    • 偽装および PSI の拡張機能

    • PSI での Windows PowerShell の使用

  • Project Server 2010 のイベント

    • イベント ハンドラーでのデータセットの使用
  • Project 2010 での EPM レポート

    • レポート データベースと Report Data Service

    • キューブ作成サービス

  • Project Server 2010 でのエラーの確認

  • まとめ

  • その他の技術情報

この記事では、「Project Server 2007: 作業の開始 (開発者用の新しいプラットフォーム)」記事を Project 2010 に合わせて内容を更新しています。

Project Server 2010 の概要

Microsoft Project Server 2010 は、Project Server の 4 番目のメジャー リリースで、Microsoft Office Project Server 2007 で導入された新しい開発プラットフォームを拡張しています。Project Server 2010 は、SharePoint とさらに緊密に統合されており、Microsoft SharePoint Server 2010 (エンタープライズ クライアント アクセス ライセンス付き) が必要です。プロジェクト ポートフォリオ サービス、ワークフロー、認証、Web パーツ、Project Web App リボン、新しい ECMAScript (JavaScript) ベースのグリッド コントロール、チームでグループ作業するめのプロジェクト サイトをはじめとするさまざまな Project Server の機能が SharePoint Server 2010 プラットフォームの上に構築されています。

この記事では、Project クライアントの開発について簡単に説明し、Project Server の開発および Project Server Interface (PSI) の使用法についてより詳しく説明します。Project Server 2010 は Microsoft SharePoint Server 2010 でサービスとしてインストールされるので、需要管理のワークフローのような Project Server の機能、Project Web App リボン、およびプロジェクト サイトは SharePoint の機能に基づいて構築されています。

PSI は、ワークフローのサービス、ポートフォリオ分析、およびビジネス ドライバーを追加し、新しい機能をサポートするためにその他のサービスを拡張します。このサポートされる新しい機能には、部署、リソースの委任、タイムシート設定とセキュリティ カテゴリ管理の向上、複数の OLAP キューブ、プロジェクトと SharePoint タスク リストの同期などがあります。PSI デュアル インターフェイスでは、Windows Communication Foundation (WCF) サービスによって ASMX Web サービスが複製されます。WCF ベースのサービスは、分散アプリケーション開発の戦略的方向性となります。

Project Server 2010 は、Microsoft .NET Framework 3.5 に基づいて構築されています。第一級のエンタープライズ プロジェクト マネジメント (EPM) システムとして、Project Server 2010 ではプログラミングに関して以下の目標を達成しています。

  • 優れた拡張性   Project Server 2010 では、EPM 用の機能の拡張および Microsoft Office 2010 製品、パートナーのソリューション、基幹業務 (LOB) アプリケーションとの統合に関する主要な領域に対応しています。

  • 開発プラットフォーム   一連の PSI サービス、Project Server Events Service、Project Server Queue Service、Project Server ワークフロー システム、サーバー側スケジュール エンジン、レポート データベース、およびビジネス インテリジェンス (BI) センター、カスタム リスト、Web パーツなどの SharePoint の機能により、すべて揃った開発プラットフォームが構築されています。

  • 垣根が低く、利用しやすい   Microsoft Visual Studio、標準の SharePoint Web パーツ、または Microsoft SQL Server Reporting Services を使い慣れている開発者は、Project Server 開発プラットフォームの関連機能を活用できます。

  • 開発者の生産性の向上   PSI サービスでは、Microsoft ADO.NET 型指定された DataSet オブジェクトを使用します。Visual Studio の Microsoft IntelliSense は、コード ステートメントで使用できるメソッド、パラメーター、およびフィールドをすぐに表示します。Visual Studio 2010 内で直接、Project Server ワークフローと Web パーツを作成、インストール、テストしたり、Project Web App とプロジェクト サイトの多数の機能を変更したりできます。Project Server データベースに対して直接プログラミングするのではなく、PSI を使用して時間配分されたタスク情報などのデータにアクセスできます。

  • ファイアウォールとの親和性   Project Professional 2010 および Project Web App を含むすべての Project 2010 クライアント アプリケーションは、HTTP プロトコル、SOAP プロトコルを使用するか、WCF を通じて他のプロトコルを使用して、PSI サービスを経由して Project Server と通信します。また、インターネット経由のアクセスに境界ネットワークの個別の Project Web App サーバーを使用すると、Project Server を安全に運用できます。

Project Server 2010 は、SharePoint Server 2010 と共に数多くの利点と強化された機能を提供します。この記事では、プラットフォームのプログラミング機能について説明し、Project 2010 ソフトウェア開発キット (SDK) に収録されている詳細な概念に関する記事と "操作方法" に関する記事を紹介します。

Project のドキュメント - 必要な情報の場所

Project のドキュメントは 4 つの主なカテゴリに分類されます。カテゴリによって対象とする読者が異なります。この記事を読まれる方のほとんどは開発者ですが、エンド ユーザー向けや管理者向けの情報、サポート情報またはサポート技術情報 (KB)、およびその他の Project ダウンロードが必要になる場合があります。

Project のドキュメントの詳細、およびその他のリソースが見つかる場所については、「Finding Project Server 2010 Documentation (英語)」を参照してください。Project Server 2010 の新機能の使い方に関するビデオについては、「Train & Learn (英語)」を参照してください。SharePoint、Silverlight、SQL Server Business Intelligence などの主な Microsoft の製品とテクノロジに関するコースとハンズオン ラボについては、「MSDN トレーニング コース (英語)」および「SharePoint and Silverlight Training Course (英語)」を参照してください。

Project 2010 の開発者向けドキュメント

Project 2010 SDK の主な構成要素は次のとおりです。

  • Project デベロッパー ポータル」には、Project 2010 SDK の主な構成要素へのリンクおよび以前のバージョンの開発者向け情報に関するページへのリンクがあります。Project デベロッパー ポータルの「Videos and Webcasts | Project Development (英語)」ページには、Project 2010 のマルチメディア リソースがあります。「Project Developer Community (英語)」ページには、Project のブログ、パブリック フォーラム、および Project パートナーと Microsoft Most Valued Professional (MVP) に関するその他の情報へのリンクがあります。

  • オンラインの「Project 2010 SDK のドキュメント」には、最新の概念に関するトピック、操作方法に関するトピック、チュートリアル トピック、および PSI サービス、関連するデータセット、Project Server プログラミング ライブラリに関するリファレンストピックが含まれています。オンライン SDK の各ページの最後には、「コミュニティ コンテンツ」セクションがあり、そこではコメントを投稿したり、短いコード サンプルを追加したり、ページの間違いを訂正したりできます。コミュニティ コンテンツは、MSDN の Wiki です。「Project Customization and Programming (英語)」フォーラムでは、開発者がディスカッションしたり、他の人の質問に答えたりすることができます。

  • Project 2010 SDK ダウンロード (英語)」には、完全な SDK、検索機能付き HTML ヘルプ ファイル (Project2010SDK.chm)、サンプル アプリケーションのソース コード、レポート データベースのスキーマ リファレンス、OLAP キューブ リファレンス、XML スキーマ、更新された IntelliSense ファイル、および PSI 用の WCF ベースまたは ASMX ベースのプロキシ アセンブリを作成するためのスクリプトが収録されています。

  • Project VBA リファレンスとヘルプ トピックには、3 つの場所からアクセスできます。これらのトピックには、「Project 2010 Developer Reference (英語)」にあるオンライン版、Visual Basic Editor で作業しているときの Visual Basic ヘルプのオンライン版またはオフライン版からアクセスできます。Project のヘルプ ウィンドウの右下にある [接続状態] メニューをクリックし、[Office.com のコンテンツを表示] または [このコンピューター上のコンテンツのみを表示] をクリックすると、VBA の最新のヘルプ トピックにオンラインまたはオフラインでアクセスできます。たとえば、VBA オブジェクト モデルのマップは、オフライン ヘルプが最適です。MSDN の表示にはオブジェクトのリンクが含まれておらず、VBA ヘルプのオンライン表示は最適ではありません。

  • Project 2007」のドキュメントに含まれる多くのトピックは、Project 2010 にも適用されます。たとえば、「Project 2007 Technical Articles」セクションと「Project 2007 Book Excerpts」セクションをご覧ください。「[方法] PSI メソッドでフィルター パラメーターを使用する」、「[ウォークスルー] 階層型参照テーブルを作成する」、「[方法] 電子メールを Project Server の通知用にカスタマイズする」などの SDK トピックでは、Office Project Server 2007 と Project Server 2010 で共通の一般的な手順を使用しています。

オンラインの Project 2010 SDK は、現在、英語版と日本版が用意されています。日本語版は英語版より数か月遅れてリリースされます。日本語版については、https://msdn.microsoft.com/ja-jp/library/ms512767.aspx を参照してください。

Project 2010 の管理者向けドキュメント

TechNet の「Microsoft Project Server」では、Project のインストール、移行、および管理に関する情報を検索できます。TechNet のコンテンツには、Project Web App のエンド ユーザー向けドキュメントが含まれています。Project Server 2010 テクニカル ライブラリをダウンロードすることもできます。「Microsoft Project Server 2010 テクニカル ライブラリ (コンパイルされたヘルプ形式)」を参照してください。

TechNet での Project 2010 に関する主要なセクションは次のとおりです。

  • Microsoft Project Server 2010」は、TechNet の Project Server に関する Web サイトです。「Project Server 2010」は、TechNet ライブラリの最上位 Project Server セクションです。このセクションには、Project Server の評価、計画、展開、運用、セキュリティ情報、およびトラブルシューティングに関するセクションが含まれています。

  • Project Server 2010 のテクニカル リファレンス」には、Project Server を管理するための Windows PowerShell コマンドおよびセキュリティ権限のリファレンス情報に関するセクションが含まれています。

  • Project Server 2010 の新しい公開コンテンツ」は、定期的に更新され、最新の Project Server の管理者向け情報の把握に役立ちます。

  • Project Server 2010 のダウンロード可能なコンテンツ」では、テクニカル ライブラリのコンテンツの一部が Microsoft Word 形式で用意されています。

    注意

    Project のテクニカル ライブラリは、現在英語でのみご利用いただけます。その他の国の TechNet センターの一覧については、「各国の TechNet」を参照してください。

Project Server の管理者向けドキュメントの最新情報については、「Enterprise Project Management Content Publishing News (英語)」ブログを参照してください。

Project 2010 のエンド ユーザー向けドキュメント

Project Standard および Project Professional では、状況依存のヘルプを利用できます。VBA ヘルプと同様、最新のコンテンツを入手するには、Project のヘルプ ウィンドウの右下にある [接続状態] メニューをクリックし、[Office.com のコンテンツを表示] をクリックします。Project Web App を使用しているときに状況依存のヘルプを表示するには、ページの右上にある [ヘルプ] アイコンをクリックします。

最新のすべての Project ヘルプ トピックにオンラインでアクセスするには、以下を参照してください。

  • Project のヘルプと How-to」は、Project Standard および Project Professional 向けのページで、Project の使用方法に関する最も重要な問題とビデオのリソースが含まれています。

  • Project Server のヘルプと How-to」には、オンライン Project Web App ヘルプとその他のさまざまなリソースが含まれています。Project Server 2010 の新しいトピックへのリンクには、ビジネス インテリジェンス (BI) センター、プロジェクト提案の作成、セキュリティ権限、およびプロジェクト ライフ サイクルのフェーズとステージの定義に関する情報とビデオが含まれています。

  • Project のリファレンス」には、フィールド リファレンス、Project の仕様、およびさまざまなその他のリファレンス トピックが含まれています。

    注意

    プロジェクト マネージャーは、ほとんどの場合、数式を使用してユーザー設定フィールドの値を計算するか、数式とマークを一緒に使用します。数式を記述するときに使用できる関数の説明および構文については、Project Standard または Project Professional のヘルプの「Reference」セクションを参照するか、Office.com の「ユーザー設定フィールド用の Project の関数」を参照してください。Project 2010 では、Microsoft Access 2010 で使用しているのと同じ Jet Expression サービスを数式に使用します。数式と式の一般的な例および詳細については、Access のオンライン ヘルプの「Guide to Expression Syntax (英語)」および MSDN ライブラリの「Functions (Category List)」を参照してください。

  • Project のエンド ユーザー向けヘルプで使用できる言語   オンラインの Project ヘルプ ページは、お使いのコンピューターのコントロール パネルの [地域と言語] ダイアログ ボックスで設定した既定の言語で表示されます。その他の国および言語で表示するには、エンド ユーザー向けヘルプ トピックの URL でカルチャ名コードを置き換えます。たとえば、「Project Server のヘルプと How-to」ページの英語版の URL は、https://office.microsoft.com/en-us/project-server-help/ です。「Project Server のヘルプと How-to」ページのフランス語版の URL は、https://office.microsoft.com/fr-fr/project-server-help/ です。Project Server でサポートされる言語とカルチャ名コードの一覧については、「PSSupportedLanguages Class (英語)」トピックを参照してください。

各種の主題に関する詳細については、Project チームの公式ブログ「Microsoft Project 2010 (英語)」を参照してください。

Project 2010 のサポート ドキュメントと KB 記事

Microsoft カスタマー サービスおよびサポート チームは、Project 2010 の多数の操作方法とトラブルシューティングに関する記事が掲載されたサポート技術情報 (KB) サイトを維持管理しています。

ヒント

KB 記事のトピック カテゴリの一覧、および検索と RSS フィード ページへのリンクについては、「Microsoft Project サポート ページ」を参照してください。

新しい KB 記事は、日本語、フランス語、スペイン語、およびドイツ語にすぐに機械翻訳されます。カスタマー サービスおよびサポート チームは、Project 2010 のリリースに関して多数の新しい KB 記事を作成し、多数の以前の KB 記事を更新しています。

Project サポート ページには、電子メール、オンライン、および電話による Microsoft のサポートを受けるためのリンクが記載されています。

Project のフォーラム (旧ニュースグループ) では、質問したり、さまざまな質問に対する回答を見つけたりすることができます。フォーラムに関する一般的な情報については、「フォーラムについて」を参照してください。Project のパブリック フォーラムは、次の 4 つです。

Project サポートに関する最新情報については、「Microsoft Office Project サポート Web ブログ (英語)」を参照してください。

Project 2010 向けのダウンロード

Project 向けのすべてのダウンロードは、Microsoft ダウンロード センターで検索できます。

Project 2010 向けのすべてのダウンロードを検索するには

  1. Microsoft ダウンロード センター」に移動します。

  2. 検索テキスト ボックスに「Project 2010」と入力し、Enter キーを押します。

  3. 結果の一覧をフィルター処理または並べ替えるには、[検索結果の絞り込み] ダイアログ ボックスでフィルター パラメーターと並べ替えパラメーターを選択して、[検索] をクリックします。

複数の Office 製品に該当するダウンロードを検索するには、検索ボックスに製品名を入力します。たとえば、Visio 2007 WBS Modeler を検索する場合は「Project Visio」と入力します。

その他の Office 製品とテクノロジに関するドキュメント

Project 2010 と他の Microsoft Office 製品を統合して、各種の Office Business Application を作成できます。

対話型の「Microsoft Office 2010 Developer Map (英語)」を使用すると、2007 Microsoft Office system 製品の開発者向けドキュメントやその他のドキュメントを簡単に見つけることができます。すべての Office 2010 クライアント製品とサーバー製品および関連するテクノロジが記載された PDF ファイルについては、「Office 2010: Developer Map Poster (英語)」を参照してください。

図 1 は、Office 2010 Developer Map の「Desktop Applications」ページを示しています。この対話型のマップには、すべての Microsoft Office クライアント アプリケーション、サーバー アプリケーション、モバイル アプリケーション、サービスと Office 365 アプリケーション、関連するテクノロジ、開発ツール、およびプラットフォーム コンポーネントの関係が含まれています。Office 2010 Developer Map をインストールした後で任意の項目をクリックすると、オンライン ドキュメントへのリンクが記載されたその製品または機能に関するページを表示できます。

図 1. Microsoft Office 2010 Developer Map

Office 2010 Developer Map

Project 2010 での VBA の使用

この記事では Project Server 2010 に重点を置いていますが、Project Standard と Project Professional の VBA オブジェクト モデルは広く使用されています。VBA を使用して、Project デスクトップ クライアントをマクロで自動化したり、Project を他の Office 2010 アプリケーションと統合したりすることで包括的なビジネス ソリューションを作成できます。複雑なソリューションの場合、VBA ではなく Microsoft Visual Studio 2010 の Microsoft Office 開発ツールを使用することをお勧めします。詳細については、「Project クライアント プログラミング」を参照してください。

マクロとカスタム リボン コマンド   簡単なマクロを作成する最も簡単な方法は、リボンの [開発] タブにある [マクロの記録] コマンドを使用し、マクロに入れる手順を手動で実行する方法です。[開発] タブを表示するには、[ファイル] タブの [オプション] をクリックし、[Project のオプション] ダイアログ ボックスで [リボンのユーザー設定] をクリックします。[メイン タブ] ボックスの一覧の [開発] を選択します。記録したマクロは、Visual Basic Editor で編集して調整および簡略化する必要がある可能性があります。

Project Standard 2010 と Project Professional 2010 では、ツール バーとメニューの代わりにリボン ユーザー インターフェイスを使用するので、カスタム コマンド ボタンを追加するための新しい方法があります。詳細については、「[方法] VBA を使用してリボンに独自のコマンドを追加する」および「[方法] マネージ コードを使用してカスタム コマンドをリボンに追加する」を参照してください。

VBA マクロの作成と編集に関する一般的な情報については、「Office 開発者向け技術情報」および「Office 2010 の VBA 開発の基礎知識」を参照してください。Project VBA に関する具体的な記事については、「VBA Programming for Microsoft Office Project Versions 98 Through 2007」の「Using Events」章と「Working with Timephased Data」章を参照してください。Project 2007 SDK には、「カレンダーの例外と有効稼働日」、「ローカル ユーザー設定フィールドおよびアウトライン コードで VBA を使用する」など、Project VBA の操作方法に関する追加の記事があります。

ヒント

Project の VBA プログラミングに関する唯一の書籍が改訂され、Project 2010 も対象となりました。「VBA Programming for Microsoft Project '98 through 2010 with an Introduction to VSTO (英語)」を参照してください。

マクロを他の Project Standard ユーザーに配布する場合は、マクロを含んでいるプロジェクト .mpp ファイルまたは .mpt ファイルを配布できます。たとえば、プロジェクト ファイルを SharePoint ドキュメント ライブラリに投稿して、マクロのコピー手順と使用手順を提供できます。ローカル コンピューターのすべてのプロジェクトでマクロを使用するには、マクロをローカルのグローバル テンプレートにコピーします。Global.mpt ファイルにコピーするには、リボンの [開発] タブにある [構成内容変更] を使用します。

マクロを Project Professional ユーザーのグループに展開するには、エンタープライズ グローバル テンプレートをチェックアウトして、マクロを Project Server のエンタープライズ グローバル テンプレートにコピーします。その後、カスタム リボン コマンドを作成し、そのコマンドをチェック アウトしたエンタープライズ グローバル テンプレートにコピーします。

注意

Project Professional リボンの [開発者] タブで、[エンタープライズ グローバルを開く] をクリックします。マクロをコピーするには、[構成内容変更] をクリックし、[構成内容変更] ダイアログ ボックスの [モジュール] タブをクリックします。[構成内容変更] の左側のウィンドウで VBA モジュールを選択し、右側のウィンドウで [エンタープライズ グローバル - チェックアウト] を選択します。

Visual Studio を使用した Project の自動化   Visual Studio 2010 の Office 開発ツールには、Project 2010 デスクトップ クライアントおよびその他の Microsoft Office アプリケーションを自動化するより複雑でセキュリティ性が高く、スケーラブルなソリューションを開発するために有利な機能が備わっています。Visual Studio で ClickOnce 発行機能を利用すると、Project デスクトップ クライアントを含んだ高度なソリューションの開発、テスト、および展開が大幅に簡単になります。

Project 2010 の VBA 開発者向けの変更内容の概要については、「VBA オブジェクト モデルの変更点」を参照してください。Visual Studio 2010 の Office 開発ツールの詳細については、MSDN の「Visual Studio での Office 開発デベロッパー センター (英語)」を参照してください。Visual Studio 2010 で開発した Project 2010 アドインの詳しい例については、「[ウォークスルー] PWA 互換性を確認するマネージ コード アドインを作成する」を参照してください。

注意

Project 2010 のアドインは、32 ビット版および 64 ビット版で動作するように更新する必要があります。詳細については、「Office Talk: Working with VBA in the 32-bit and 64-bit Versions of Office 2010」を参照してください。

Project Server のアーキテクチャ

Project Server 2010 のアーキテクチャは多層化されています。プレゼンテーション層は、Project Web App、Project Professional 2010、およびサードパーティ クライアント アプリケーションで構成されます。アプリケーション サービス層は、PSI サービス、ビジネス ロジック、および SharePoint Server 2010 で構成されます。データ層は、データ アクセス層 (DAL) コンポーネントと複数の Microsoft SQL Server データベースで構成されます。図 2 に、簡素化した Project Server のアーキテクチャを示します。詳細については、「Project Server 2010 のアーキテクチャ」を参照してください。

図 2. Project Server 2010 のアーキテクチャ

Project Server 2010 のアーキテクチャ

Project Server では、Project Web App の複数の仮想サイトをサポートしています。1 つ以上の Project Web App のインスタンスを Project Server のコア コンポーネントとして同じコンピューターにインストールするか、同じ SharePoint サーバー ファーム内の個別のコンピューターにインストールできます。Project Web App の各インスタンスでは、同じコア Project Server とその他の共有サービスを使用しますが、使用するデータベースはそれぞれ異なります。たとえば、次の 2 つの Project Web App 仮想サイト コレクションには、合計で 8 つの Project Server データベースが必要で、SharePoint Server の構成データベースとコンテンツ データベースを共有します。

  • https://ServerName/pwa/

  • https://ServerName/pwaTest/

前の例の pwa と pwaTest は、Project Web App 仮想サイト コレクションの名前です。各仮想サイトには、SharePoint コンテンツ データベースに格納された個別の独立した許可されたユーザーのリストがあります。Project Server データベースでは、ユーザーのログオン情報を格納しません。たとえば、pwa サイトでは、ProjectServerDraft、ProjectServerPublished、ProjectServerArchive、および ProjectServerReporting という名前のデータベースを使用します。pwaTest サイトでは、TestDraft、TestPublished、TestArchive、および TestReporting という名前の独立したデータベースを使用します。データベースは、SQL Server 2005 または SQL Server 2008 を実行している個別のコンピューターにインストールできます。

Project Web App は、Microsoft ASP.NET 3.5 に基づいて構築されており、PSI を通じて Project Server とやり取りするコンパイル済みアセンブリを使用します。ActiveX コントロールは、Project Web App ページでは使用されず、SharePoint 2010 の新しい JS グリッド コントロールに置き換えられています。開発者は、Project Web App で Web パーツおよび ASPX ページで使用されているコードにアクセスできません。ただし、JS グリッド コントロール オブジェクト モデルにアクセスして、JS グリッド コントロールを使用する Project Server Web パーツを変更および拡張できます。また、Project Web App のリボンを変更したり、SharePoint Server オブジェクト モデルを使用したりして Project Server Web パーツとやり取りする独自の Web パーツを作成できます。自分の拡張機能の Microsoft Visual C# または Microsoft Visual Basic のコードは、他の開発者には表示されません。たとえば、「[方法] PWA のリボンを変更する」、「チュートリアル : PWA リボンのカスタマイズと JS グリッドのアクセス」、および「チュートリアル: JS グリッドを使用して Project Server Web パーツを作成する」を参照してください。

Project Web App では、認証用および Web サーバーとして SharePoint Server 2010 を使用します。Project Web App を個別のコンピューターにインストールしたときの PSI との連携方法の詳細については、Project 2010 SDK の「Project Server 2010 のアーキテクチャ」を参照してください。

Project Server 2010 データへのアクセス

Project Professional 2010 とすべてのサードパーティ アプリケーションは、PSI を通じてのみ Project Server 2010 と通信します。2007 よりも前のバージョンの Project Server では、Project Professional は Project Server データベースに直接アクセスするために ODBC を使用していました。ODBC はほとんどの企業ファイアウォールを経由して使用できません。Project Professional 2010 では、レポート データベースを除き、データベースに直接アクセスする必要がなくなりました。レポート データベースは、他の Project Server データベースとは別の、SQL Server を実行しているコンピューターにインストールできます。

注意

下書き、発行済み、アーカイブの各データベースにプログラムによって直接アクセスすることを妨げるものは存在しません。Project Professional キャッシュ、発行済みデータベース、およびレポート データベースはすべてがキャッシュ同期プロトコルに依存しているので、直接データを編集すると同期が混乱する可能性があることに注意が必要です。直接アクセスしてデータを変更することによって、Project Server データベースや Project Professional クライアント側キャッシュが破損した場合、製品サポートは役に立てません。

PSI は、アプリケーションとビジネス オブジェクト層の間のインターフェイスです。Project Server のビジネス オブジェクトは、プロジェクト、タスク、リソース、割り当てなどの論理エンティティを変更する方法、これらの論理エンティティが相互にやり取りする方法、および他の Project Server コンポーネントとやり取りする方法に関するルールを含んでいるコンポーネントです。各論理エンティティは、複数のデータベース テーブルにまたがることができます。すべてのクライアント アプリケーションは PSI を経由し、同じビジネス ロジックを使用するので、Project Server ではビジネス オブジェクト間の正しい関係を維持できます。ビジネス オブジェクトは Project Server データベースと直接やり取りしません。ビジネス オブジェクトは、DAL を呼び出します。DAL は、正しいデータベース テーブルを使用してトランザクションを処理します。

PSI を経由してすべての Project Server データにアクセスできるわけではありません。たとえば、ほとんどのエンタープライズ カレンダーのデータは、バイナリ イメージ (BLOB) フィールドとして発行済みデータベースに格納されます。PSI メソッドは、エンタープライズ カレンダーの例外の作成、読み取り、および更新を行うことはできますが、稼働日のデータは管理できません。稼働日のデータを管理するには、Project Professional (または VBA マクロか Project アドイン) を使用する必要があります。

レポート データベースの利用

PSI を使用するよりもレポート データベースを使用するほうが Project Server データを簡単に読み取ることができる場合があります。たとえば、Project Server はユーザー設定フィールドごとにレポート データベースに OLAP ビューとユーザー ビューを作成するので、参照テーブルを使用するユーザー設定フィールドの値をすばやく取得できます。たとえば、組み込みの MSPLT_Department_UserView には、Project Web App の "部署" 参照テーブルに定義されている部署のデータが格納されています。次のクエリは、参照テーブルにある最初の 9 個の部署と、特別な Null メンバーをリストに表示します。

SELECT TOP 10 [LookupMemberUID]
      ,[MemberValue]
      ,[MemberDescription]
FROM [ProjectServer_Reporting].[dbo].[MSPLT_Department_UserView]

レポート データベース スキーマ リファレンスについては、「Project 2010 SDK ダウンロード (英語)」を参照してください。このスキーマ リファレンスには、"コストの種類"、"タスクの状況"、"RBS" など、参照テーブルを使用する組み込みユーザー設定フィールドのビューがあります。参照テーブルを使用しないユーザー設定フィールドの場合、プロジェクト ビュー、リソース ビュー、またはタスク ユーザー ビューを使用できます。たとえば、次のクエリは、指定されたプロジェクトのすべてのタスクについて、Test Number という名前のタスクのユーザー設定フィールドの値を検索します。

SELECT task.[ProjectUID]
      ,[TaskName]
      ,[TaskIndex]
      ,[TaskDuration]
      ,[Test Number]
FROM [ProjectServer_Reporting].[dbo].[MSP_EpmTask_UserView] AS task
INNER JOIN [ProjectServer_Reporting].[dbo].[MSP_EpmProject_UserView] AS proj
   ON task.ProjectUID = proj.ProjectUID
WHERE proj.ProjectName = N'My Swell Project'

詳細については、「ユーザー設定フィールドとレポート データベース」を参照してください。

Project 2010 でのキャッシュ、キュー、イベント、およびサーバー側スケジュール

Project Professional 2010 のローカル キャッシュと Project Server Queue Service によって、オフラインで作業して、プロジェクトを開いたり保存したりするのに必要な時間を削減できます。プロジェクト マネージャーがオフラインで作業した後に再接続すると、Project Professional は Project Server キューにメッセージを送信し、変更されたデータだけを保存します。Project Server キューはデータの保存を非同期で処理するので、プロジェクト マネージャーは、Project Professional を終了するか、作業に戻ることができます。

Project Server Events Service は、Project Server の機能を拡張できる主要機能です。開発者は、イベント ハンドラーを作成し、PSI の Events サービスのメソッドまたは Project Web App を使用してプログラムによってそのイベント ハンドラーを登録できます。主なビジネス オブジェクト (CustomFields、CubeAdmin、LookupTable、Project、Reporting、Security、TimeSheet など) にはそれぞれ複数のイベントが格納されており、これらのイベントは、Project Web App (https://ServerName/ProjectServerName/_layouts/pwa/admin/Events.aspx) の [サーバー側のイベント ハンドラー] ページで確認できます。イベント ハンドラーは、新しい機能の追加、既存の機能のカスタマイズ、および他のアプリケーションとの統合を行うための "フック" を提供します。例については、この記事の「Project Server 2010 のイベント」を参照してください。

Project Server 2010 のスケジュール エンジンは機能が強化されています。以前の Project のバージョンでは、たとえば、タスクに対してスケジュールされた時間と異なる時間をチーム メンバーが報告した場合、プロジェクト マネージャーは、Project Professional でプロジェクトを開いて、タスクとその依存タスクのスケジュールを再設定する必要がありました。Project Server 2010 では、タスクのスケジュールを再設定できます。たとえば、カスタム タイムシート システムを実装できます。Project Server は、Project Professional との間でデータを往復しなくてもプロジェクトのスケジュールを再設定します。ただし、PSI には、Project Server スケジュール エンジンを直接呼び出すメソッドはありません。

注意

PSI のパブリック メソッドは、サーバー側のプロジェクトと他のアプリケーションとの統合を管理するための最も一般的で役に立つ要件をサポートしています。パブリック PSI は Project Professional または Project Web App の一部の機能に対応していません。Project Professional または Project Web App では、メソッドといくつかのプライベート PSI サービスを使用します。

詳細については、「PSI が行うこと、行わないこと」を参照してください。

Microsoft SharePoint Server 2010 との統合

Project Server 2010 には Microsoft SharePoint Server 2010 (エンタープライズ クライアント アクセス ライセンス付き) が必要です。サイト管理、ユーザー認証、ワークフロー、プロジェクト センターおよび自分のタスクのような Project Server Web パーツ、懸案事項、リスク、成果物、および関連ドキュメントのリストを含んだプロジェクト サイトなど、すべての Project Web App 機能は、SharePoint Server に基づいています。SharePoint のアーキテクチャの概要については、「SharePoint 2010 Architectures Overview」を参照してください。

Project Server のセキュリティ

SharePoint Server 2010 では、SharePoint Server の新機能の 1 つであるクレーム処理を通じてユーザー認証を処理します。SharePoint では、Project Server ユーザーに対して Windows 認証とフォーム認証の両方に対応しています。Project Server では、さまざまな Project Server の機能と動作のユーザー認証に対してグローバル権限とカテゴリ権限を追加しています。これらの権限にアクセスするには、Project Web App の [ユーザーの管理] ページでユーザーを選択します。

(PSI Security サービスを使用してプログラムによってアクセスできる) Project Server の Security ビジネス オブジェクトは、セキュリティ グループ、カテゴリ、テンプレート、およびグローバル Project Web App 権限を管理します。Security サービスでは、Project Server ユーザーに使用できるセットに既存の権限を追加したり、権限を削除したりできます。ただし、Security サービスにはカスタム権限を作成するメソッドはありません。

注意

Office Project Server 2007 では、発行済みデータベースのセキュリティ テーブルを変更することで、カスタムのグローバル権限とカテゴリ権限を作成できます。記事「[ウォークスルー] ユーザー定義の Project Server 権限を作成および使用する」は、発行済みデータベースを直接変更することに対して例外が作成される唯一の SDK 例です。カスタム権限は、Project Web App の権限の一覧に表示されます。ここでは、Project Server 管理者は、他の Project Server 機能をセキュリティで保護するときと同じ方法でサードパーティの拡張機能をセキュリティで保護できます。Project Server 2010 では、カスタム権限を作成するプロセスは廃止されています。代わりに、独自のユーザー インターフェイスを作成してカスタム権限を管理できる可能性があります。

Project Server セキュリティ モデルをレポートに組み込む方法の詳細については、「Using Project Server Security in SQL Server Reporting Services Reports」を参照してください。グローバル権限とカテゴリ権限の説明など、Project Server のセキュリティに関する詳細については、Project Server 2007 SDK の「Project Server のセキュリティ入門」および TechNet の「Project Server 2010 のセキュリティと保護」を参照してください。

Project Server Web パーツ

Project Web App と SharePoint Server 2010 の Web ページ開発機能は, .NET Framework 3.5 に基づいて構築されています。Project Web App は 1 つの SharePoint サイトなので、他の SharePoint サイトと同様に Project Web App の Web パーツを開発できます。Visual Studio 2010 では、以前のバージョンよりもさらに簡単に Web パーツの開発、展開、テスト、およびデバッグを行えるようになりました。新しい視覚的 Web パーツ プロジェクト テンプレートは、Web パーツにデザイン機能を提供します。

Web パーツを、[サイトの操作] メニューに [ページの編集] オプションが用意されている Project Web App ページに追加できます。[ポートフォリオ分析]、[サーバー設定] など、一部のページは特定の機能のために用意されているので、これらのページは編集できません。ただし、Project Web App 管理者は、[サーバー設定] ページの [サイド リンク バー] リンクを使用して、サイド リンク バーにカスタム ページへのリンクとセクションを追加できます。図 3 は、編集可能な Project Web App ページに Web パーツを簡単に追加できる様子を示しています。[サイトの操作] メニューの [ページの編集] をクリックし、目的のページ セクションで [Web パーツの追加] をクリックするだけです。図 3 では、[懸案事項] Web パーツが [Project Web App] カテゴリで選択されています。

図 3. Project Server Web パーツの追加

Project Server Web パーツの追加

Project Server 2010 には、[プロジェクト センター]、[プロジェクトの詳細]、[自分のタイムシート ] など、18 個の専用の Project Server Web パーツが [Project Web App] カテゴリに用意されています。SharePoint Server 2010 には、さらに多くの Web パーツが複数のカテゴリに用意されています (図 3 の [JS Grid Examples] カテゴリは追加されたカスタム カテゴリなので、お使いの Project Web App サイトには表示されません)。Project Web App で使用できる約 90 個の組み込み Web パーツの一覧を確認するには、[サイトの操作] メニューで [サイトの設定] をクリックし、[ギャラリー] セクションの [Web パーツ] をクリックします。

Web パーツでは、ASP.NET 3.5 の System.Web.UI.WebControls.WebParts 名前空間を使用するか、Microsoft.SharePoint.WebControls 名前空間を使用できます。カスタム Web パーツと使用する名前空間の詳細については、「Project Server Web パーツの開発」を参照してください。

注意

Project Server 2010 Web パーツは、Project Server と同じサーバー ファーム内に存在する場合、他の SharePoint サイトに追加できます。Project Server 2010 で他の SharePoint サイトを準備する必要はありません。

.NET Framework 3.5 をターゲット フレームワークとして選択すると、Visual Studio 2010 の視覚的 Web パーツ プロジェクト テンプレートと Web パーツ アイテム テンプレートは両方とも .webpart ファイル名拡張子を使用して Web パーツを作成します。Project Web App では、以前の Windows SharePoint Services 2.0 Web パーツ (ファイル名拡張子が .dwp), .ascx カスタム コントロール、およびその他の Microsoft ASP.NET 2.0 の拡張機能もサポートしています。SharePoint Server 2010 および SharePoint によってホストされないその他の ASP.NET 3.5 または Microsoft ASP.NET 4.0 アプリケーションとの互換性を確保するために、可能な限り ASP.NET 3.5 Web パーツを作成することをお勧めします。

Project Web App ページの変更
SharePoint Server 2010 では、マスター ページを使用してサイト内の Web ページの外観を制御します。ただし、Project Server では、Microsoft SharePoint Designer 2010 を使用して Project Web App ページまたはマスター ページを編集できません。これは、SharePoint Designer では、PSI およびその他の Project Server アセンブリにアクセスする整数コードを管理できないためです。Project Web App に変更を加えて、組織のブランド、配色、および用語を組み込むことができます。[サイトの設定] ページの [外観] セクションを参照してください。また、Project Web App リボン上のコントロールの外観の追加、削除、無効化、変更、またはコントロールの動作の変更を行うこともできます。詳細については、「[方法] PWA のリボンを変更する」を参照してください。

JS グリッド コントロール (Microsoft SharePoint Foundation 2010 に含まれる) は、以前のバージョンの Project Server で使用されている ActiveX グリッド コントロールの代わりとなるものです。JS グリッド コントロールでは、グリッドのクライアント側の変更に ECMAScript (JavaScript、JScript) を使用します。JS グリッド コントロールを含んでいる Project Web App ページについては、JS グリッド コントロール オブジェクト モデルとイベント ハンドラーを使用して、グリッドを変更し、機能を追加できます。また、コールバックではサーバー側アセンブリを使用できます。例については、「チュートリアル : PWA リボンのカスタマイズと JS グリッドのアクセス」を参照してください。カスタム Web パーツによって PSI メソッドまたはサードパーティ アプリケーションを呼び出すことができます。例については、「チュートリアル: JS グリッドを使用して Project Server Web パーツを作成する」を参照してください。

プロジェクト サイト

プロジェクトを作成し、発行するとき、既定ではチームのグループ作業用のプロジェクト サイトも作成します。以前のバージョンの Project Server では、プロジェクト サイトはプロジェクト ワークスペースと呼ばれていました。たとえば、My Test Project という名前のプロジェクトの既定のサイトは、次のようになります。

https://ServerName/My%20Test%20Project/default.aspx

Project Professional または PSI を使用してプロジェクトを作成し、発行するときは、同じファーム内で SharePoint を実行している別のサーバーを指定するか、異なるサイト名を指定できます。プロジェクト サイトには、ドキュメント、懸案事項、リスク、およびプロジェクト成果物のリストを入れることができます。プロジェクト マネージャーは、プロジェクト成果物のリストとして、タスクまたはマイルストーンを発行でき、他のプロジェクト マネージャーは、そのリストを購読して、日付の変更に関する通知を受け取ることができます。成果物の発行または購読は、どちらのプロジェクトのタスク スケジュールにも影響しませんが、プロジェクト間のグループ作業を向上する方法として機能します。

成果物リストは、専用の SharePoint リストです。SharePoint 2010 SDK には、カスタム リストを開発する方法に関する例が用意されています。プロジェクト サイトは、いくつかのカスタム リストが組み込まれた基本 SharePoint サイトなので、SharePoint Designer 2010 によるマスター ページの変更をはじめとする、カスタマイズと拡張を行うためのすべての SharePoint の手法を使用できます。プロジェクト サイトの新しいマスター ページを作成するには、プロジェクトに接続されていないプロジェクト サイトを手動で作成します (つまり、プロジェクトを発行するときにサイトが Project Server によって作成されていない場合)。そのサイトを変更し、そのマスター ページを他のプロジェクト サイトのマスター ページとして使用します。

プロジェクト サイトのテンプレートを変更する方法については、Project 2007 SDK の「プロジェクト ワークスペース テンプレートを拡張する」を参照してください。懸案事項、リスク、その他のカスタム リストなど、SharePoint リスト データの使用の詳細については、書籍の抜粋である「Importing SharePoint List Data into Project Server 2007 Custom Fields」を参照してください。この手順は Project Server 2010 に対しても機能します。プロジェクト サイトのカスタマイズの詳細については、「SharePoint デベロッパー センター」を参照してください。

Project Server のワークフロー

Windows Workflow Foundation (WF) は、SharePoint Foundation 2010 によってホストされ、拡張される Windows ベースのプラットフォーム コンポーネントです。WF は、サーバーでもアプリケーションでもなく、開発フレームワークで、SharePoint とその他の Windows アプリケーションに共通のワークフロー技術を提供します。SharePoint のワークフローの詳細については、「[新機能] ワークフローに関する機能拡張」を参照してください。

Project Server 2010 では、SharePoint ワークフロー プラットフォームにいくつかの拡張機能と 1 つの制限を追加しています。Project Server には、標準の SharePoint および WF アクティビティと一緒に使用できるカスタム ワークフロー アクティビティが組み込まれています。SharePoint とは異なり、Project Server ワークフローの開発に SharePoint Designer 2010 は使用できません。Project Server ワークフローは、Project Server コンピューター上の Visual Studio 2010 を使用して開発する必要があります。

Project Server 2010 のリリース後に導入された Microsoft Project 2010 Solution Starters (英語) のいくつかのツールは、単純な (分岐なし) ワークフローの作成と関連する機能の管理に役立ちます。ワークフローは、需要管理とポートフォリオ分析に完全に統合されています。Project Server ワークフローの詳細については、「ワークフローおよび需要管理」と「Project Server ワークフローを開発する」を参照してください。

Project Web App の SimpleUI URL オプション

Project Web App ページには、ページの各部分を非表示または表示するための SimpleUI という名前の以前の URL オプションがまだ実装されています。これらのオプションはほとんど使用されません。Project Server 2010 では、SimpleUI の設定はローカル ユーザーのコンピューターに Cookie として保存されます。SimpleUI は、Project Web App ページにグローバルに適用されますが、Project Server の準備がないファーム内の他の SharePoint サイトには適用されません。Project Server 2010 の新機能であるリボンは影響を受けません。たとえば、次の URL は、Project Web App のサイド リンク バーを非表示にします。

https://ServerName/ProjectServerName/default.aspx?SimpleUI=8

現在では、すべてのページで同じ要素が削除されているので、他のページに SimpleUI オプションが表示されることはありません。現在のページに関して既定のビューに一時的に戻すには、任意の Project Web App URL に ?SimpleUI=0 を追加します。すべてのページで既定のビューを維持するには、?SimpleUI=16 を追加します。Project Server 2003 の 256 個の SimpleUI の組み合わせとは異なり、Project Server 2010 では、32 個のビットマスクの組み合わせ (0 ~ 31) を使用します。URL オプションの表については、Project 2007 SDK の「カスタム Web パーツのシナリオ」を参照してください。

Project Server Interface

PSI には、22 個のパブリック サービス (ASMX インターフェイスを経由してアクセスする場合は Web サービスと呼ばれる) があります。ほとんどの PSI サービスは、Project、Resource など、論理エンティティである Project Server のビジネス オブジェクトに対応しています。たとえば、PSI には、Project エンティティに対して Project サービス、Resource エンティティに対して Resource サービス、TimeSheet エンティティに対して TimeSheet サービスが用意されています。各 PSI サービスには、そのエンティティのデータを含んだ 1 つ以上の DataSet オブジェクトが組み込まれています。ほとんどの PSI メソッドでは、DataSet パラメーターを使用するか、DataSet オブジェクトを返します。たとえば、Project サービスの QueueCreateProject メソッドは、Project Server キューにメッセージを送信し、ProjectDataSet パラメーターに指定されたデータを使用して下書きデータベースにプロジェクトを作成します。次に、QueueCreateProject メソッドのシグネチャを示します。

public void QueueCreateProject(Guid jobUid, ProjectDataSet dataset, 
   bool validateOnly);

jobUid パラメーターでは、QueueSystem サービスのメソッドを使用してキューでジョブを追跡および管理できます。QueuePublish、QueueCheckInProject など、名前が Queue で始まる PSI メソッドは、すべて非同期で実行されます。Project Server はキューにメッセージを配置した後に、制御をアプリケーションに戻します。CheckOutProject、ReadProject などのその他のメソッドは同期的に実行されます。このため、メソッドが完了するまでアプリケーションは再開されません。

ReadProject メソッドは、指定されたデータベースの指定されたプロジェクトを読み取り、ProjectDataSet オブジェクトを返します。すべてのエンティティは、GUID によって Project Server で識別されます。PSI メソッドの一部のパラメーターは、Microsoft.Office.Project.Server.Library.dll アセンブリにある列挙、または場合によっては PSI サービスにある列挙を使用します。たとえば、次に ReadProject メソッドのシグネチャを示します。

public ProjectDataSet ReadProject(Guid projectUid, DataStoreEnum dataStore);

ReadProject メソッドを呼び出す次のコード フラグメントでは、SvcProject 名前空間は PSI の Project サービス用のプロキシの任意の名前です。projUid 変数の値は、以前下書きデータベース (作業ストア) に保存されたプロジェクトの GUID です。

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

private static SvcProject.ProjectClient projectClient;
. . .
    // Initialization of the projectClient object is not shown here.
    
    Guid projUid = new Guid("8024BEB0-7814-44CF-98FF-4E74148E3404");
    SvcProject.ProjectDataSet projDs = 
        projectClient.ReadProject(projUid, PSLibrary.DataStoreEnum.WorkingStore);
    . . .

デュアル インターフェイス: ASMX と WCF

WCF インターフェイスは、SharePoint Server のバックエンドの Project Server アプリケーション サービスで定義されているので、Internet Explorer を使用して PSI サービスの WCF インターフェイスを表示できません。各 PSI サービスの WCF インターフェイスには、サービスにアクセスするときに使用するメソッドが格納されたプライマリ クラスがあります。プライマリ クラスの名前には、Client サフィックスが付いています。たとえば、Project サービスのプライマリ クラスは ProjectClient です。Resource サービスのプライマリ クラスは ResourceClient です。

プライマリ クラスのコンストラクターには複数のオーバーロードがあります。プライマリ クラスを初期化する一般的な方法は、WCF エンドポイントを定義し、そのエンドポイントの名前をパラメーターとして使用する方法です。次に例を示します。

projectClient = new SvcProject.ProjectClient("basicHttp_Project");

WCF エンドポイントは、プログラムによって定義するか、app.config、web.config などのサービス構成ファイルで定義できます。app.config ファイルの例については、「WCF ベースのコード サンプルの前提条件」の「サービス構成ファイルを追加する」セクションを参照してください。WCF エンドポイントをプログラムによって定義する例については、「[ウォークスルー] WCF を使用して PSI アプリケーションを開発する」の「サービスをプログラムで構成する」セクションを参照してください。アプリケーションがスタンドアロン、つまり、アプリケーションが別のアプリケーションのサービス構成ファイルに影響を与えない場合は、サービス構成ファイルを使用できます。Project Web App 自体の app.config ファイルを変更しないようにするために、アプリケーションが、イベント ハンドラー、Project Web App ページ上の JS グリッド コントロールの変更、PSI 拡張機能など、Project Server の拡張機能の場合は、WCF エンドポイントをプログラムによって定義する必要があります。

ASMX インターフェイス   ASMX インターフェイスには Project Web App フロントエンドでアクセスするので、Internet Explorer を使用して PSI Web サービスの ASMX インターフェイスを表示できます。たとえば、次の URL を自分の Project Web App インスタンスに合わせて変更し、その URL を Internet Explorer に貼り付けます。

https://ServerName/ProjectServerName/_vti_bin/PSI/project.asmx?wsdl

各 PSI Web サービスの ASMX インターフェイスに含まれるプライマリ クラスは、サービスの名前です。たとえば、Project サービスのプライマリ ASMX クラスは Project です。Resource サービスのプライマリ クラスは Resource です。次のコード スニペットでは、ProjectWebSvc は、PSI の Project サービス用のプロキシの任意の名前空間です。プライマリ Project オブジェクトは、Url プロパティと Credentials プロパティを設定するだけで初期化できます。次に例を示します。

using System.Web.Services.Protocols;
using PSLibrary = Microsoft.Office.Project.Server.Library;
. . .

    ProjectWebSvc.Project project = new ProjectWebSvc.Project();
    project.Url = "https://ServerName/ProjectServerName/_vti_bin/psi/project.asmx";
    project.Credentials = CredentialCache.DefaultCredentials;

PSI サービスのプライマリ クラスを初期化した後は、ASMX ベースのアプリケーションの残りのコードは、WCF ベースのアプリケーションと同じです (ただし、アプリケーションが偽装を実行する場合、または Project Web App インスタンスが Windows 認証とフォーム認証の両方を使用する場合を除きます)。ASMX インターフェイスの使用の詳細については、「ASMX ベースのコード サンプルの前提条件」を参照してください。Project 2010 SDK の複数の PSI メソッドは、WCF インターフェイスと ASMX インターフェイス両方のコード例を含んでいます。たとえば、「ReadProjectStatus」を参照してください。

PSI サービスを使用する新しいアプリケーションを開発するときは、WCF インターフェイスを使用することをお勧めします。ASMX インターフェイスは以前の Project Server アプリケーション (Office Project Server 2007 向けに開発されたアプリケーション) に使用できます。Project Server 2003 またはそれ以前のバージョン向けに開発された古いアプリケーションの場合、Project Server 2010 で実行するためにはそのアプリケーションを完全に設計し直す必要があります。多くの場合、Office Project Server 2007 と Project Server 2010 に導入された新しい機能が原因で、古いアプリケーションは機能できません。古い Project Data Service (PDS) アプリケーションの移植の詳細については、「PSI Web サービスの PDS 相当機能」を参照してください。WCF インターフェイスと ASMX インターフェイスの詳細については、「WCF と PSI の概要」を参照してください。

簡単に始められる方法

Project Server での WCF サービスを使用した開発には多数の選択肢があるので、PSI の WCF インターフェイスの使用方法はわかりにくい可能性があります。WCF サービス参照を追加する方法は 3 つあり、サービスを構成する方法は 2 つ (「[ウォークスルー] WCF を使用して PSI アプリケーションを開発する」の「サービスを app.config で構成する」セクションの説明のとおりに、Visual Studio のサービス構成エディターを使用する場合は、3 つ) あります。

PSI 開発を習得し始めやすくするために、構成が既に完成している例を試してみてください。

最初の WCF ベースの PSI アプリケーションを作成するには

  1. Project 2010 SDK ダウンロードをインストールします。Visual Studio サンプルを使用するときの権限に関する問題を回避するため、既定のディレクトリではなく、C:\Project_SDK のようなディレクトリにインストールするほうが簡単です。

  2. ~\Documentation\Intellisense\WCF\Source.zip ファイルを同じサブディレクトリに展開し、[Visual Studio コマンド プロンプト] ウィンドウで CompileWCFProxyAssembly コマンドを実行します。これにより、ProjectServerServices.dll プロキシ アセンブリが作成されます。

  3. Visual Studio 2010 で Samples\ManagedCodeReference\CreateProject4Department.sln ソリューションを開きます。

    注意

    可能な場合は、Project Server のテスト インストールで作業することをお勧めします。多くのアプリケーション (ワークフロー、あるいは Project Web App またはプロジェクト サイトの変更を除く) は、外部のコンピューターで開発できますが、Microsoft.Office.Project.Server.Library.dll アセンブリと ProjectServerServices.dll プロキシ アセンブリをリモート コンピューターにコピーする必要があります。

  4. 手順 2. で作成した ProjectServerServices.dll プロキシ アセンブリへの参照を設定し、Microsoft.Office.Project.Server.Library 参照が有効であることを確認します。

  5. app.config ファイルで、ProjectServer.svc エンドポイントについて正しいサーバー名と Project Web App 名を使用するようにエンドポイント アドレスを変更します。

  6. Program.cs ファイルで、別の値を使用する場合は OUTPUT_FILES 定数のディレクトリ名を変更します。

  7. "部署名" 参照テーブルに 1 つ以上の部署を作成し (https://ServerName/ProjectServerName/_layouts/PWA/Admin/EditLookupTable.aspx?_guid=e7397277-1ab0-4096-b2dd-57029a055ba4 を使用)、Program.cs ファイルのコメントに記載されているように、部署から 1 つの GUID を見つけます。DEPARTMENT_TEST 定数の値を変更します。

  8. プログラムをコンパイルして実行します。[Visual Studio コマンド プロンプト] ウィンドウに次の出力が表示されるはずです。

    XML output of the ProjectDataSet before QueueCreateProject:
        C:\Project\Samples\Output\ProjectDataSet4Department_before.xml
    Creating project: Test Dept 1
    Waiting for job: ProjectCreate .................................................
    
    XML output of the ProjectDataSet after ReadProject:
        C:\Project\Samples\Output\ProjectDataSet4Department_after.xml
    
  9. 任意のキーを押してコマンド プロンプト ウィンドウを終了します。エラーが発生した場合は、Project Web App にアクセスし、プロジェクトを作成する適切な権限があることを確認します。また、「Project Server 2010 でのエラーの確認」で説明しているように、ULS ログを確認します。

PSI での DataSet オブジェクトの使用

すべての PSI サービスには、そのサービスに必要で、ビジネス エンティティの情報に相当する DataSet クラスがあります。DataSet オブジェクトは、基本的に、テーブル、リレーションシップ、制約、行、およびフィールドのスキーマが格納されたメモリ内のリレーショナル データベースです。各 DataSet オブジェクトは、DataRow オブジェクトを含んだ 1 つ以上の DataTable オブジェクトを含んでいます。各 DataRow は、1 つ以上のプロパティ (データ フィールド) と行を管理するためのメソッドを含んでいます。たとえば、ResourceDataSet クラスは、ResourceDataTable、ResourceRatesDataTable などのサブクラスを含んでおり、そのサブクラスはそれぞれ、Resource テーブルと ResourceRates テーブルに対応しています。ResourceDataSet.ResourceRatesRow サブクラスでは、ResourceRates テーブルの行 (つまり、リソース コスト レコード) を定義します。

次の Demo_UpdateResource コンソール アプリケーションのコードでは、resourceDs 変数に ResourceDataSet オブジェクトが格納されています。

注意

app.config ファイルの "basicHttp_Resource" WCF エンドポイントの定義はここでは示していません。Project 2010 SDK ダウンロードに収録されている PSI サンプル ソリューションの任意の app.config ファイルを適応できます。

WCF ベースのアプリケーションの FaultException エラーを処理するには、try – catch ステートメントを使用して PSI メソッドを呼び出す必要があります。ASMX ベースのアプリケーションでは、SoapException エラーを検出します。詳細については、「Project Server エラー コード」の「WCF のコード例」セクションと「ASMX のコード例」セクションを参照してください。

using System;
using System.ServiceModel;
using System.Xml;
using PSLibrary = Microsoft.Office.Project.Server.Library;

namespace Demo_UpdateResource
{
    class Program
    {
        private const string ENDPOINT_RESOURCE = "basicHttp_Resource";
        private const string OUTPUT_FILES = @"C:\Project\Samples\Output\";

        private static SvcResource.ResourceClient resourceClient;
        private static string outFilePath;

        static void Main(string[] args)
        {
            outFilePath = OUTPUT_FILES + "Demo_ReadResource.xml";
            resourceClient = new SvcResource.ResourceClient(ENDPOINT_RESOURCE);

            Guid myUid = resourceClient.GetCurrentUserUid();

            SvcResource.ResourceDataSet resourceDs = resourceClient.ReadResource(myUid);

            // Set cost per use to 1.25 USD.
            double costPerUse = 1.25 * PSLibrary.ValidationConst.s_cost_multiplier;

            if (resourceDs.ResourceRates[0].RES_COST_PER_USE != costPerUse)
            {
                resourceDs.ResourceRates[0].RES_COST_PER_USE = costPerUse;

                if (resourceDs.Resources[0].IsRES_CHECKOUTBYNull())
                {
                    Guid[] resourceUids = { myUid };  // Array of resources to check out.
                    resourceClient.CheckOutResources(resourceUids);
                }
                bool validateOnly = false;
                bool autoCheckIn = true;
                resourceClient.UpdateResources(resourceDs, validateOnly, autoCheckIn);
            }
            resourceClient.Close();
            
            Console.WriteLine("XML output file for ResourceDataSet: {0}", outFilePath);
            resourceDs.WriteXml(outFilePath);
            Console.Write("\nPress any key to exit... ");
            Console.ReadKey(true);
        }
    }
}

Demo_UpdateResource は以下の処理を実行します。

  1. WCF エンドポイントを使用して ResourceClient オブジェクトを初期化します。

  2. GetCurrentUserUid メソッドを使用してアプリケーション ユーザーの GUID を取得します。

  3. ReadResource メソッドを使用して ResourceDataSet オブジェクトを初期化します。ResourceDataSet は、ResourceRates[0] によってアクセスされる、ResourceRates テーブルの 1 つの行を含んでいます。

  4. (英語 (米国) システムで) 導入コストの値を 1.25 ドルに設定します。RES_COST_PER_USE プロパティは s_cost_multiplier フィールドを使用してコスト値を変換します。

  5. アプリケーション ユーザーの導入コストが 1.25 ドルかどうかを確認します。異なる場合、RES_COST_PER_USE フィールドを 1.25 ドルに設定します。

  6. RES_CHECKOUTBY 値が null かどうかを確認します。null の場合、リソースをチェックアウトします。

  7. UpdateResources メソッドを使用してリソースを更新します。

    注意

    Project 2010 SDK では、PSI サービスのプライマリ クラスに格納されている各メソッドのトピックの「Remarks」セクションに、そのメソッドを使用するときに必要な Project Server 権限が記載されています。たとえば、UpdateResources メソッドでは、ManageUsersAndGroups グローバル権限、EditEnterpriseResourceData カテゴリ権限などの 4 つの権限を使用します。アプリケーション ユーザーに必要なすべての権限が割り当てられていない場合は、UpdateResources メソッドの呼び出しで例外が発生し、呼び出しは失敗します。

  8. ResourceClient オブジェクトを閉じてガベージ コレクションに貢献します。

  9. WriteXml メソッドを使用してデバッグの目的で、ResourceDataSet オブジェクトを XML ファイルにシリアル化します。次の例は、XML ファイルの一部で、更新後の RES_COST_PER_USE フィールドを示しています。

    <?xml version="1.0" standalone="yes"?>
    <ResourceDataSet xmlns="https://schemas.microsoft.com/office/project/server/webservices/ResourceDataSet/">
      <Resources>
        <!-- Fields in the Resources table. -->
      </Resources>
      <ResourceCustomFields>
        <!-- Fields in the ResourceCustomFields table. -->
      </ResourceCustomFields>
      <CalendarExceptions>
        <!-- Fields in the CalendarExceptions[0] row.-->
      </CalendarExceptions>
      <CalendarExceptions>
        <!-- Fields in the CalendarExceptions[1] row.-->
      </CalendarExceptions>
      <ResourceRates>
        <RES_UID>efef7161-eb7f-43b0-8936-7247ca393453</RES_UID>
        <RES_RATE_TABLE>0</RES_RATE_TABLE>
        <RES_STD_RATE>12</RES_STD_RATE>
        <RES_OVT_RATE>15</RES_OVT_RATE>
        <RES_COST_PER_USE>125</RES_COST_PER_USE>
      </ResourceRates>
      <ResourceAvailabilities>
        <RES_UID>efef7161-eb7f-43b0-8936-7247ca393453</RES_UID>
        <RES_AVAIL_UNITS>100</RES_AVAIL_UNITS>
      </ResourceAvailabilities>
    </ResourceDataSet>
    

たとえば、開発およびテスト中に Demo_UpdateResource アプリケーションをデバッグするには、UpdateResources 呼び出しを含んでいるステートメントにブレークポイントを設定します。アプリケーションが実行を一時停止したときに、マウス ポインターを resourceDs パラメーターの上に移動し、小さな虫眼鏡アイコンをクリックして [DataSet ビジュアライザー] ダイアログ ボックスを表示します。[テーブル] ドロップダウン リストの一覧の [ResourceRates] を選択します (図 4)。

図 4. デバッグ時の DataSet ビジュアライザーの使用

DataSetVisualizer でのデバッグ

アプリケーションが終了した後、Project Web App でそのユーザーの [ユーザーの編集] ページを開くと、[導入コスト] テキスト ボックスには 1.25 ドルが表示されます。

Project 2010 SDK のコード サンプルの多くは、データセットを使用しています。たとえば、QueueCreateProject のトピックには、空の ProjectDataSet にあるデータテーブルに行を追加し、プロジェクトを作成する WCF ベースと ASMX ベースのコード サンプルが記載されています。ProjTool テスト アプリケーションには、PSI のデータセットを操作する多数の例が用意されています。ProjTool のソース コードは Project 2010 SDK ダウンロードで入手できます。「Project Server 2010 での ProjTool テスト アプリケーションの使用」を参照してください。データセットの一般的な情報については、「ADO.NET」を参照してください。

xmlFilter パラメーターを使用する PSI メソッド

データを読み取る 8 個の PSI メソッドは、xmlFilter パラメーターで XML 文字列フィルター オブジェクトを使用します。このパラメーターではメソッドが DataSet で返すデータの量を制限できます。フィルターを使用するメソッドは、ReadCalendars、ReadCustomFields、ReadCustomFields2、ReadLookupTables、ReadLookupTablesMultiLang、ReadResources、ReadResourceAssignments、および ReadResourcePlan です。ほとんどの場合、xmlFilter パラメーターが空の文字列のときメソッドは、そのメソッドで取得できるすべてのデータを返します。例外は、ReadResourceAssignments メソッドです。大量の割り当てが存在する可能性があるので、このメソッドでは空でない文字列を指定する必要があります。

たとえば、次のコードの GetLookupTableFilter メソッドは、LT_UID 列、LT_STRUCT_UID 列、および LT_VALUE_FULL 列を含む LookupTableTrees テーブルだけを格納するように LookupTableDataSet を制限する XML フィルターを作成します。GetRbsValue メソッドは ReadLookupTables メソッドを呼び出し、lutValueUid パラメーターで指定された RBS ユーザー設定フィールドの完全な値を見つけるためにフィルター処理された LookupTableTrees テーブルを反復処理します。

using PSLibrary = Microsoft.Office.Project.Server.Library;
. . .
private string GetRbsValue(Guid lutValueUid)
{
    string rbsValue = string.Empty;
    // Don't use a known LCID when ReadLookupTables uses a non-empty filterXml parameter.
    int noLcid = 0; 
    PSLibrary.Filter lutFilter = GetLookupTableFilter();
    string lutFilterXml = lutFilter.GetXml();

    SvcLookupTable.LookupTableDataSet lutDs =
        lookupTableClient.ReadLookupTables(lutFilterXml, false, noLcid);

    for (int i = 0; i < lutDs.LookupTableTrees.Count; i++)
    {
        if (lutDs.LookupTableTrees[i].LT_STRUCT_UID == lutValueUid)
        {
            rbsValue = lutDs.LookupTableTrees[i].LT_VALUE_FULL;
            break;
        }
    }
    return rbsValue;
}

// Create a filter for the ReadLookupTables method.
private PSLibrary.Filter GetLookupTableFilter()
{
    // Create an empty LookupTableDataSet, to get the table and column names.
    SvcLookupTable.LookupTableDataSet lutDs = new SvcLookupTable.LookupTableDataSet();

    string lutTableName = lutDs.LookupTableTrees.TableName;
    string lutUidColumn = lutDs.LookupTableTrees.LT_UIDColumn.ColumnName;
    string lutStructUidColumn = lutDs.LookupTableTrees.LT_STRUCT_UIDColumn.ColumnName;
    string lutFullValueColumn = lutDs.LookupTableTrees.LT_VALUE_FULLColumn.ColumnName;

    // Get the GUID for the built-in RBS lookup table.
    Guid lutRbsUid = PSLibrary.LookupTables.RBS_LT_UID;  

    PSLibrary.Filter lutFilter = new PSLibrary.Filter();

    lutFilter.FilterTableName = lutTableName;
    lutFilter.Fields.Add(new PSLibrary.Filter.Field(lutUidColumn));
    lutFilter.Fields.Add(new PSLibrary.Filter.Field(lutStructUidColumn));
    lutFilter.Fields.Add(new PSLibrary.Filter.Field(lutFullValueColumn));

    PSLibrary.Filter.FieldOperationType equal = PSLibrary.Filter.FieldOperationType.Equal;
    lutFilter.Criteria = new PSLibrary.Filter.FieldOperator(equal, lutUidColumn,
        lutRbsUid.ToString());

    return lutFilter;
}

完全な Visual Studio ソリューションは、Project 2010 SDK ダウンロードの ReadRBS サンプルにあります。xmlFilter パラメーターの使用方法の詳細については、Project 2007 SDK の「[方法] PSI メソッドでフィルター パラメーターを使用する」を参照してください。

偽装および PSI の拡張機能

Project Server アプリケーションでのユーザーの偽装は、Project Server 2010 では Office Project Server 2007 の場合ほど一般的に使用されません。たとえば、ReadStatusForResource メソッドと SubmitStatusForResource メソッドには偽装が必要なく、この 2 つのメソッドは、ReadStatus メソッドと SubmitStatus メソッドよりも優先されます。また、Project Server 2010 では制限が追加され、追加の管理設定が必要です。詳細およびコード例については、「[方法] WCF による偽装を使用する」を参照してください。

追加のサービスを使用して PSI 自体を拡張できます。カスタム PSI サービスのメソッドは、たとえば、ユーザー認証の確認、特定のジョブに対する偽装の使用、ネットワーク トラフィックを節約するためにサーバー上の複数の PSI 呼び出しを統合、または Project Server への新しい機能の追加を行うために他の PSI メソッドを呼び出すことができます。ReadResource PSI メソッドを呼び出す HelloService という名前の簡単な WCF ベースの例については、「Project Server 2010 の PSI 拡張機能を作成する」を参照してください。PSI 拡張機能は、Project Web App フロントエンド アプリケーションにインストールされます。たとえば、URL は https://ServerName/ProjectServerName/_vti_bin/PSI/HelloService.svc?wsdl です。

[方法] RDB のユーザー設定フィールドを読み取る PSI 拡張を作成する方法」記事の PSI 拡張機能は、レポート データベースでストアド プロシージャを使用して、指定されたユーザー設定フィールド値を持つすべてのプロジェクトを検索します。PSI 拡張機能の例の完全な Visual Studio ソリューションは、Project 2010 SDK ダウンロードに収録されています。

PSI での Windows PowerShell の使用

Windows PowerShell スクリプトは、Project Server 2010 と SharePoint Server 2010 の管理タスクを補助するために頻繁に使用されます。Windows PowerShell と ASMX インターフェイスを一緒に使用して、PSI メソッドを呼び出すこともできます。次の例では、localhost ではなくコンピューターの実際の名前を使用します。たとえば、PWA という名前の Project Web App インスタンスが MyServer コンピューターの 5050 ポートに存在する場合、$pwaUrl 値を $pwaUrl = "http://MyServer:5050/pwa" に変更します。

注意

([スタート] メニューの [Microsoft SharePoint 2010 製品] フォルダーにある) [SharePoint 2010 管理シェル] を管理者として実行します。次のスクリプトを実行するたびに、Get-Credential コマンド (Windows PowerShell でコマンドレットと呼ばれている) は、ドメイン、ユーザー名、およびパスワードを入力するように要求します。

############################################################################
## Get-RegularProjectList
## Uses the PSI to get a ProjectDataSet.Project table that includes 
## regular projects (not templates or proposals).
## The script user must have Project Server administrator permissions for the 
## ReadProjectList method.
## To run on your Project Server computer, change the $pwaUrl value.
#############################################################################
 
$pwaUrl = "https://ServerName/ProjectServerName"
$svcProjectUrl = $pwaUrl + "/_vti_bin/PSI/Project.asmx?wsdl"

$c = Get-Credential

# Create a proxy for the Project web service, from the ASMX interface.
$svcProjectProxy = New-WebServiceProxy -uri $svcProjectUrl -credential $c

$svcProjectProxy.ReadProjectList().Project | Where-Object { $_.PROJ_TYPE -eq 0 } `
    | Out-GridView –title "List of Regular Projects"

前のコードでは、ReadProjectList メソッドは、Project テーブルにある PROJ_UID、PROJ_NAME、および PROJ_TYPE の各フィールドの値と共に ProjectDataSet を返します。図 5 は、Windows PowerShell の Out-GridView コマンドレット (ogv のように省略可能) によって作成されるグリッド ビューの出力を示しています。グリッド ビューでは値をフィルター処理できます。

図 5. Windows PowerShell からの出力のグリッド ビューで値をフィルター処理

Windows PowerShell でのグリッド ビューの使用

Project 2010 SDK では、いくつかのトピックでカスタム ソリューションの展開などの管理作業に Windows PowerShell を使用する方法を説明しています。たとえば、「[方法] Project Server ワークフローを展開する」と「[方法] PWA のリボンを変更する」を参照してください。また、「SetDatabaseTimeout」の管理スクリプトの例も参照してください。TechNet には、SharePoint と Project Server 向けの Windows PowerShell コマンドレットに関するリファレンスがあります。「Windows PowerShell for Project Server 2010」を参照してください。

前のコード例では、スクリプトと既存の Windows PowerShell コマンドレットを一緒に使用して、簡単に PSI にアクセスし、Project Server のデータを読み取ることができることを示していますが、次のような制限があります。毎回資格情報を入力する必要があることに加えて、リモート コンピューターでスクリプトを使用しにくく、Project Server エンティティを作成または更新するジョブ、あるいは複数の PSI サービスを必要とするジョブに対するスクリプトが複雑になります。また、Microsoft.Office.Project.Server.Library 名前空間で列挙とフィールドではなくハードコードされた値を使用し、デバッグしにくく、IntelliSense がありません。より高度な Windows PowerShell 機能が必要な場合は、WCF インターフェイスを経由して PSI にアクセスするカスタム コマンドレットを作成することをお勧めします。詳細については、「Microsoft Project 2010: Powershell Cmdlets for Project Server PSI (英語)」の MSDN Code Gallery ダウンロードを参照してください。

Project Server 2010 のイベント

すべての Project Server 2010 ビジネス エンティティ (プロジェクト、タスク、割り当て、ユーザー設定フィールド、タイムシートなど) にはイベントが格納されています。Project Server では、220 を超えるイベントを実装しており、プリイベントとポストイベントの両方があります。プリイベントは、Project Server がデータをデータベースに保存する前に発生します。プリイベントのイベント ハンドラーは操作を取り消すことができます。このハンドラーは同期モードです。つまり、プリイベントを使用するアプリケーションは、イベント ハンドラーが終了するまで再開できません。ポストイベントは取り消すことができず (データは既に保存されているため)、非同期モードまたは同期モードで使用できます。アプリケーションは、Project Publishing プリイベント、Project Published ポストイベントなどのイベントを購読して、1 つ以上の関連するイベント ハンドラーを実行できます。Project Web App でイベント ハンドラーを登録すると、1 つのイベントに対して Project Server が実行する複数のイベント ハンドラーの順序を指定できます。

開発者は、プリイベントを使用して、制約、ユーザー設定データの入力規則、またはビジネス ルール チェックを追加できます。たとえば、企業のプロジェクト マネジメント オフィス (PMO) は、特定のプロジェクトに関するすべてのエンタープライズ プロジェクトのテキスト型ユーザー設定フィールドに 2 文字のプレフィックスを使用するように要求することがあります。CustomField Changing プリイベント ハンドラーはこのようなビジネス ルールを実装できます。

ポストイベントは、Project Server と会計システムのような LOB アプリケーションを統合する主な方法です。たとえば、Submitting、Submitted、Recalling、Recalled など、14 個の TimeSheet イベントがあります。Submitting イベントと Recalling イベントはプリイベントです。タイムシートがデータベースに送信される前に組織のビジネス ルールをチェックし、ルールを満たしていない場合は送信を取り消すイベント ハンドラーを作成できます。Submitted イベントと Recalled イベントはポストイベントです。プロジェクト マネージャーがタイムシート データを送信した後、Timesheet Submitted ポストイベント ハンドラーは週次データを会計システムに送信できます。

Project Server イベント ハンドラーのクラスを作成するときは、Microsoft.Office.Project.Server.Events.dll アセンブリのイベント レシーバー基本クラスから継承します。イベント レシーバーのクラスには ProjectEventReceiver、CustomFieldsEventReceiver などがあります。1 つのイベント ハンドラー クラスに 1 つ以上のイベント ハンドラー メソッドを作成できます。たとえば、CustomFieldsEvents クラスに OnCreating メソッドと OnCreated メソッドを追加できます。次のコードには、複数のイベント ハンドラーを持つ 2 つのイベント レシーバー クラスが記述されています。

using System;
using System.Diagnostics;
using System.Data;
using System.Xml;
using Microsoft.Office.Project.Server.Events;
using PSLibrary = Microsoft.Office.Project.Server.Library;

namespace TestEventHandlers
{
    public class ProjectEvents : ProjectEventReceiver
    {
        public override void OnPublishing(
            PSLibrary.PSContextInfo contextInfo, 
            ProjectPrePublishEventArgs e)
        {
            . . .
        }
    }
    public class CustomFieldsEvents : CustomFieldsEventReceiver
    {
        public override void OnCreating(
            PSLibrary.PSContextInfo contextInfo, 
            CustomFieldsPreEventArgs e)
        {
            . . .
        }

        public override void OnCreated(
            PSLibrary.PSContextInfo contextInfo, 
            CustomFieldsPostEventArgs e)
        {
            . . .
        }
    }
}

イベント ハンドラーのメソッドは、ユーザー名と GUID、言語、Project Web App サイトの GUID など、コンテキス情報を含んでいます。プリイベント e パラメーター (イベント引数) は、Cancel プロパティとエンティティまたはイベントに関するその他の情報を含んでいます。たとえば、プロジェクトの OnPublishing イベント ハンドラーの ProjectPrePublishEventArgs は、プロジェクト名、GUID、およびプロジェクト サイトの SharePoint サイト URL を含んでいます。ポストイベントのイベント引数パラメーターは Cancel プロパティを含んでいません。

PSI アプリケーション用のすべての Project Server イベントの一覧については、PSI のマネージ コード リファレンスの「PSEventID」を参照してください。たとえば、ProjectCreating プリイベントの OnCreating イベント ハンドラーについては、「[方法] Project Server のイベント ハンドラーを作成し、イベントをログに記録する」を参照してください。

イベント ハンドラーでのデータセットの使用

多くの Project Server イベントは、PSI メソッドと直接関係しています。たとえば、QueueCreateProject メソッドは Creating プリイベントと Created ポストイベントを発生させます。プリイベント ハンドラーまたはポストイベント ハンドラーのイベント引数パラメーター (e) には、関連する PSI メソッドが DataSet オブジェクトを使用する場合はエンティティの DataSet を追加できます。たとえば、CustomFieldsCreated ポストイベントの OnCreated イベント ハンドラーのイベント引数パラメーターは、CustomFieldDataSet 型の CustomFieldsPostEventArgs.CustomFieldInformation を含んでいます。

注意

イベント ハンドラーで DataSet オブジェクトを使用するには、Microsoft.Office.Project.Schema.dll アセンブリへの参照を設定する必要があります。Microsoft.Office.Project.Server.Schema 名前空間には、CustomFieldDataSet など、必要なクラス定義が格納されています。

以下のコマンドを使用して [Windows]\assembly\GAC_MSIL\Microsoft.Office.Project.Schema\14.0.0.0__71e9bce111e9429c ディレクトリからスキーマ アセンブリをコピーできます。管理者としてコマンド プロンプト ウィンドウを実行し、[Windows] プレースホルダーをお使いのコンピューターに合わせて変更します。

set SCHEMA= [Windows]\assembly\GAC_MSIL\Microsoft.Office.Project.Schema\14.0.0.0__71e9bce111e9429c
xcopy /y %SCHEMA%\*.dll .

以下のコードは、ユーザー設定フィールド Created イベントのイベント引数で、CustomFieldInformation を使用する簡単なポストイベント ハンドラーを示しています。たとえば、ステートメント string cfName = customFieldDs.CustomFields[0].MD_PROP_NAME によってユーザー設定フィールドの名前を取得できます。customFieldDs は Microsoft.Office.Project.Server.Schema.CustomFieldDataSet 型です。CustomFields は e.CustomFieldInformation に含まれる CustomFieldsDataTable オブジェクトです。それ自体は CustomFieldDataSet 型です。ユーザー設定フィールドのテーブルには 1 行 (CustomFields[0]) しかなく、この行には作成したばかりのユーザー設定フィールドのデータが格納されます。ユーザー設定フィールド行のプロパティの一覧については、「CustomFieldDataSet.CustomFieldsRow」を参照してください。

using System;
using System.Diagnostics;
using Microsoft.Office.Project.Server.Events;
using PSLibrary = Microsoft.Office.Project.Server.Library;
using PSSchema = Microsoft.Office.Project.Server.Schema;

namespace TestCreatedCustomField
{
    public class WriteCustomFieldCreatedEvent : CustomFieldsEventReceiver
    {
        public override void OnCreated(
            PSLibrary.PSContextInfo contextInfo,
            CustomFieldsPostEventArgs e)
        {
            // Create an event log instance and assign its source.
            EventLog myLog = new EventLog();
            myLog.Source = "Custom Field OnCreated Event Handler";

            // Get information from the event arguments. 
            string userName = contextInfo.UserName.ToString();

            PSSchema.CustomFieldDataSet customFieldDs = e.CustomFieldInformation;

            string cfName = customFieldDs.CustomFields[0].MD_PROP_NAME;
            byte cfTypeEnum = customFieldDs.CustomFields[0].MD_PROP_TYPE_ENUM;
            Guid cfUid = customFieldDs.CustomFields[0].MD_PROP_UID;

            string[] cfTypes = Enum.GetNames(typeof(PSLibrary.CustomField.Type));

            string cfType = "";
            int index = 0;

            // Find the name of the custom field type.
            foreach (int i in Enum.GetValues(typeof(PSLibrary.CustomField.Type)))
            {
                if (i == Convert.ToInt32(cfTypeEnum))
                {
                    cfType = cfTypes[index];
                    break;
                }
                index++;
            }

            // Write an entry to the Application event log.
            int eventId = 3652;  // Create an arbitrary event ID.
            string logEntry;

            logEntry = "User: " + userName +
                "\nCustom Field Name: " + cfName +
                "\nGUID: " + cfUid.ToString() +
                "\nType: " + cfType +
                "\nThe custom field has been created.";

            myLog.WriteEntry(logEntry, EventLogEntryType.Information, eventId);
        }
    }
}

イベント ハンドラーをコンパイルしてインストールし、そのイベント ハンドラーを Project Web App に登録した後で Duration 型の Test Res Duration という名前のリソース ユーザー設定フィールドを作成した場合、Project Server コンピューターの [イベント ビューアー] でApplication イベントを確認できます (図 6)。参照をコピーするスクリプトおよびイベント ハンドラーをインストールするスクリプトを含む、TestCreatedCustomField 例の完全な Visual Studio ソリューションは、Project 2010 SDK ダウンロードの Samples\EventHandlers\TestCreatedCustomField ディレクトリにあります。

図 6. イベント ビューアーを使用したイベント ハンドラーのプロパティの表示

イベント ビューアーとイベント ハンドラーの併用

イベント ハンドラーのデータセットは読み取り専用です。たとえば、OnCreating プリイベント ハンドラー内のユーザー設定フィールドの名前を変更するために CustomFieldDataSet を変更できません。ただし、イベントをトラップし、必要なプロパティを取得し、ユーザー設定フィールドの作成を取り消し、CustomFields サービスに対する WCF エンドポイントをプログラムによって構成した後に、CustomFields Web サービスで CreateCustomFields メソッドを使用して正しい名前のユーザー設定フィールドを作成できます。

一般的な情報については、Project 2007 SDK の「Project Server イベント」を参照してください。イベント ハンドラーを登録する手順と ULS ログに書き込む手順が記載された例については、「[方法] Project Server のイベント ハンドラーを作成し、イベントをログに記録する」を参照してください。その他の例については、「[方法] 電子メールを Project Server の通知用にカスタマイズする」を参照してください。この記事では、電子メールによる通知に OnSending イベント ハンドラーを使用しています。また、「プロジェクトのサーバー 2010 年委任監査イベント ハンドラー (英語)」も参照してください。この記事では、ユーザーの委任に OnActivated と OnDeactivated イベント ハンドラーを使用しています。

Project 2010 での EPM レポート

Project Professional 2010 と Project Standard 2010 デスクトップ クライアントには、Microsoft Visio 2010 と Microsoft Office Excel 2007 または Excel 2010 を使用できるビジュアル レポート機能が備わっています。ビジュアル レポートでは、ローカルの Project ファイルからグラフィカル レポートとピボットテーブル レポートを作成できます。サーバー側では、EPM レポートのプラットフォームが Project Server 2010 で大幅に更新され、Microsoft Business Intelligence (BI) フレームワークがサポートされるようになりました。SharePoint Server 2010 のビジネス インテリジェンス センターがカスタマイズされ、Project Web App に組み込まれています。ビジネス インテリジェンス センターの目的は、Project Web App にアクセスできるすべての従業員が関連するビジネスの可視性と分析をタイミングよく取得できるようにすることです。

Project Server のレポート インフラストラクチャは、レポート データベース (RDB)、Report Data Service (RDS)、およびキューブ作成サービス (CBS) で構成されます。詳細については、Project チームのブログ (英語) (https://blogs.msdn.com/project/) とその他の Project ブログ、Project のエンド ユーザー向けドキュメント、および TechNet で、「ビジュアル レポート」または「レポート」を検索してください。たとえば、「Business Intelligence in Project Server 2010 (英語)」、「Project 2010: Business Intelligence Overview (英語)」、「Reporting on projects (Project Server 2010)」などを参照してください。Project 2010 SDK では、「キューブ作成サービス」と「ユーザー設定フィールドとレポート データベース」を参照してください。

Project Server レポートを始める場合は、Project 2010 向けの「Train & Learn (英語)」ページでレポートに関するビデオをご覧ください。

レポート データベースと Report Data Service

既定のレポート データベース (RDB) テーブルとビューは、プロジェクトのデータからレポートを生成するために読み取り専用になるように設計されています。Project Server 2010 レポート データベース スキーマ リファレンスは Project 2010 SDK ダウンロードに収録されています。RDB スキーマは、主に次の 3 つの部分で構成されています。

  • EPM データ (プロジェクト、タスク、リソース、割り当て、ユーザー設定フィールドなど)

  • タイムシート データ

  • グループ作業データ (プロジェクト サイトの懸案事項、リスク、および成果物)

Report Data Service (RDS) は、発行済みデータベースで変更が行われてからほぼリアルタイムで (数分以内に) RDB を更新します。RDB テーブルは、Microsoft SQL Server Reporting Services (SSRS) を使用して比較的簡単にレポートを作成できるように非正規化されています。

RDS はキューを使用して RDB への更新を処理し、複数のサーバーからのマルチスレッドの更新操作を管理できます。ユーザーは、ほとんどの場合、変更後のデータが RDB からレポートに到着する前にそのデータを Project Web App で確認できます。RDS にはデータ更新用のポストイベントが用意されているので、レポート キャッシュを管理し、必要なデータが到着した後にレポートを更新できます。

RDB のビューには、OLAP に合わせて設計されたビューと、RDB から直接レポートを作成しているユーザー向けのビューがあります。たとえば、リソース データは MSP_EpmResource_OlapView と MSP_EpmResource_UserView で表示できます。OLAP ビューは、OLAP キューブを生成するときにキューブ作成サービスによって使用できるように設計されています。一般的に、ユーザー ビューのフィールド数は OLAP ビューより多く、レポートを生成できるように設計されています。「Project Server Report Pack」のサンプル クエリではテーブルとユーザー ビューを使用しています。Office Project 2007 SDK ダウンロードには、7 個のサンプル SSRS レポートを含んだレポート パックがあります。MSDN Code Gallery には、レポート パックの更新版があります。「Project Server 2007 Report Pack II—"The Top Reports" (英語)」を参照してください。

注意

Office Project Server 2007 向けのレポート パックのサンプルの一部は、2007 年に出荷されたデモ用の仮想マシン向けに作成された特定のユーザー設定フィールドと参照テーブルに依存しています。いくつかのレポート パックのサンプルでは、廃止されたまたは Project Server 2010 で使用されていない Project Server の機能を使用しています。レポート パックのサンプルは、Project Server 2010 で新しいレポートを作成するための第一歩として使用できます。

外部データを含むテーブルとビューを RDB に追加し、RDS を使用してカスタム テーブルとビューの更新を管理できます。たとえば、「Project Server 2010 Delegation Audit Event Handler (英語)」の MSDN Code Gallery サンプルでは、PS2010_UserDelegationAudit テーブルを RDB に作成します。

キューブ作成サービス

キューブ作成サービス (CBS) は、Project Server と関連する SharePoint のデータから複数の OLAP キューブを作成します。Project Web App は、SQL Server Analysis Services キューブを管理するのに役立ち、キューブのカスタマイズをサポートしています。また、OLAP キューブまたは RDB を使用する Reporting Services レポートを一元的に格納する場所が用意されています。Project Web App では、エンタープライズ ユーザー設定フィールドを新しいディメンションまたはメジャーとして追加したり、計算済みのメジャーをキューブに追加したりできます。

Project Web App での管理に加えて、CBS には豊富なイベントと ULS ログ用のトレース ログが用意されています。PSI CubeAdmin Web サービスによって、キューブ作成のプログラムによる管理とスケジュールを実行できます。Project Server 2010 の OLAP データベースには 14 個の既定のキューブがあります。詳細については、「キューブ作成サービス」を参照してください。

増分データ変更を使用して既定の OLAP キューブを作成し、更新の頻度を増やして更新の期間を短くすることができます。キューブ データのビューは、ダッシュボードと Web パーツで表示できます。Project Server と外部のデータを組み合わせる追加のビューとカスタム Web パーツを作成できます。たとえば、ピボットテーブル レポートと条件付き書式と一緒に Excel 2010 を使用できます。Excel ブックまたはスプレッドシートを Excel Services に発行して任意の SharePoint サイトで Web ブラウザー用レンダリングを実行できます。

Project Web App のビジネス インテリジェンス センター ページには、豊富なグループ作業機能が用意されています。チームのメンバーは、データの傾向を監視する主要業績評価指標 (KPI) を簡単に作成したり、ビジュアル レポートのデータが格納された Excel ブックを Excel Services 経由で SharePoint に発行するとそのブックを表示したりできるようになります。管理者または開発者は、ビジネス インテリジェンス センターでスコアカード要素、ビュー、およびロールを作成したり、Project Server データの更新を Microsoft SharePoint Server 2010 の PerformancePoint Services に発行したり、PerformancePoint のコンテンツを表示したりできます。

ポートフォリオ分析キューブを拡張する方法を示している例については、「[方法] OLAP キューブでリソース利用可能時間を計算する」を参照してください。ユーザー設定フィールドをディメンションまたはメジャーとしてキューブに追加する方法については、「ユーザー設定フィールドと OLAP キューブ」を参照してください。

Project Server 2010 でのエラーの確認

Project Server 向けのソリューションを開発しているとき、2 つの主要領域で構成エラーと実行時エラーを確認できます。その領域とは、アプリケーション イベント ログと統合ログ サービス (ULS) のトレース ログです。また、PSI メソッドを呼び出すコードに try-catch ブロックを使用することもお勧めします。WCF および ASMX ベースのアプリケーションのエラーおよび例外を処理するサンプル コードの詳細については、「Project Server エラー コード」を参照してください。

アプリケーション イベント ログ   Project Server コンピューターの [スタート] メニューで [ファイル名を指定して実行] をクリックし、「eventvwr」と入力します。[イベント ビューアー] ウィンドウの左側のウィンドウで、[Windows ログ] ノード、[アプリケーション] の順にクリックすると、Project Server、SharePoint、ASP.NET、SQL Server、カスタム イベント ハンドラー、およびその他のアプリケーションによってログに記録されたイベントが表示されます (図 6 を参照してください)。イベントをソース別に並べ替えると、Project Server のイベントを簡単に見つけることができます。ソースには ProjectQueueService14ProjectEventService14 があります。

ULS ログ   ULS トレース ログとイベント ログには、アプリケーション イベント ログよりも詳しい情報が記録されています。Project Server と SharePoint の特定のカテゴリのアクティビティまたはすべてのカテゴリとレベルのアクティビティを記録するように ULS トレース ログを構成できます。トレース ログを表示するには、メモ帳などのテキスト エディターまたは Microsoft Excel を使用できます。ULS ログの表示と監視、イベントのフィルター処理、および ULS ログ サンプルの保存を行うには、MSDN Code Gallery から ULS ビューアー (英語)をダウンロードしてインストールします。ULS ビューアーはサポートされていないアプリケーションです。ULS ビューアーを使用する方法を示している例については、「[方法] Project Server のイベント ハンドラーを作成し、イベントをログに記録する」を参照してください。

Project Server の ULS ログとその他のタイマー ジョブを構成するには

  1. SharePoint 2010 の全体管理アプリケーションを開き、[監視] をクリックし、[監視] ページの [タイマー ジョブ] セクションの [ジョブ定義の確認] をクリックします。

  2. [診断データ プロバイダー: トレース ログ] をクリックし、[タイマー ジョブの編集] ページで、タイマー ジョブが 10 分ごとに実行されるように設定します。[診断データ プロバイダー: イベント ログ] も同様に構成できます。たとえば、SharePoint アプリケーションに関連するパフォーマンス カウンターと SQL クエリに対して 5 つの追加の診断データ プロバイダー タイマー ジョブを設定できます。

  3. また、Project Server Service アプリケーションには、[ジョブの定義] ページで構成できる 4 つの設定があります。これらの設定では、SharePoint タイマーが Project Web App 用のその他のジョブを実行する頻度を制御します。

  4. SharePoint 2010 サーバーの全体管理の [監視] ページで、[レポート] セクションの [診断ログの構成] をクリックします。[診断ログ] ページで [Project Server] カテゴリを展開し、[サーバー側のイベント] などの特定のカテゴリを選択します。最上位の [Project Server] ノードを選択した場合、39 個すべての Project Server カテゴリがログに記録されます。

  5. 最大の情報を得るために、イベント ログとトレース ログの記録対象となる重要度の最も低いイベントについて [詳細] を選択します。イベント ログとトレース ログのサイズは大きくなる可能性があるので、詳細ログは必要な場合にだけ実行します。

    注意

    運用サーバーでイベントをログに記録している場合は、ログを管理可能なサイズで維持するために特定のカテゴリだけを選択します。すべてのログを無効にするには、各ログの重要度の最も低いイベントについて [なし] を選択します。比較的少数のイベントを記録するには、トレース ログについて [] または [モニター可能] を選択します。[原因不明] レベルでは、通常、アプリケーションの例外が示されます。イベント ログについてログに記録するイベントの数を少なくするには、[エラー] または [重大] を選択します。

    既定では [イベント ログのオーバーフロー防止機能を有効にする] 設定は選択されています。トレース ログの既定のパスは、%CommonProgramFiles%\Microsoft Shared\Web Server Extensions\14\LOGS です。ULS ビューアーを使用する場合は、既定のパスでトレース ログを開くか、別のパスを設定できます。

  6. トレース ログ ファイルを保存する最大日数を設定します。既定値は 14 日です。トレース ログのディスク領域を制限することもできます。

ULS は新しいトレース ログ ファイルを 30 分ごとに作成します。トレース ログ ファイルでは、SERVERNAME-20110208-1326.log のようにファイル名に日付と時刻が入っています。

まとめ

Project Server 2010 は、最新のプログラミングとソフトウェアのコラボレーション フレームワークである .NET Framework と SharePoint Server に基づいて構築されたプラットフォームです。このフレームワークは、これから長い年月にわたり、Microsoft Project をはじめとする Microsoft ソフトウェア プログラムの基盤となるものです。Project Server プラットフォームにより、拡張機能の開発とさまざまなその他のアプリケーションとの統合が簡単になります。

Project Server Interface (PSI) と関連するデータセットにより、3 つの Project Server のコア データベース (下書き、発行済み、およびアーカイブ) に直接アクセスする必要がなくなります。Project Server のイベントは、Project Server を拡張し、LOB アプリケーションと統合する鍵となります。イベント ハンドラーはワークフローを開始でき、ワークフローは PSI を呼び出すことができます。また、別のイベント ハンドラーは、ワークフローのプロジェクト詳細ページにメッセージを送信できます。

Project Server レポートと OLAP キューブは、拡張性のある Project プラットフォームの一部で、お客様とパートナーは、組織でのプロジェクト管理、コミュニケーション、およびビジネス上の意思決定を向上する数多くの機会を得ることができます。

その他の技術情報

詳細については、次のリソースを参照してください。