Project.QueueUpdateProject-Methode
Aktualisiert die Entitäten in einem Projekt ausgecheckt. Außerdem fügt, ändert oder löscht Werte benutzerdefinierter Felder.
Namespace: WebSvcProject
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Syntax
'Declaration
<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 _
)
'Usage
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
)
Parameter
jobUid
Typ: System.GuidDie GUID des Warteschlangenauftrags Warteschlange.
sessionUid
Typ: System.GuidDie GUID der Sitzung ein, in der der Warteschlangenauftrag gesendet wird.
dataset
Typ: WebSvcProject.ProjectDataSetEnthält die projektentitäten zu aktualisieren.
validateOnly
Typ: System.BooleanWenn true, nur die eingegebenen Daten überprüft und keine Aktion ausgeführt wird.
Hinweise
QueueUpdateProject erstellen oder Löschen von projektentitäten nicht; Ändert vorhandene Entitäten wie Vorgängen, Zuweisungen und Projektressourcen. QueueUpdateProject können auch hinzufügen, ändern, oder Werte für benutzerdefinierte Felder in einem Projekt löschen, aber kann nicht erstellen oder löschen ein benutzerdefiniertes Felds selbst (Verwendung CreateCustomFields oder DeleteCustomFields). QueueUpdateProject ist eine asynchrone Methode, die eine Nachricht an die Project Server-Warteschlangendienst sendet.
Die Methoden der Project -Klasse, wie etwa QueueUpdateProject, können nicht erstellen, bearbeiten oder Löschen von Kostenressourcen. Wenn die ProjectDataSet im Parameter dataset Kostenressource enthält, gibt die Methode den Fehler ProjectCannotEditCostResource 1050. Sie können die CreateResources -Methode zum Erstellen von Kostenressourcen verwenden, aber Resource Klassenmethoden nicht bearbeitet werden. Weitere Informationen finden Sie unter What the PSI does and does not do.
Hinweis
Beim Erstellen oder ein Projekts aktualisieren, kann die PSI gleichzeitig bis zu 1000 Zeilen der Daten verarbeiten. Wenn die Gesamtzahl der Zeilen mit neuen oder aktualisierten Daten in allen Tabellen eines ProjectDataSet 1000 überschreitet, wird die PSI der ProjectExceededItemsLimit -Fehler zurückgegeben.
Wenn Sie eine ProjectDataSet.TaskRowerstellen, müssen Sie TASK_DUR_FMTangeben. Andernfalls kann späteren Verwendung des Projekts in Project Professional zu unvorhersehbaren, einschließlich der möglichen Datenverlust führen.
Alle Änderungen an Enterprise-Ressource-Eigenschaften in ProjectDataSet.ProjectResourceRow verloren das nächste Mal, das Project Professional die Daten aus Project Server aktualisiert.
Wenn Sie eine Aufgabe in einer ProjectDataSetändern, legen Sie die TASK_WBS -Eigenschaft nicht. Die TASK_WBS -Eigenschaft ist schreibgeschützt, obwohl es mit Lese-/Schreibzugriff in die PSI markiert ist. Wenn Sie eine Aufgabe mit der TASK_WBS -Eigenschaft auf einen bestimmten Wert hinzufügen, wird von Project Professional ignoriert den Wert aus der PSI festgelegt und weist einen Wert entsprechend der Position des Vorgangs Gliederung, wenn Sie das Projekt öffnen. Um das Ergebnis in Project Professional angezeigt wird, überprüfen Sie den PSP-Code-Wert auf der Registerkarte Erweitert des Dialogfelds Informationen zum Vorgang.
QueueUpdateProject kann nicht mit einer realen Aufgabe eine Aufgabe ein Nullverweis (Nothing in Visual Basic) ändern. Wenn Sie das Erstellen von Aufgaben mithilfe von Project Professional und lassen Sie eine oder mehrere leere Zeilen zwischen einige der Aufgaben, sind die leeren Zeilen beispielsweise ein Nullverweis (Nothing in Visual Basic) Aufgaben.
Wenn die TASK_IS_ACTIVE-Eigenschaft
Das Planungsmodul von Project Server kann inkonsistente Start ein- oder Endzeiten Wenn QueueUpdateProject der Methode zum Ändern des aktiven Status eines Vorgangs, Verwendung Wenn mehrere Änderungen in das ProjectDataSet -Objekt für den Parameter dataset vorhanden sind. Wenn die TASK_IS_ACTIVE -Eigenschaft die einzige Änderung im dataset -Parameter ist, können Sie das Projekt aktualisieren.
Weitere Informationen finden Sie im Abschnitt Server unter Project Server Programmabilityder Projektplanung.
Wenn die TASK_OUTLINE_LEVEL-Eigenschaft
Wenn Sie versuchen, die TASK_OUTLINE_LEVELändern, können Sie einen ProjectSchedulingEngineException Fehler aus der Project Server-Warteschlangendienst abrufen. Der Fehler Inhalt enthalten exception="Microsoft.Office.Project.Scheduling.SchedulingCycleException: Cycle detected … . Project Server Planungsmodul behandelt, in dem Sie die TASK_OUTLINE_LEVEL oder ändern eine Aufgabe mit einem Link Anfang-Ende (AE) in einem Sammelvorgang, nicht Massenbearbeitung. Eine Problemumgehung besteht darin, überprüfen Sie die Project Server-Warteschlange und den spezifischen Wert in der Tabelle QueueStatusDataSet.Status behandeln. Das folgende Beispiel ändert die WaitForQueueJobCompletion -Methode in der ProjTool-Anwendung (siehe Using the ProjTool Test Application). Die Änderung ReadJobStatus in den QueueSystem -Webdienst verwendet und zeigt eine entsprechende Meldung angezeigt.
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);
}
. . .
}
Löschen die Werte für benutzerdefinierte Felder
Verwenden Sie QueueUpdateProject anstelle von QueueDeleteFromProject , um Werte für benutzerdefinierte Felder aus einem Projekt löschen. Die richtige Option zum Löschen einer benutzerdefinierten Feldes ist eine ProjectDataSeterhalten möchten, legen Sie die RowState -Eigenschaft des ein benutzerdefiniertes Feld DataRow auf Deletedund klicken Sie dann die geänderte ProjectDataSet verwenden, um das Projekt zu aktualisieren. Rufen Sie die Delete -Methode, um eine DataRow auf Deletedfestzulegen, auf den Wert auf ein Nullverweis (Nothing in Visual Basic)festlegen, anstatt das Row-Objekt.
Um der folgende Beispielcode in eine Testanwendung verwenden, Erstellen eines benutzerdefinierten Vorgangsfelds des Typs text, und klicken Sie dann ein Projekt mit einer Aufgabe erstellen. Weisen Sie einen Wert an das benutzerdefinierte Feld in der Task-Eigenschaften, und suchen Sie dann die Werte der GUID des Projekts und das benutzerdefinierte Vorgangsfeld. Wenn Sie einen Testinstallation von Project Server arbeiten, können Sie ProjTool schnell und einfach Auffinden der PROJ_UID eines Projekts verwenden. Wählen Sie das Projekt in ProjTool auf Projektdetails lesen, und klicken Sie dann auf der Registerkarte TaskCustomFields, um die CUSTOM_FIELD_UIDzu suchen. Weitere Informationen zu ProjTool finden Sie unter 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-Berechtigungen
Berechtigung |
Beschreibung |
---|---|
Ermöglicht einem Benutzer das angegebene Projekt zu speichern. Kategorieberechtigung. |
|
Ermöglicht einem Benutzer das Erstellen und speichern Sie ein Projekt als Enterprise-Projekt-Vorlage. |
Beispiele
Das folgende Beispiel erstellt ein Beispielprojekt, Prüfungen gestalten, ändert einen Aufgabennamen, speichert die Aktualisierung und anschließend überprüft das Projekt dann wieder anmelden.
Wichtige Informationen zum Ausführen dieses Codebeispiel finden Sie unter 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;
}
}
}