如何设置多个自定义字段?-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);
    }

如何设置多个自定义字段?-Microsoft Project Server

根据我的理解,您正在更新一个项目自定义字段。更新自定义字段只不过是更新项目。为了做到这一点,首先你必须签出一个项目,更新自定义字段,然后调用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.
}