del método Project.QueueCreateProjectAndCheckOut
Crea un proyecto con las entidades especificadas y mantiene el proyecto desprotegido en la base de datos de borrador.
Espacio de nombres: WebSvcProject
Ensamblado: ProjectServerServices (en ProjectServerServices.dll)
Sintaxis
'Declaración
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/QueueCreateProjectAndCheckOut", 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 QueueCreateProjectAndCheckOut ( _
jobUid As Guid, _
sessionUid As Guid, _
sessionDescription As String, _
dataset As ProjectDataSet, _
validateOnly As Boolean _
)
'Uso
Dim instance As Project
Dim jobUid As Guid
Dim sessionUid As Guid
Dim sessionDescription As String
Dim dataset As ProjectDataSet
Dim validateOnly As Boolean
instance.QueueCreateProjectAndCheckOut(jobUid, _
sessionUid, sessionDescription, _
dataset, validateOnly)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/QueueCreateProjectAndCheckOut", 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 QueueCreateProjectAndCheckOut(
Guid jobUid,
Guid sessionUid,
string sessionDescription,
ProjectDataSet dataset,
bool validateOnly
)
Parámetros
jobUid
Tipo: System.GuidEl GUID de la tarea de la cola.
sessionUid
Tipo: System.GuidEl GUID de la sesión en la que se envía el trabajo en cola.
sessionDescription
Tipo: System.StringLa descripción de la sesión.
dataset
Tipo: WebSvcProject.ProjectDataSetContiene los datos del proyecto.
validateOnly
Tipo: System.BooleanSi true, solo valida los datos de entrada y no lleve a cabo la acción.
Comentarios
Utilice QueueCreateProjectAndCheckOut cuando desea realizar cambios adicionales en el proyecto en esta sesión. Esto ahorra una llamada al servidor. Si no desea realizar cambios adicionales, use QueueCreateProject.
QueueCreateProjectAndCheckOut es un método asincrónico que envía un mensaje para el servicio de cola de Project Server.
Nota
Debido a la PSI no admite la autenticación de notificaciones, el método QueueCreateProjectAndCheckOut no es compatible con un tipo de proyecto empresarial (EPT) que usa una definición de flujo de trabajo para Windows Workflow Foundation 4 (WF4).
Puede usar la interfaz PSI para crear proyectos con tipos de proyecto empresarial que no tienen ningún flujo de trabajo o utilizan una definición de WF3.5 heredada. Para crear un proyecto con una plantilla EPT que tiene una definición de WF4, use el CSOM.
Los métodos de clase Project , como QueueCreateProjectAndCheckOut, no se pueden crear, editar o eliminar recursos de costo. Si el ProjectDataSet en el parámetro dataset incluye un recurso de costo, el método devuelve el error ResourceCannotCreateCostResource 2076. Puede usar el método CreateResources para crear los recursos de costo, pero los métodos de la clase Resource no pueden editarlos. Para obtener más información, vea What the PSI does and does not do.
No puede usar Project Server Interface (PSI) para crear campos personalizados locales en proyectos. Sin embargo, la interfaz PSI admite la edición de los valores de campo personalizado local en tareas, recursos y asignaciones.
Al crear un ProjectDataSet.TaskRow, debe especificar TASK_DUR_FMT. En caso contrario, su uso posterior de este proyecto en Project Professional puede producir un comportamiento impredecible, incluida la posible pérdida de datos.
Los cambios realizados en las propiedades de recurso de empresa en ProjectDataSet.ProjectResourceRow se perderá la próxima vez que Project Professional actualiza los datos de Project Server.
Cuando se agrega una tarea a un ProjectDataSet, no establezca la propiedad TASK_WBS . La propiedad TASK_WBS es de sólo lectura, aunque lo haya marcado como lectura y escritura en la PSI. Si agrega una tarea con la propiedad TASK_WBS establecida en un valor especificado, Project Professional omite el valor establecido de la PSI y asigna un valor según la posición de esquema de tarea cuando se abre el proyecto. Para ver el resultado en Project Professional, compruebe el valor de código EDT en la ficha Avanzadas del cuadro de diálogo Información de la tarea.
Permisos de Project Server
Permiso |
Descripción |
---|---|
Permite a un usuario crear un nuevo permiso global en el servidor de Project. Se aplica sólo a proyectos normales, no las propuestas. |
|
Permite que un usuario abrir un proyecto. Permiso de categoría. Sólo se aplica a los proyectos que se crean desde una plantilla de empresa e iniciados por una página de detalles del proyecto (PDP). |
|
Permite al usuario guardar un proyecto. Permiso de categoría. Sólo se aplica a los proyectos que se inician mediante una página de detalles del proyecto (PDP). |
|
Permite a un usuario modificar un proyecto. Permiso de categoría. Sólo se aplica a los proyectos que se inician mediante una página de detalles del proyecto (PDP). |
Ejemplos
En el ejemplo siguiente se crea un proyecto, guarda en el servidor, pero lo deja desprotegido y, a continuación, se comprueba el proyecto.
Para obtener información crítica acerca de cómo ejecutar este ejemplo de código, vea 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.QueueCreateProjectAndCheckOut
{
class Program
{
[STAThread]
static void Main(string[] args)
{
try
{
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();
SvcProject.ProjectDataSet projectDs = new SvcProject.ProjectDataSet();
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.UseDefaultCredentials = true;
// Create a sample project.
Console.WriteLine("Creating project data");
projectDs = new SvcProject.ProjectDataSet();
// 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();
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();
taskTwo.TASK_NAME = "Task Two";
taskTwo.TASK_START_DATE = System.DateTime.Now.AddDays(1);
projectDs.Task.AddTaskRow(taskTwo);
// Save the project to the database.
Console.WriteLine("Saving project data to the server and checking out");
jobId = Guid.NewGuid();
projectSvc.QueueCreateProjectAndCheckOut(jobId,sessionId,SESSION_DESC, projectDs, false);
WaitForQueue(q, jobId);
// Add your additional changes here.
// Check in the project so that it is available for more changes.
Console.WriteLine("Checking in the project");
jobId = Guid.NewGuid();
projectSvc.QueueCheckInProject(jobId,projectRow.PROJ_UID,false, sessionId, SESSION_DESC);
WaitForQueue(q, jobId);
}
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();
}
}
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);
}
}
}