Project.QueueUpdateProject - Méthode

Met à jour des entités dans un projet sont extraits. Également ajoute, modifie ou supprime les valeurs de champ personnalisé.

Espace de noms :  WebSvcProject
Assembly :  ProjectServerServices (dans ProjectServerServices.dll)

Syntaxe

'Déclaration
<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 _
)
'Utilisation
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
)

Paramètres

  • jobUid
    Type : System.Guid

    Le GUID de la tâche de file d'attente.

  • sessionUid
    Type : System.Guid

    Le GUID de la session dans laquelle le travail en file d'attente est envoyé.

  • validateOnly
    Type : System.Boolean

    Si true, uniquement valide les données d'entrée et n'effectue pas l'action.

Remarques

QueueUpdateProject ne pas créer ou supprimer des entités de projet ; elle modifie les entités existantes telles que des tâches, affectations et ressources de projet. QueueUpdateProject peuvent également ajouter, modifier, ou supprimer des valeurs de champ personnalisé dans un projet, mais ne peut pas créer ou supprimer un champ personnalisé lui-même (utilisez CreateCustomFields ou DeleteCustomFields). QueueUpdateProject est une méthode asynchrone qui envoie un message vers le Service de mise en attente de Project Server.

Les méthodes de classe Project , tel que QueueUpdateProject, ne peuvent pas créer, modifier ou supprimer des ressources de coûts. Si le ProjectDataSet dans le paramètre dataset inclut une ressource de coût, la méthode renvoie l'erreur ProjectCannotEditCostResource 1050. Vous pouvez utiliser la méthode CreateResources pour créer des ressources de coûts, mais les méthodes de la classe Resource ne peut pas les modifier. Pour plus d'informations, voir What the PSI does and does not do.

Notes

Lorsque vous créez ou mettez à jour un projet, l'interface PSI peut traiter jusqu'à 1000 lignes de données en même temps. Si le nombre total de lignes de données nouvelle ou mis à jour dans toutes les tables de ProjectDataSet est supérieure à 1000, PSI renvoie l'erreur ProjectExceededItemsLimit .

Lorsque vous créez un ProjectDataSet.TaskRow, vous devez spécifier TASK_DUR_FMT. Dans le cas contraire, une utilisation ultérieure du projet dans Project Professionnel peut entraîner un comportement imprévisible, y compris la perte de données possibles.

Toutes les modifications apportées aux propriétés de ressource d'entreprise dans ProjectDataSet.ProjectResourceRow seront perdues la prochaine fois que Project Professional actualise les données à partir de Project Server.

Lorsque vous modifiez une tâche dans un ProjectDataSet, ne définissez pas la propriété TASK_WBS . La propriété TASK_WBS est en lecture seule, même si elle est marquée comme en lecture/écriture de la PSI. Si vous ajoutez une tâche avec la propriété TASK_WBS définie sur une valeur spécifiée, Project Professionnel ignore la valeur définie à partir de l'interface PSI et affecte une valeur en fonction de la position hiérarchique de tâche lorsque vous ouvrez le projet. Pour afficher le résultat dans Project Professionnel, vérifiez la valeur de code WBS dans l'onglet Avancé de la boîte de dialogue Informations sur la tâche.

QueueUpdateProject Impossible de modifier une tâche une référence Null (Rien dans Visual Basic) à une tâche réelle. Par exemple, si vous créez des tâches à l'aide de Project Professional et laissez une ou plusieurs lignes vides entre les tâches les, les lignes vides sont une référence Null (Rien dans Visual Basic) tâches.

Modification de la propriété TASK_IS_ACTIVE

Le moteur de planification Project Server peut afficher démarrer incohérente ou les heures lorsque vous utilisez la méthode QueueUpdateProject pour modifier l'état actif d'une tâche, s'il existe plusieurs modifications dans l'objet ProjectDataSet pour le paramètre dataset de fin. Si la propriété TASK_IS_ACTIVE est le seul changement dans le paramètre dataset , vous pouvez mettre à jour le projet.

Pour plus d'informations, voir la planification de projet dans la section serveur dans Project Server Programmability.

Modification de la propriété TASK_OUTLINE_LEVEL

Si vous tentez de changer le TASK_OUTLINE_LEVEL, vous pouvez obtenir une erreur ProjectSchedulingEngineException auprès du Service de mise en attente de Project Server. La valeur d'erreur inclut la exception="Microsoft.Office.Project.Scheduling.SchedulingCycleException: Cycle detected … . Le moteur de planification de Project Server ne gère pas les modifications en bloc dans laquelle vous modifiez la TASK_OUTLINE_LEVEL ou une tâche avec un lien de début à fin (DF) dans une tâche récapitulative. Une solution de contournement consiste à vérifier la file d'attente de Project Server et de gérer la valeur spécifique dans la table QueueStatusDataSet.Status . L'exemple suivant modifie la méthode WaitForQueueJobCompletion dans l'application ProjTool (voir Using the ProjTool Test Application). La modification utilise ReadJobStatus dans le service web QueueSystem et affiche un message approprié.

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

Suppression des valeurs de champ personnalisé

Utilisez QueueUpdateProject au lieu de QueueDeleteFromProject pour supprimer les valeurs des champs personnalisés à partir d'un projet. Pour supprimer une valeur de champ personnalisé, le correcte consiste à obtenir un ProjectDataSet, la valeur de la propriété RowState d'un champ personnalisé DataRowDeletedet ensuite utiliser la modification ProjectDataSet pour mettre à jour le projet. Pour définir un DataRowDeleted, appeler la méthode Delete sur l'objet row, plutôt que de définir la valeur sur une référence Null (Rien dans Visual Basic).

Pour utiliser l'exemple de code suivant dans une application de test, créer un champ personnalisé de tâche de type text, puis créez un projet avec une seule tâche. Assigner une valeur pour le champ personnalisé dans les propriétés de la tâche et pour trouver les valeurs GUID du projet ainsi que le champ personnalisé de tâche. Si vous travaillez sur une installation de test de Project Server, vous pouvez utiliser ProjTool pour trouver facilement les PROJ_UID d'un projet. Sélectionnez le projet dans ProjTool et cliquez sur Détails du projet en lecture, puis cliquez sur l'onglet TaskCustomFields pour trouver le CUSTOM_FIELD_UID. Pour plus d'informations sur ProjTool, reportez-vous à la section 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);
}

Autorisations Project Server

Autorisation

Description

SaveProject

Permet à un utilisateur d'enregistrer le projet spécifié. Autorisation de catégorie.

SaveProjectTemplate

Permet à un utilisateur de créer et enregistrer un projet comme un modèle de projet d'entreprise.

Exemples

L'exemple suivant crée un exemple de projet, en état de vérifications, modifie un nom de la tâche, cette méthode enregistre la mise à jour et vérifie ensuite le projet.

Pour plus d'informations sur l'exécution de cet exemple de code critiques, voir Prerequisites for Reference Code Samples.

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

Voir aussi

Référence

Project classe

Project - Membres

WebSvcProject - Espace de noms

Autres ressources

Using the ProjTool Test Application