Project.CheckOutProject method
Faz o check out de um projeto especificado.
Namespace: WebSvcProject
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Syntax
'Declaração
<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 _
)
'Uso
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
)
Parâmetros
projectUid
Type: System.GuidO GUID do projeto.
sessionUid
Type: System.GuidO GUID da sessão em que o trabalho de fila é enviado.
sessionDescription
Type: System.StringOpcional. A descrição da sessão.
Comentários
CheckOutProject (bloqueios) reserva-se o projeto para editar ou excluir. Se o projeto estiver disponível para edição, uma exceção será feita. O bloqueio é um bloqueio de lógico de nível de aplicativo, em vez de um bloqueio de banco de dados. Projetos devem ser bloqueados antes que quaisquer alterações podem ser feitas no Project Professional ou as APIs do Project Server. Quando usado juntamente com o aplicativo de serviço do Project Server APIs, a operação de check-out é logicamente equivalente ao abrir um projeto com permissão de leitura/gravação no Project Professional.
A operação de check-out é síncrona e é processada imediatamente.
O bloqueio lógico no projeto está associado com o sessionUid e o usuário fazendo a chamada de check-out. Operações subseqüentes em relação ao projeto com check-out são aceitas somente se o usuário é o mesmo que aquele que fez o check-out do projeto e a chamada fornece o mesmo sessionUid.
O parâmetro sessionDescription é uma sequência de caracteres opcional que é armazenada como parte do projeto enquanto ele está com check-out; a cadeia de caracteres Especifica quem tem o projeto com check-out. Para o Project Professional, sessionDescription é o nome do computador ao qual o projeto foi check-out. Para chamadas de aplicativo de serviço, o usuário pode fornecer qualquer cadeia de caracteres faz sentido; Normalmente, ele é o nome do processo que executou a operação de check-out. (Por exemplo, "Atualizações do quadro de horários", "Sincronização com o SAP" e assim por diante.)
Permissões do Project Server
Permissão |
Descrição |
---|---|
Permite que um usuário salvar o projeto especificado. Permissão de categoria. |
|
Permite que o usuário edite o novo projeto. Permissão de categoria. |
|
Permite que um usuário atribuir recursos do pool de recursos para o novo projeto. Permissão de categoria. |
Examples
Aplicativos normalmente chama CheckOutProject, faça algumas update ou edição de procedimentos e então chamar QueueCheckInProject. O exemplo a seguir cria um projeto de exemplo, check-out do projeto e renomeia a ele e, em seguida, fazer check-in
For critical information about running this code sample, see 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;
}
}
}