Поделиться через


Метод 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.

Методы класса Project , такие как QueueUpdateProject, невозможно создание, изменение и удаление ресурсов. Если ProjectDataSet с помощью параметра dataset включает в себя стоимость ресурса, метод возвращает ошибку ProjectCannotEditCostResource 1050. Можно использовать метод CreateResources для создания ресурсов, но методы класса Resource не могут изменять их. Для получения дополнительных сведений см What the PSI does and does not do.

Примечание

При создании или обновлении проекта PSI могут быть обработаны до 1000 строк данных, в то же время. Если общее число строк новых или обновленных данных во всех таблицах ProjectDataSet превышает 1000, PSI возвращает ошибку ProjectExceededItemsLimit .

При создании ProjectDataSet.TaskRow, необходимо указать TASK_DUR_FMT. В противном случае последующего использования проекта в Project Professional может привести к непредвиденному поведению, включая возможность потери данных.

Любые изменения свойств корпоративных ресурсов в ProjectDataSet.ProjectResourceRow будут потеряны при последующем Project Professional обновляет данные из Project Server.

При изменении задачи в ProjectDataSetTASK_WBS свойство не задано. Свойство TASK_WBS — только для чтения, несмотря на то, что оно будет помечено как чтение и запись в PSI. При добавлении задачи с установленным свойством TASK_WBS с заданным значением Project Professional игнорирует значение, установленное в PSI и назначает значение в соответствии с позиции структуры задач при открытии проекта. Для просмотра результатов в Project Professional, проверьте значение кода WBS на вкладке Дополнительно диалогового окна Сведения о задаче.

QueueUpdateProject не может изменить пустая ссылка (Nothing в Visual Basic) задач в реальных задачу. Например если создание задачи с помощью Project Professional и оставьте один или несколько пустые строки между некоторые задачи, пустые строки являются пустая ссылка (Nothing в Visual Basic) задачи.

Изменение свойства TASK_IS_ACTIVE

Механизм планирования Project Server можно отобразить несогласованные начала или окончания раз при использовании метода QueueUpdateProject изменение активных состояние задачи, если существует несколько изменений в объекте ProjectDataSet для параметра dataset . Если свойство TASK_IS_ACTIVE является единственным изменений с помощью параметра dataset , можно обновить проект.

Для получения дополнительных сведений см в разделе сервер в Программирование Project Serverпланирования проекта.

Изменение свойства TASK_OUTLINE_LEVEL

При попытке изменить TASK_OUTLINE_LEVEL, вы можете получить ошибку ProjectSchedulingEngineException на службы очередей Project Server. Ошибка входят exception="Microsoft.Office.Project.Scheduling.SchedulingCycleException: Cycle detected … . Механизм планирования Project Server обрабатывает массового изменения, где изменение TASK_OUTLINE_LEVEL или изменить задач со ссылкой на начало-окончание (но) в суммарной задаче. Обходной путь — проверка очередей Project Server и обрабатывать определенное значение в таблице QueueStatusDataSet.Status . В следующем примере изменяется с помощью метода WaitForQueueJobCompletion в приложения ProjTool ( Using the ProjTool Test Applicationсм). Изменение использует ReadJobStatus в веб-службе QueueSystem и отображает соответствующее сообщение.

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);
        }
    . . .
}

Удаление значения настраиваемых полей

Используйте QueueUpdateProject вместо QueueDeleteFromProject для удаления значения настраиваемых полей из проекта. Правильный способ удалить значение настраиваемого поля — для получения ProjectDataSet, присвойте свойству RowState настраиваемого поля DataRow значение Deletedи затем использовать измененные ProjectDataSet для обновления проекта. Чтобы задать DataRowDeleted, вызовите метод Delete на объекте строки, а не значение пустая ссылка (Nothing в Visual Basic).

Для использования в следующем примере кода в тестового приложения, создайте настраиваемое поле типа textзадачи и затем создайте проект с одной задачи. Присвоить значение настраиваемого поля в разделе Свойства задачи и затем найдите значения GUID проекта и настраиваемые поля задач. При работе на установку test Project Server можно использовать ProjTool легко найти PROJ_UID проекта. Выберите проект в ProjTool Чтения сведений о проекте и затем перейдите на вкладку TaskCustomFields для поиска CUSTOM_FIELD_UID. Дополнительные сведения о 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);
}

Разрешения Project Server

Разрешение

Описание

SaveProject

Позволяет пользователю сохранять указанный проект. Разрешение категории.

SaveProjectTemplate

Позволяет пользователю создавать и сохранять как шаблон проекта корпоративного проекта.

Примеры

В следующем примере создается образец проекта, обратно проверок, изменяет имя задачи, сохраняя обновление и затем проверяет проекта.

Важные сведения о запуске в этом примере кода Необходимые условия для образцов кода на основе ASMX в Project 2013см.

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