如何设置多个自定义字段?-Microsoft Project Server
本文关键字:字段 自定义 -Microsoft Server Project 何设置 设置 | 更新日期: 2023-09-27 18:00:08
我是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);
}
根据我的理解,您正在更新一个项目自定义字段。更新自定义字段只不过是更新项目。为了做到这一点,首先你必须签出一个项目,更新自定义字段,然后调用Queue发布方法来保存和发布它
但在您的代码中,您只签出了一个项目。因此,您可以更新仅属于该项目的自定义字段。
为了更新多个自定义字段,您的代码应该更加动态。
示例:
read project Guid dynamically.
Loop in thru the project Guid's, then
{
Get Custom field Dataset.
Read custom field dataset.
compare custom fields guids, pick the custom field values based on Project Guid and Custom Field Guid.
Set the value and finally update it.
}