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

时间:2014-04-25 23:17:51

标签: c# custom-fields project-server ms-project-server-2010 psi

我对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);

    }

1 个答案:

答案 0 :(得分:1)

根据我的理解,您正在更新项目自定义字段。更新自定义字段只是更新项目。为此,首先必须签出项目,更新自定义字段,然后调用队列发布方法来保存和发布它。

但是在你的代码中,你只检查了一个项目。因此,您可以更新仅属于该项目的自定义字段。

为了更新多个自定义字段,您的代码应该更加动态。

示例:

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.
}