我对 Project Server 开发相当陌生,想知道需要对以下代码进行哪些修改,我必须让它一次更新多个自定义字段。我已经完成了所有工作,直到我想开始更新多个自定义字段。我浏览了许多教程,但没有找到适用于此问题的解决方案。我整理的当前程序仅导致更新第一个 ForEach cfValueWOD 自定义字段。如果它们已经有一个值,我可以获得更新多个字段的代码,但是对于我的项目,这些自定义字段可以有一个初始值或没有值开始。在这两种情况下,我都需要将值写入这些字段。我需要很快为工作中的一个项目完成这个,我很茫然。您的帮助将不胜感激。我目前的代码如下:
{
static void WriteCustomFields()
{
//Guids for custom fields to update - Test
string cfNameWOD = "WO Description"; //Test WO Description custom field
string cfValueWOD = "xxxx5WODes";
Guid cfIdWOD = new Guid("{8071365c-1375-46a1-9424-cd79f3c2b0db}");
string cfNameWG = "Work Group"; //Test Work Group custom field
string cfValueWG = "xxxx5Group";
Guid cfIdWG = new Guid("{f75c6cfb-b7cb-4d35-8b04-60efb12fcd39}");
//projects into a dataset
ProjectDataSet projectList = projectSvc.ReadProjectList();
//read project data
Guid myProjectUid = new Guid("{c96bd7ea-e9d2-47ed-8819-02e4653e92a7}");
ProjectDataSet myProject = projectSvc.ReadProject(myProjectUid, DataStoreEnum.WorkingStore);
//indicate the custom field has been found
bool customFieldFound = false;
//iterate over fields and update them to the table for WO Status
foreach (ProjectDataSet.ProjectCustomFieldsRow cfRow in myProject.ProjectCustomFields)
{
//if field exists update it
if (cfRow.MD_PROP_UID == cfIdWOD)
{
//update the value
cfRow.TEXT_VALUE = cfValueWOD;
customFieldFound = true;
}
}
//check if the custom field has been found
if (!customFieldFound)
{
//create a new row
ProjectDataSet.ProjectCustomFieldsRow cfRowWOD =
myProject.ProjectCustomFields.NewProjectCustomFieldsRow();
//Sets all values to NUll to begin
cfRowWOD.SetDATE_VALUENull();
cfRowWOD.SetTEXT_VALUENull();
//General parameters
cfRowWOD.MD_PROP_UID = cfIdWOD; //custom field ID
cfRowWOD.CUSTOM_FIELD_UID = Guid.NewGuid();
cfRowWOD.PROJ_UID = myProjectUid; //current project ID
//add value
cfRowWOD.FIELD_TYPE_ENUM = 21;
cfRowWOD.TEXT_VALUE = Convert.ToString(cfValueWOD); //test value
//add the row to the data set
myProject.ProjectCustomFields.AddProjectCustomFieldsRow(cfRowWOD);
}
//iterate over fields and update them to the table for WO Status
foreach (ProjectDataSet.ProjectCustomFieldsRow cfRow in myProject.ProjectCustomFields)
{
//if field exists update it
if (cfRow.MD_PROP_UID == cfIdWG)
{
//update the value
cfRow.TEXT_VALUE = cfValueWG;
customFieldFound = true;
}
}
//check if the custom field has been found
if (!customFieldFound)
{
//create a new row
ProjectDataSet.ProjectCustomFieldsRow cfRowWG =
myProject.ProjectCustomFields.NewProjectCustomFieldsRow();
//Sets all values to NUll to begin
cfRowWG.SetDATE_VALUENull();
cfRowWG.SetTEXT_VALUENull();
//General parameters
cfRowWG.MD_PROP_UID = cfIdWG; //custom field ID
cfRowWG.CUSTOM_FIELD_UID = Guid.NewGuid();
cfRowWG.PROJ_UID = myProjectUid; //current project ID
//add value
cfRowWG.FIELD_TYPE_ENUM = 21;
cfRowWG.TEXT_VALUE = Convert.ToString(cfValueWG); //test value
//add the row to the data set
myProject.ProjectCustomFields.AddProjectCustomFieldsRow(cfRowWG);
}
//generate sessionId for tracking
Guid sessionId = Guid.NewGuid(); //sessionId for updating process
Guid jobId = Guid.NewGuid(); //ID for each job
//check out project
projectSvc.CheckOutProject(myProjectUid, sessionId,
"update checkout");
//update project database
bool validateOnly = false;
projectSvc.QueueUpdateProject(jobId, sessionId,
myProject, validateOnly);
//wait to finish
WaitForJob(jobId);
//new jobId to check in the project
jobId = Guid.NewGuid();
//check in the updated project
bool force = false;
string sessionDescription = "update custom fields";
projectSvc.QueueCheckInProject(jobId, myProjectUid,
force, sessionId, sessionDescription);
//wait to finish
WaitForJob(jobId);
//new jobId to publish the project
jobId = Guid.NewGuid();
bool fullPublish = true;
projectSvc.QueuePublish(jobId, myProjectUid, fullPublish, null);
//wait to finish
WaitForJob(jobId);
}