次の方法で共有


Project.QueueUpdateProject メソッド

チェック アウトされているプロジェクト内のエンティティを更新します。追加、変更、またはユーザー設定フィールドの値を削除します。

名前空間:  WebSvcProject
アセンブリ:  ProjectServerServices (ProjectServerServices.dll 内)

構文

'宣言
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/QueueUpdateProject", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Project/",  _
    ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Project/",  _
    Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Sub QueueUpdateProject ( _
    jobUid As Guid, _
    sessionUid As Guid, _
    dataset As ProjectDataSet, _
    validateOnly As Boolean _
)
'使用
Dim instance As Project
Dim jobUid As Guid
Dim sessionUid As Guid
Dim dataset As ProjectDataSet
Dim validateOnly As Boolean

instance.QueueUpdateProject(jobUid, sessionUid, _
    dataset, validateOnly)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/QueueUpdateProject", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Project/", 
    ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Project/", 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public void QueueUpdateProject(
    Guid jobUid,
    Guid sessionUid,
    ProjectDataSet dataset,
    bool validateOnly
)

パラメーター

  • jobUid
    型: System.Guid

    キュー ジョブの GUID。

  • sessionUid
    型: System.Guid

    キュー ジョブを送信するセッションの GUID を指定します。

  • validateOnly
    型: System.Boolean

    true、のみ、入力データを検証して、アクションは実行されません。

注釈

QueueUpdateProjectは作成またはプロジェクト エンティティを削除します。これは、タスク、割り当て、およびプロジェクト リソースなどの既存のエンティティを変更します。QueueUpdateProjectことができますも追加、変更、またはプロジェクトでは、ユーザー設定フィールドの値を削除ができません作成または自体を使用するCreateCustomFields ( DeleteCustomFields) のユーザー設定フィールドを削除します。QueueUpdateProjectは、Project Server キュー サービスにメッセージを送信する非同期メソッドです。

QueueUpdateProjectなど、 Projectクラスのメソッドは作成、編集、またはコスト単価型リソースを削除します。datasetパラメーターには、 ProjectDataSetにはコスト単価型リソースが含まれています、1050年ProjectCannotEditCostResourceエラーが返されます。CreateResourcesメソッドを使用するには、コスト単価型リソースを作成するのには、 Resourceクラスのメソッドでは編集できません。詳細については、 PSI が行うこと、行わないことを参照してください。

注意

作成または、プロジェクトを更新すると同時に、PSI を最大 1000年行のデータ処理できます。ProjectDataSetのすべてのテーブルの新しいまたは更新されたデータ行の合計数が 1000年を超える場合、PSI は、 ProjectExceededItemsLimitエラーを返します。

作成時に、 ProjectDataSet.TaskRowTASK_DUR_FMTを指定する必要があります。それ以外の場合は、Project Professional でプロジェクトの後で使用する、データの損失などの予期しない動作があります。

ProjectDataSet.ProjectResourceRowで、エンタープライズ リソースのプロパティに加えた変更は、次に Project Professional から Project Server のデータを更新するときに失われます。

ProjectDataSetのタスクを変更すると、 TASK_WBSプロパティを設定しません。PSI で読み書き可能としてマークされているが、 TASK_WBSのプロパティは読み取り専用です。TASK_WBSプロパティに指定した値にタスクを追加する場合は、Project Professional、PSI から設定された値は無視され、プロジェクトを開いたときに、タスク アウトライン位置に従って値が割り当てられます。Project Professional では、結果を表示するには、 WBS コード値には、[タスク情報] ダイアログ ボックスの [詳細設定] タブを確認します。

QueueUpdateProjectは、実際のタスクをnull 参照 (Visual Basic のNothing )タスクを変更できません。たとえば、Project Professional を使用してタスクを作成するし、一部のタスクの間で 1 つまたは複数の空白行のままに空の行はnull 参照 (Visual Basic のNothing )のタスクです。

TASK_IS_ACTIVE プロパティを変更します。

プロジェクト サーバーのスケジュール エンジンは矛盾の開始または終了時刻は、タスクの現在のステータスを変更するには、 QueueUpdateProjectメソッドを使用すると、 datasetパラメーターには、 ProjectDataSetオブジェクトの複数の変更がある場合できます。TASK_IS_ACTIVEプロパティは、 datasetパラメーターでのみ変更が場合、は、プロジェクトを更新できます。

詳細については、 Project Server プログラミングの [サーバー] セクションで、プロジェクトのスケジュールを参照してください。

TASK_OUTLINE_LEVEL プロパティを変更します。

