You need to sign in to do that
Don't have an account?
Ankit Singh 6
Updating picklist value through metadata api throwing error 'Concurrent modification from setup pages'
Hi
I am trying to update picklist value for leadsource through metadata api but not sure why getting 'Concurrent modification from setup pages' error.
Below is my code :
private bool UpdatePicklist(string sfObject, string picklistName, List<string> picklistValues)
{
List<string> extraPickList = new List<string>();
if (_ms == null)
GetMetaDataService();
DescribeSObjectResult sr = _sf.describeSObject(sfObject);
if (sr == null || sr.fields == null || sr.fields.Length == 0)
{
_log.Info("Error occured : sf object description is null");
return false;
}
foreach (Field field in sr.fields)
{
if (!(field.type == fieldType.picklist && field.name == picklistName))
continue;
foreach (PicklistEntry entry in field.picklistValues)
{
if (!picklistValues.Contains(entry.value))
{
extraPickList.Add(entry.value);
}
}
if (extraPickList.Count > 0)
{
extraPickList.AddRange(picklistValues);
CustomField co = new CustomField();
co.fullName = sfObject + "." + picklistName;
co.type = (SfApi.FieldType)Enum.Parse(typeof(SfApi.FieldType), "Picklist");
co.picklist = new Picklist();
co.picklist.sorted = true;
List<PicklistValue> picklistArray = new List<PicklistValue>();
foreach (string picklistValue in extraPickList)
{
PicklistValue pick = new PicklistValue();
pick.fullName = picklistValue;
// setting default value
if (picklistValue == "Other")
pick.@default = true;
picklistArray.Add(pick);
}
co.picklist.picklistValues = picklistArray.ToArray();
Metadata[] m = new Metadata[] { co };
UpdateMetadata um = new UpdateMetadata();
um.metadata = m[0];
UpdateMetadata[] uma = new UpdateMetadata[] { um };
AsyncResult r = _ms.update(uma)[0];
//AsyncResult r = _ms.create(m)[0];
while (!r.done)
{
System.Threading.Thread.Sleep(10 * 1000);
r = _ms.checkStatus(new string[] { r.id })[0];
_log.Info("Still On");
}
if (r.state == AsyncRequestState.Error)
{
_log.Info("Error : " + r.statusCode + " " + r.message);
return false;
}
else
{
_log.Info("Picklist successfully recreated");
return true;
}
}
else
return true;
break;
}
return false;
}
Please let me know the solution for this, tried many things but no success.
I am trying to update picklist value for leadsource through metadata api but not sure why getting 'Concurrent modification from setup pages' error.
Below is my code :
private bool UpdatePicklist(string sfObject, string picklistName, List<string> picklistValues)
{
List<string> extraPickList = new List<string>();
if (_ms == null)
GetMetaDataService();
DescribeSObjectResult sr = _sf.describeSObject(sfObject);
if (sr == null || sr.fields == null || sr.fields.Length == 0)
{
_log.Info("Error occured : sf object description is null");
return false;
}
foreach (Field field in sr.fields)
{
if (!(field.type == fieldType.picklist && field.name == picklistName))
continue;
foreach (PicklistEntry entry in field.picklistValues)
{
if (!picklistValues.Contains(entry.value))
{
extraPickList.Add(entry.value);
}
}
if (extraPickList.Count > 0)
{
extraPickList.AddRange(picklistValues);
CustomField co = new CustomField();
co.fullName = sfObject + "." + picklistName;
co.type = (SfApi.FieldType)Enum.Parse(typeof(SfApi.FieldType), "Picklist");
co.picklist = new Picklist();
co.picklist.sorted = true;
List<PicklistValue> picklistArray = new List<PicklistValue>();
foreach (string picklistValue in extraPickList)
{
PicklistValue pick = new PicklistValue();
pick.fullName = picklistValue;
// setting default value
if (picklistValue == "Other")
pick.@default = true;
picklistArray.Add(pick);
}
co.picklist.picklistValues = picklistArray.ToArray();
Metadata[] m = new Metadata[] { co };
UpdateMetadata um = new UpdateMetadata();
um.metadata = m[0];
UpdateMetadata[] uma = new UpdateMetadata[] { um };
AsyncResult r = _ms.update(uma)[0];
//AsyncResult r = _ms.create(m)[0];
while (!r.done)
{
System.Threading.Thread.Sleep(10 * 1000);
r = _ms.checkStatus(new string[] { r.id })[0];
_log.Info("Still On");
}
if (r.state == AsyncRequestState.Error)
{
_log.Info("Error : " + r.statusCode + " " + r.message);
return false;
}
else
{
_log.Info("Picklist successfully recreated");
return true;
}
}
else
return true;
break;
}
return false;
}
Please let me know the solution for this, tried many things but no success.
This error is usually seen, if there is a dependant picklist field that has been modified in production after the last Sandbox Refresh, or if the target org had a picklist field that was modified later than the source and had different values. All the values have to be exactly the same. If not, they have to be manually matched to be the same.
Thanks,
Shashank