Guid sessionGuid = Guid.NewGuid();
Guid jobGuid = Guid.NewGuid();
project.CheckOutProject(prjGuid, sessionGuid, "Checked-out:PSI");
System.Threading.Thread.Sleep(1000);
CSF_WS.CustomFieldDataSet CstmDS = CustF.ReadCustomFields(null, false);
Project_WS.ProjectDataSet tempProject;
tempProject = project.ReadProject(prjGuid, Project_WS.DataStoreEnum.WorkingStore);
// DateTime startdate = (DateTime)ds2.Tables[0].Rows[i1]["PlannedStartDate"];
DateTime startdate = DateTime.Now.AddDays(2);
tempProject.Project.Rows[0][tempProject.Project.PROJ_INFO_START_DATEColumn] = startdate;
//tempProject = ((Project_WS.ProjectDataSet)tempProject.GetChanges(DataRowState.Modified));
Project_WS.ProjectDataSet.ProjectCustomFieldsDataTable P_dt = new EPMSamples.Project_WS.ProjectDataSet.ProjectCustomFieldsDataTable();
P_dt = tempProject.ProjectCustomFields; //*****This Line Represents the Assigned fields are present in Project.
CstmDS = CustF.ReadCustomFieldsByEntity(new Guid(PSLibrary.EntityCollection.Entities.ProjectEntity.UniqueId.ToString()));
//// Code FOR NEWLY ASSIGN THE VALUES TO CUSTOM FIELD i.e SET THE VALUES TO CUSTOM FIELDS
foreach (DataRow row in CstmDS.CustomFields)
{
//This is Normal project Text field.
if ((String)row["MD_PROP_NAME"] == "Test")
{
Project_WS.ProjectDataSet.ProjectCustomFieldsRow rowProjCF = P_dt.NewProjectCustomFieldsRow();
rowProjCF.MD_PROP_UID = (Guid)row["MD_PROP_UID"];
rowProjCF.PROJ_UID = prjGuid;
rowProjCF.MD_PROP_ID = (int)row["MD_PROP_ID"];
rowProjCF.CUSTOM_FIELD_UID = Guid.NewGuid();
//rowProjCF.TEXT_VALUE = ds2.Tables[0].Rows[i1]["BusinessAreaLeader"].ToString();
rowProjCF.TEXT_VALUE = "Testing values1";
tempProject.ProjectCustomFields.AddProjectCustomFieldsRow(rowProjCF);
}
//This is field Lookup field which dont have Default value, it has Default value
if ((String)row["MD_PROP_NAME"] == "Sample Areas Impacted")
{
foreach (Project_WS.ProjectDataSet.ProjectCustomFieldsRow rowProjCF in P_dt)
{
if ((String)row["MD_PROP_NAME"] == "Sample Areas Impacted" && row["MD_PROP_UID"].ToString() == rowProjCF["MD_PROP_UID"].ToString())
{
rowProjCF.MD_PROP_UID = (Guid)rowProjCF["MD_PROP_UID"];
rowProjCF.PROJ_UID = prjGuid;
rowProjCF.MD_PROP_ID = (int)rowProjCF["MD_PROP_ID"];
rowProjCF.CODE_VALUE = GetLulupValueCode("Marketing");
}
}
}
//This is field Lookup field which dont have Default value.
if ((String)row["MD_PROP_NAME"] == "Office Division")
{
Project_WS.ProjectDataSet.ProjectCustomFieldsRow rowProjCF = P_dt.NewProjectCustomFieldsRow();
rowProjCF.MD_PROP_UID = (Guid)row["MD_PROP_UID"];
rowProjCF.PROJ_UID = prjGuid;
rowProjCF.MD_PROP_ID = (int)row["MD_PROP_ID"];
rowProjCF.CUSTOM_FIELD_UID = Guid.NewGuid();
//rowProjCF.TEXT_VALUE = ds2.Tables[0].Rows[i1]["BusinessAreaLeader"].ToString();
rowProjCF.CODE_VALUE = GetLulupValueCode("Development");
tempProject.ProjectCustomFields.AddProjectCustomFieldsRow(rowProjCF);
}
}
//END Code FOR NEWLY ASSIGN THE VALUES TO CUSTOM FIELD
trackLog(" Updating project property changes.");
MessageBox.Show("Row =" + tempProject.ProjectCustomFields.Rows.Count.ToString());
if (tempProject.ProjectCustomFields.Rows.Count > 0)
{
project.QueueUpdateProject(jobGuid, sessionGuid, tempProject, false);
Guid publishguid = Guid.NewGuid();
project.QueuePublish(publishguid, prjGuid, true, String.Empty);
this.UpdateStatus("Update In Queue.....");
//this.textBox1.Text = " Update in Queue....";
Jobstate = WaitForQueue(jobGuid);
if (Jobstate == false)
{
trackLog("Queue Job for Project Custom fields Update Failed.");
return Jobstate;
}
else
{
trackLog("Queue Job Project Custom Fields Update succeeded.");
}
//System.Threading.Thread.Sleep(9000);
}
MessageBox.Show("Updated");
trackLog(" Checking-in project.");
jobGuid = Guid.NewGuid();
project.QueueCheckInProject(jobGuid, prjGuid, true, sessionGuid, "Checking-in:PSI");
Jobstate = WaitForQueue(jobGuid);
if (Jobstate == false)
{
trackLog("Queue Job Failed to Checking-in Project .");
return Jobstate;
}
System.Threading.Thread.Sleep(9000);
}

This was really helpful to me. I was trying to update an ECF field but found that ProjectCustomField's MD_PROP_UID did not catch 'null' ECF's for a porject. So eventually, I needed to add this to the project where this worked like a charm.
ReplyDeleteJust a few recommendation in this post.
Naming conventions could be improved or comments could be added while using web service params and function like P_dt, CSF_WS and how were they added, just to be user friendly. I had to refer to SDK documentation to understand the usage.But not a big deal. Infact, its always a good idea to look up documentation before implementing code.
But overall its a really helpful post. Thank you for sharing