Project.CheckOutProject - Méthode
Extrait un projet spécifié.
Espace de noms : WebSvcProject
Assembly : ProjectServerServices (dans ProjectServerServices.dll)
Syntaxe
'Déclaration
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/CheckOutProject", 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 CheckOutProject ( _
projectUid As Guid, _
sessionUid As Guid, _
sessionDescription As String _
)
'Utilisation
Dim instance As Project
Dim projectUid As Guid
Dim sessionUid As Guid
Dim sessionDescription As String
instance.CheckOutProject(projectUid, _
sessionUid, sessionDescription)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/CheckOutProject", 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 CheckOutProject(
Guid projectUid,
Guid sessionUid,
string sessionDescription
)
Paramètres
projectUid
Type : System.GuidGUID du projet.
sessionUid
Type : System.GuidLe GUID de la session dans laquelle le travail en file d'attente est envoyé.
sessionDescription
Type : System.StringFacultatif. Description de la session.
Remarques
CheckOutProject réserve (verrous) le projet pour la modification ou la suppression. Si le projet n'est pas disponible pour la modification, une exception est générée. Le verrou est un verrou de logique de niveau application plutôt qu'un verrou de base de données. Projets doivent être verrouillés avant d'effectuer des modifications dans Project Professional ou les API de Project Server. Lorsqu'il est utilisé en même temps que l'application de service Project Server API, l'opération d'extraction est logiquement équivalente à l'ouverture d'un projet avec l'autorisation de lecture/écriture dans Project Professional.
L'opération d'extraction est synchrone et est traitée immédiatement.
Le verrou de logique sur le projet est associé à l' sessionUid et l'utilisateur qui effectue l'appel d'extraction. Les opérations suivantes par rapport au projet extraits sont acceptées uniquement si l'utilisateur est identique à celui qui a été extrait par le projet et l'appel fournit la même sessionUid.
Le paramètre sessionDescription est une chaîne facultative qui est stockée dans le cadre du projet lorsqu'il est extrait ; la chaîne spécifie disposant du projet en cours d'extraction. Pour Project Professionnel, sessionDescription est le nom de l'ordinateur auquel le projet a été extrait. Pour les appels d'application de service, l'utilisateur peut fournir toute chaîne est significatif ; en règle générale, il est le nom du processus qui a effectué l'opération d'extraction. (Par exemple, « Met à jour des feuilles de temps », « Synchronisation avec SAP » et ainsi de suite.)
Autorisations Project Server
Autorisation |
Description |
---|---|
Permet à un utilisateur d'enregistrer le projet spécifié. Autorisation de catégorie. |
|
Permet à un utilisateur de modifier le nouveau projet. Autorisation de catégorie. |
|
Permet à un utilisateur d'affecter des ressources à partir de la liste des ressources vers le nouveau projet. Autorisation de catégorie. |
Exemples
Applications généralement appellent CheckOutProject, effectuez une mise à jour ou la modification des procédures et ensuite appeler QueueCheckInProject. L'exemple suivant crée un exemple de projet, extrait de ce projet et renomme, puis la consigne dans
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.Threading;
using System.Web.Services.Protocols;
using PSLibrary = Microsoft.Office.Project.Server.Library;
[assembly: CLSCompliant(true)]
namespace Microsoft.SDK.Project.Samples.CheckOutProject
{
class Program
{
[STAThread]
static void Main(string[] args)
{
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";
Guid jobId;
Guid sessionId = Guid.NewGuid();
const string SESSION_DESCRIPTION = "Check out sample utility";
// Set up the web service objects.
SvcProject.Project projectSvc = new SvcProject.Project();
projectSvc.Url = PROJECT_SERVER_URI + PROJECT_SERVICE_PATH;
projectSvc.UseDefaultCredentials = true;
SvcQueueSystem.QueueSystem q = new SvcQueueSystem.QueueSystem();
q.Url = PROJECT_SERVER_URI + QUEUESYSTEM_SERVICE_PATH;
q.UseDefaultCredentials = true;
// Create a sample project.
Console.WriteLine("Creating sample project");
Guid projectId = CreateSampleProject(projectSvc, q);
Console.WriteLine("Created Project UID: " + projectId.ToString());
#endregion
#region Check out, rename, and check in
// Check out the project.
// The session ID is used later to check in the project.
Console.WriteLine("Checking out sample project");
projectSvc.CheckOutProject(projectId, sessionId, SESSION_DESCRIPTION);
// Rename the project.
Console.WriteLine("Renaming the project");
jobId = Guid.NewGuid();
projectSvc.QueueRenameProject(jobId, sessionId, projectId, "My Renamed Project at " + DateTime.Now.ToShortTimeString().Replace(":", ""));
WaitForQueue(q, jobId);
// Check in the project.
Console.WriteLine("Checking in the project");
jobId = Guid.NewGuid();
projectSvc.QueueCheckInProject(jobId, projectId, false, sessionId, SESSION_DESCRIPTION);
WaitForQueue(q, jobId);
#endregion
}
#region Exception handling
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);
}
#endregion
finally
{
Console.ResetColor();
Console.WriteLine("\r\n\r\nPress any key...");
Console.ReadKey();
}
}
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 failed \"" + jobState + "\" Job ID: " + jobId + ".\r\n" + xmlError));
}
else
{
Console.WriteLine("Job State: " + jobState + " 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;
}
}
}