場合は、 TASK_OUTLINE_LEVELを変更しようとすると、Project Server キュー サービスから、 ProjectSchedulingEngineExceptionのエラーを取得できます。エラーの内容にはexception="Microsoft.Office.Project.Scheduling.SchedulingCycleException: Cycle detected … をが含まれます。プロジェクトのサーバーのスケジュール エンジンは、 TASK_OUTLINE_LEVELを変更または開始-終了 (SF) リンクを含むタスクをサマリー タスクに変更、一括編集を処理しません。この問題を回避は、Project Server キューのチェックおよび、 QueueStatusDataSet.Statusテーブル内の特定の値を処理することです。次の例では、ProjTool アプリケーションでは、 WaitForQueueJobCompletionメソッドを変更する ( Using the ProjTool Test Applicationを参照してください)。変更は、 ReadJobStatus 、 QueueSystemの web サービスを使用しは、適切なメッセージを示しています。

SvcQueueSystem.QueueStatusDataSet queueStatusDataSet = 
    new SvcQueueSystem.QueueStatusDataSet();
. . .
queueStatusDataSet = queueSystem.ReadJobStatus(queueStatusRequestDataSet, false,
    SvcQueueSystem.SortColumn.Undefined, SvcQueueSystem.SortOrder.Undefined);

