This illustration shows how to update a global option set (OptionSet entity) in Microsoft Dynamics CRM 2011 with UpdateOptionSetRequest. This example will be given in Jscript (SOAP) and in C# (.NET).
If you need help instantiating a service object in .NET within a plugin check out this post:
http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html
Ok, here is what the code looks like!
First in C#:
//retrieve optionset to update
RetrieveOptionSetRequest req =
new RetrieveOptionSetRequest
{
//my global optionset's name
Name = "new_testoptionset"
};
// Execute the request.
RetrieveOptionSetResponse retrieveOptionSetResponse =
(RetrieveOptionSetResponse)service.Execute(req);
// Access the retrieved OptionSetMetadata.
OptionSetMetadata retrievedOptionSetMetadata =
(OptionSetMetadata)retrieveOptionSetResponse.OptionSetMetadata;
// Get the current options list for the retrieved attribute.
OptionMetadata[] optionList =
retrievedOptionSetMetadata.Options.ToArray();
//make a change (in this case, a description change)
retrievedOptionSetMetadata.Description = new Label("My extra special test optionset", 1033);
//update option set
UpdateOptionSetRequest req2 = new UpdateOptionSetRequest();
req2.OptionSet = retrievedOptionSetMetadata;
UpdateOptionSetResponse resp = (UpdateOptionSetResponse)service.Execute(req2);
If you need help instantiating a service object in .NET within a plugin check out this post:
http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html
Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/
Now in Jscript
This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html
Now in Jscript
This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html
if (typeof (SDK) == "undefined")
{ SDK = { __namespace: true }; }
//This will establish a more unique namespace for functions in this library. This will reduce the
// potential for functions to be overwritten due to a duplicate name when the library is loaded.
SDK.SAMPLES = {
_getServerUrl: function () {
///<summary>
/// Returns the URL for the SOAP endpoint using the context information available in the form
/// or HTML Web resource.
///</summary>
var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
var serverUrl = "";
if (typeof GetGlobalContext == "function") {
var context = GetGlobalContext();
serverUrl = context.getServerUrl();
}
else {
if (typeof Xrm.Page.context == "object") {
serverUrl = Xrm.Page.context.getServerUrl();
}
else
{ throw new Error("Unable to access the server URL"); }
}
if (serverUrl.match(/\/$/)) {
serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}
return serverUrl + OrgServicePath;
},
UpdateOptionSetRequest: function () {
var requestMain = ""
requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
requestMain += " <s:Body>";
requestMain += " <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
requestMain += " <request i:type=\"a:UpdateOptionSetRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
requestMain += " <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
requestMain += " <a:KeyValuePairOfstringanyType>";
requestMain += " <b:key>OptionSet</b:key>";
requestMain += " <b:value i:type=\"c:OptionSetMetadata\" xmlns:c=\"http://schemas.microsoft.com/xrm/2011/Metadata\">";
requestMain += " <c:MetadataId>f7235fde-91f9-e011-8e32-1cc1def1b5ff</c:MetadataId>";
requestMain += " <c:Description>";
requestMain += " <a:LocalizedLabels>";
requestMain += " <a:LocalizedLabel>";
requestMain += " <a:IsManaged i:nil=\"true\" />";
requestMain += " <a:Label>My extra special test optionset</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:LocalizedLabel>";
requestMain += " </a:LocalizedLabels>";
requestMain += " <a:UserLocalizedLabel i:nil=\"true\" />";
requestMain += " </c:Description>";
requestMain += " <c:DisplayName>";
requestMain += " <a:LocalizedLabels>";
requestMain += " <a:LocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label>testoptionset</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:LocalizedLabel>";
requestMain += " </a:LocalizedLabels>";
requestMain += " <a:UserLocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label>testoptionset</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:UserLocalizedLabel>";
requestMain += " </c:DisplayName>";
requestMain += " <c:IsCustomOptionSet>true</c:IsCustomOptionSet>";
requestMain += " <c:IsCustomizable>";
requestMain += " <a:CanBeChanged>true</a:CanBeChanged>";
requestMain += " <a:ManagedPropertyLogicalName>iscustomizable</a:ManagedPropertyLogicalName>";
requestMain += " <a:Value>true</a:Value>";
requestMain += " </c:IsCustomizable>";
requestMain += " <c:IsGlobal>true</c:IsGlobal>";
requestMain += " <c:IsManaged>false</c:IsManaged>";
requestMain += " <c:Name>new_testoptionset</c:Name>";
requestMain += " <c:OptionSetType>Picklist</c:OptionSetType>";
requestMain += " <c:Options>";
requestMain += " <c:OptionMetadata>";
requestMain += " <c:MetadataId i:nil=\"true\" />";
requestMain += " <c:Description>";
requestMain += " <a:LocalizedLabels>";
requestMain += " <a:LocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label />";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:LocalizedLabel>";
requestMain += " </a:LocalizedLabels>";
requestMain += " <a:UserLocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label />";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:UserLocalizedLabel>";
requestMain += " </c:Description>";
requestMain += " <c:IsManaged>false</c:IsManaged>";
requestMain += " <c:Label>";
requestMain += " <a:LocalizedLabels>";
requestMain += " <a:LocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label>Item1</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:LocalizedLabel>";
requestMain += " </a:LocalizedLabels>";
requestMain += " <a:UserLocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label>Item1</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:UserLocalizedLabel>";
requestMain += " </c:Label>";
requestMain += " <c:Value>100000000</c:Value>";
requestMain += " </c:OptionMetadata>";
requestMain += " <c:OptionMetadata>";
requestMain += " <c:MetadataId i:nil=\"true\" />";
requestMain += " <c:Description>";
requestMain += " <a:LocalizedLabels>";
requestMain += " <a:LocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label />";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:LocalizedLabel>";
requestMain += " </a:LocalizedLabels>";
requestMain += " <a:UserLocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label />";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:UserLocalizedLabel>";
requestMain += " </c:Description>";
requestMain += " <c:IsManaged>false</c:IsManaged>";
requestMain += " <c:Label>";
requestMain += " <a:LocalizedLabels>";
requestMain += " <a:LocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label>Item2</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:LocalizedLabel>";
requestMain += " </a:LocalizedLabels>";
requestMain += " <a:UserLocalizedLabel>";
requestMain += " <a:IsManaged>false</a:IsManaged>";
requestMain += " <a:Label>Item2</a:Label>";
requestMain += " <a:LanguageCode>1033</a:LanguageCode>";
requestMain += " </a:UserLocalizedLabel>";
requestMain += " </c:Label>";
requestMain += " <c:Value>100000001</c:Value>";
requestMain += " </c:OptionMetadata>";
requestMain += " </c:Options>";
requestMain += " </b:value>";
requestMain += " </a:KeyValuePairOfstringanyType>";
requestMain += " <a:KeyValuePairOfstringanyType>";
requestMain += " <b:key>MergeLabels</b:key>";
requestMain += " <b:value i:type=\"c:boolean\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">false</b:value>";
requestMain += " </a:KeyValuePairOfstringanyType>";
requestMain += " </a:Parameters>";
requestMain += " <a:RequestId i:nil=\"true\" />";
requestMain += " <a:RequestName>UpdateOptionSet</a:RequestName>";
requestMain += " </request>";
requestMain += " </Execute>";
requestMain += " </s:Body>";
requestMain += "</s:Envelope>";
var req = new XMLHttpRequest();
req.open("POST", SDK.SAMPLES._getServerUrl(), true)
// Responses will return XML. It isn't possible to return JSON.
req.setRequestHeader("Accept", "application/xml, text/xml, */*");
req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
var successCallback = null;
var errorCallback = null;
req.onreadystatechange = function () { SDK.SAMPLES.UpdateOptionSetResponse(req, successCallback, errorCallback); };
req.send(requestMain);
},
UpdateOptionSetResponse: function (req, successCallback, errorCallback) {
///<summary>
/// Recieves the assign response
///</summary>
///<param name="req" Type="XMLHttpRequest">
/// The XMLHttpRequest response
///</param>
///<param name="successCallback" Type="Function">
/// The function to perform when an successfult response is returned.
/// For this message no data is returned so a success callback is not really necessary.
///</param>
///<param name="errorCallback" Type="Function">
/// The function to perform when an error is returned.
/// This function accepts a JScript error returned by the _getError function
///</param>
if (req.readyState == 4) {
if (req.status == 200) {
if (successCallback != null)
{ successCallback(); }
}
else {
errorCallback(SDK.SAMPLES._getError(req.responseXML));
}
}
},
_getError: function (faultXml) {
///<summary>
/// Parses the WCF fault returned in the event of an error.
///</summary>
///<param name="faultXml" Type="XML">
/// The responseXML property of the XMLHttpRequest response.
///</param>
var errorMessage = "Unknown Error (Unable to parse the fault)";
if (typeof faultXml == "object") {
try {
var bodyNode = faultXml.firstChild.firstChild;
//Retrieve the fault node
for (var i = 0; i < bodyNode.childNodes.length; i++) {
var node = bodyNode.childNodes[i];
//NOTE: This comparison does not handle the case where the XML namespace changes
if ("s:Fault" == node.nodeName) {
for (var j = 0; j < node.childNodes.length; j++) {
var faultStringNode = node.childNodes[j];
if ("faultstring" == faultStringNode.nodeName) {
errorMessage = faultStringNode.text;
break;
}
}
break;
}
}
}
catch (e) { };
}
return new Error(errorMessage);
},
__namespace: true
};
To understand how to parse the response please review my post on using the DOM parser.
Now you can call the SDK.SAMPLES.UpdateOptionSetRequest function from your form jscript handler.
Thats all there is to it!
-
-
Such an amazing blog with new updates. I love to learn more about this topic. Waiting for more like this.
ReplyDeleteMicrosoft Dynamics crm Training in Chennai
Microsoft Dynamics Training in Chennai
Microsoft Dynamics crm Training institutes in Chennai
Salesforce Training in Chennai
AngularJS Training in Chennai
Tally course in Chennai
ccna course in Chennai
Microsoft Dynamics crm Training in Velachery
Microsoft Dynamics crm Training in T Nagar
Microsoft Dynamics crm Training in OMR
Fabulous post admin, it was too good and helpful. Waiting for more updates.
ReplyDeleteCyber Security Training Course in Chennai | Certification | Cyber Security Online Training Course| Ethical Hacking Training Course in Chennai | Certification | Ethical Hacking Online Training Course| CCNA Training Course in Chennai | Certification | CCNA Online Training Course| RPA Robotic Process Automation Training Course in Chennai | Certification | RPA Training Course Chennai| SEO Training in Chennai | Certification | SEO Online Training Course