foreach (SvcQueueSystem.QueueStatusDataSet.StatusRow statusRow in queueStatusDataSet.Status)
{
    if ((statusRow["ErrorInfo"] != System.DBNull.Value 
        && checkStatusRowHasError(statusRow["ErrorInfo"].ToString()) == true) 
        || statusRow.JobCompletionState == blockedState 
        || statusRow.JobCompletionState == failedState)
    {
        if (statusRow.ErrorInfo.Contains("SchedulingCycleException"))
        {
            string schedulingError = 
                "The Project Server Queue reported an error in the scheduling engine.\n";
            scheculingError += "The scheduling engine cannot change the TASK_OUTLINE_LEVEL\n";
            schedulingError += "or change a task with a Start-to-Finish (SF) link into a summary task.\n";
            schedulingError += "Use Project Professional to make those types of changes.";
            MessageBox.Show(schedulingError, "Queue Error", 
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
        else
        {
            MessageBox.Show(AppendErrorString(statusRow.ErrorInfo), "Queue Error" , 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    . . .
}

ユーザー設定フィールドの値を削除します。

プロジェクトからユーザー設定フィールドの値を削除するには、 QueueDeleteFromProjectの代わりにQueueUpdateProjectを使用します。ユーザー設定フィールドの値を削除する正しい方法は、 ProjectDataSetを取得、設定、ユーザー設定フィールドのDataRowのRowStateプロパティには、 Deleted、および変更のProjectDataSetを使用してプロジェクトを更新するには。DataRowにDeletedを設定するには値をnull 参照 (Visual Basic のNothing )に設定するのではなく、row オブジェクトのDeleteメソッドを呼び出します。

テスト アプリケーションで、次のサンプル コードを使用するには、タイプのtextのタスク ユーザー設定フィールドを作成して、1 つのタスクを持つプロジェクトを作成し。[タスクのプロパティ、ユーザー設定フィールドに値を割り当てるし、プロジェクトとタスクのユーザー設定フィールドの GUID 値を検索し。を Project Server のテスト環境で使用している場合は、 PROJ_UIDのプロジェクトを簡単に検索する ProjTool を使用できます。ProjTool でプロジェクトを選択、プロジェクトの詳細を読み、をクリックして、 CUSTOM_FIELD_UIDを検索するには、 TaskCustomFieldsタブをクリックします。ProjTool の詳細については、 Using the ProjTool Test Applicationを参照してください。

// Sample project and task custom field GUIDs:
Guid projectId = new Guid("B6064244-101A-4139-A2F8-697620458AAE");
Guid taskCustomFieldId = new Guid("a3549fbc-b49c-42c9-9c56-ba045e438d94");

Guid sessionId = Guid.NewGuid();
Guid jobId = Guid.NewGuid();

WebSvcProject.ProjectDataSet dsProject = 
    project.ReadProject(projectId, WebSvcProject.DataStoreEnum.WorkingStore);

// Do not use QueueDeleteFromProject to delete a custom field.
// Guid[] taskCustomFields = { taskCustomFieldId };
// project.QueueDeleteFromProject(jobId, sessionId, projectId, taskCustomFields);

bool deleteCF = false;

foreach (WebSvcProject.ProjectDataSet.TaskCustomFieldsRow taskCFRow in dsProject.TaskCustomFields)
{
    if ((Guid)taskCFRow[dsProject.TaskCustomFields.CUSTOM_FIELD_UIDColumn] == taskCustomFieldId)
    {
        // Set the rowstate to be deleted.
        taskCFRow.Delete();
        deleteCF = true;
        break;
    }
}
if (deleteCF)
{
    project.CheckOutProject(projectId, sessionId, "Test checkout");
    bool validateOnly = false;
    project.QueueUpdateProject(jobId, sessionId, dsProject, validateOnly);

    // Wait approximately four seconds for the queue to finish.
    // Or, add a routine that checks the QueueSystem for job completion.
    System.Threading.Thread.Sleep(4000);

    sessionId = Guid.NewGuid();
    jobId = Guid.NewGuid();
    bool force = false;
    string sessionDescription = "Removed task custom field " + taskCustomFieldId.ToString();
    project.QueueCheckInProject(jobId, projectId, force, sessionId, sessionDescription);

    // Wait approximately four seconds for queue to finish.
    // Or, use a routine that checks the QueueSystem for job completion.
    System.Threading.Thread.Sleep(4000);
}

プロジェクト サーバーのアクセス許可

権限

説明

SaveProject

指定したプロジェクトを保存することができます。カテゴリのアクセス権。

SaveProjectTemplate

作成し、プロジェクトをエンタープライズ プロジェクト テンプレートとして保存することができます。

次の使用例は、サンプル プロジェクトの作成、チェック アウト、タスク名を変更、更新プログラムを保存し、プロジェクトを確認し、再度します。

このコード サンプルを実行する重要な情報は、 Project 2013 での ASMX ベースのコード サンプルの前提条件を参照してください。

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

namespace Microsoft.SDK.Project.Samples.QueueUpdateProject
{
   class Program
   {
      [STAThread]
      static void Main()
      {
         try
         {
            #region Setup
            const string PROJECT_SERVER_URI = "https://ServerName/ProjectServerName/";
            const string PROJECT_SERVICE_PATH = "_vti_bin/psi/project.asmx";
            const string QUEUESYSTEM_SERVICE_PATH = "_vti_bin/psi/queuesystem.asmx";
            const string SESSION_DESC = "Sample utility";

            Guid sessionId = Guid.NewGuid();
            Guid jobId;

            // Set up the web service objects.
            SvcProject.Project projectSvc = new SvcProject.Project();

            projectSvc.Url = PROJECT_SERVER_URI + PROJECT_SERVICE_PATH;
            projectSvc.Credentials = CredentialCache.DefaultCredentials;
            
            SvcQueueSystem.QueueSystem q = new SvcQueueSystem.QueueSystem();
            q.Url = PROJECT_SERVER_URI + QUEUESYSTEM_SERVICE_PATH;
            q.Credentials = CredentialCache.DefaultCredentials;
            
            // Create the sample project.
            Console.WriteLine("Creating sample project");
            Guid projectId = CreateSampleProject(projectSvc, q);
            
            // Read the project that you want.
            Console.WriteLine("Reading project from database");

            SvcProject.ProjectDataSet projectDs = projectSvc.ReadProject(projectId, SvcProject.DataStoreEnum.WorkingStore);
            #endregion
            #region Change task name and update
            // Check out the project.
            Console.WriteLine("Checking out project");
            projectSvc.CheckOutProject(projectId, sessionId, SESSION_DESC);

            // Make changes.
            // Note: Task 0 is the summary task, which cannot be changed.
            projectDs.Task[1].TASK_NAME += " Changed";
                        
            // Save the changes.
            Console.WriteLine("Saving changes to the database");
            jobId = Guid.NewGuid();
            projectSvc.QueueUpdateProject(jobId, sessionId, projectDs, false);
            WaitForQueue(q, jobId);
            #endregion
            #region Check in
            // Check in the project. 
            Console.WriteLine("Checking in the project");
            jobId = Guid.NewGuid();
            projectSvc.QueueCheckInProject(jobId, projectId, false, sessionId, SESSION_DESC);
            WaitForQueue(q, jobId);
            #endregion
         }
         #region Exception Handling and Final
         catch (SoapException ex)
         {
            PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex);
            PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
            string errMess = "==============================\r\nError: \r\n";
            for (int i = 0; i < errors.Length; i++)
            {
               errMess += "\n" + ex.Message.ToString() + "\r\n";
               errMess += "".PadRight(30, '=') + "\r\nPSCLientError Output:\r\n \r\n";
               errMess += errors[i].ErrId.ToString() + "\n";

               for (int j = 0; j < errors[i].ErrorAttributes.Length; j++)
               {
                  errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j] + ": " + errors[i].ErrorAttributes[j];
               }
               errMess += "\r\n".PadRight(30, '=');
            }
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(errMess);
         }
         catch (WebException ex)
         {
            string errMess = ex.Message.ToString() +
               "\n\nLog on, or check the Project Server Queuing Service";
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Error: " + errMess);
         }
         catch (Exception ex)
         {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Error: " + ex.Message);
         }
         finally
         {
            Console.ResetColor();
            Console.WriteLine("\r\n\r\nPress any key...");
            Console.ReadKey();
         }
         #endregion
      }
      static private void WaitForQueue(SvcQueueSystem.QueueSystem q, Guid jobId)
      {
         SvcQueueSystem.JobState jobState;
         const int QUEUE_WAIT_TIME = 2; // two seconds
         bool jobDone = false;
         string xmlError = string.Empty;
         int wait = 0;

         // Wait for the project to get through the queue.
         // Get the estimated wait time in seconds.
         wait = q.GetJobWaitTime(jobId);

         // Wait for it.
         Thread.Sleep(wait * 1000);
         // Wait until it is finished.

         do
         {
            // Get the job state.
            jobState = q.GetJobCompletionState(jobId, out xmlError);

            if (jobState == SvcQueueSystem.JobState.Success)
            {
               jobDone = true;
            }
            else
            {
               if (jobState == SvcQueueSystem.JobState.Unknown
               || jobState == SvcQueueSystem.JobState.Failed
               || jobState == SvcQueueSystem.JobState.FailedNotBlocking
               || jobState == SvcQueueSystem.JobState.CorrelationBlocked
               || jobState == SvcQueueSystem.JobState.Canceled)
               {
                  // If the job failed, error out.
                  throw (new ApplicationException("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError));
               }
               else
               {
                  Console.WriteLine("Job State: " + jobState + " for Job ID: " + jobId);
                  Thread.Sleep(QUEUE_WAIT_TIME * 1000);
               }
            }
         }
         while (!jobDone);
      }
      static private Guid CreateSampleProject(SvcProject.Project projectSvc, SvcQueueSystem.QueueSystem q)
      {
         SvcProject.ProjectDataSet projectDs = new SvcProject.ProjectDataSet();
         Guid jobId;
         // Create the project.
         SvcProject.ProjectDataSet.ProjectRow projectRow = projectDs.Project.NewProjectRow();
         projectRow.PROJ_UID = Guid.NewGuid();
         projectRow.PROJ_NAME = "Its a wonderful project at " + 
            DateTime.Now.ToShortDateString().Replace("/", "") + " " + 
            DateTime.Now.ToShortTimeString().Replace(":", "");
         projectRow.PROJ_TYPE = (int)PSLibrary.Project.ProjectType.Project;
         projectDs.Project.AddProjectRow(projectRow);

         // Add some tasks.
         SvcProject.ProjectDataSet.TaskRow taskOne = projectDs.Task.NewTaskRow();
         taskOne.PROJ_UID = projectRow.PROJ_UID;
         taskOne.TASK_UID = Guid.NewGuid();
         // The Task Duration format must be specified.
         taskOne.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;
         taskOne.TASK_DUR = 4800;  // 8 hours in duration units (minute/10)
         taskOne.TASK_NAME = "Task One";
         taskOne.TASK_START_DATE = System.DateTime.Now.AddDays(1);
         projectDs.Task.AddTaskRow(taskOne);

         SvcProject.ProjectDataSet.TaskRow taskTwo = projectDs.Task.NewTaskRow();
         taskTwo.PROJ_UID = projectRow.PROJ_UID;
         taskTwo.TASK_UID = Guid.NewGuid();
         // The Task Duration format must be specified.
         taskTwo.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;
         taskTwo.TASK_DUR = 4800;  // 8 hours in duration units (minute/10)
         taskTwo.TASK_NAME = "Task Two";
         taskTwo.TASK_START_DATE = System.DateTime.Now.AddDays(1);
         projectDs.Task.AddTaskRow(taskTwo);
          
         // Save the project to the database.
         jobId = Guid.NewGuid();
         projectSvc.QueueCreateProject(jobId, projectDs, false);
         WaitForQueue(q, jobId);
         return projectRow.PROJ_UID;
      }
   }
}

関連項目

参照先

Project クラス

Project メンバー

WebSvcProject 名前空間

その他の技術情報

Using the ProjTool Test Application