Dissassociate requests are kind of line the "unfriend" in Facebook, you are breaking off a relationship that is defined within CRM between two entities.
This illustration shows you how to Disassociate two entities in Microsoft Dynamics CRM 2011 using the disassociate request against a known relationship. This example will be given in SOAP (JScript) and in C# (.NET) with the Associate message against the CRM 2011 organization service. In this example we are simply disassociating a contact from an account as it's parent customer using the existing "contact_customer_accounts" relationship in CRM.
If you need help instantiating a service object in .NET check out this post:
http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html
To understand how to parse the response please review my post on using the DOM parser.
This illustration shows you how to Disassociate two entities in Microsoft Dynamics CRM 2011 using the disassociate request against a known relationship. This example will be given in SOAP (JScript) and in C# (.NET) with the Associate message against the CRM 2011 organization service. In this example we are simply disassociating a contact from an account as it's parent customer using the existing "contact_customer_accounts" relationship in CRM.
First in C#:
DisassociateRequest dreq = new DisassociateRequest();
//Target is the entity that you are disassociating your entities with.
dreq.Target = new EntityReference("account", new Guid("A6951D47-FB71-E011-882E-1CC1DEF17774"));
//RelatedEntities are the entities you are disassociating to your target (can be more than 1)
dreq.RelatedEntities = new EntityReferenceCollection();
dreq.RelatedEntities.Add(new EntityReference("contact", new Guid("C7EE81A3-0572-E011-882E-1CC1DEF17774")));
//The relationship schema name in CRM you are using to disassociate the entities.
//found in settings - customization - entity - relationships
dreq.Relationship = new Relationship("contact_customer_accounts");
//execute the request
service.Execute(dreq);
If you need help instantiating a service object in .NET 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:
Now in Jscript:
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;
},
DisassociateRequest: 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:DisassociateRequest\" 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>Target</b:key>";
requestMain += " <b:value i:type=\"a:EntityReference\">";
requestMain += " <a:Id>a6951d47-fb71-e011-882e-1cc1def17774</a:Id>";
requestMain += " <a:LogicalName>account</a:LogicalName>";
requestMain += " <a:Name i:nil=\"true\" />";
requestMain += " </b:value>";
requestMain += " </a:KeyValuePairOfstringanyType>";
requestMain += " <a:KeyValuePairOfstringanyType>";
requestMain += " <b:key>Relationship</b:key>";
requestMain += " <b:value i:type=\"a:Relationship\">";
requestMain += " <a:PrimaryEntityRole i:nil=\"true\" />";
requestMain += " <a:SchemaName>contact_customer_accounts</a:SchemaName>";
requestMain += " </b:value>";
requestMain += " </a:KeyValuePairOfstringanyType>";
requestMain += " <a:KeyValuePairOfstringanyType>";
requestMain += " <b:key>RelatedEntities</b:key>";
requestMain += " <b:value i:type=\"a:EntityReferenceCollection\">";
requestMain += " <a:EntityReference>";
requestMain += " <a:Id>C7EE81A3-0572-E011-882E-1CC1DEF17774</a:Id>";
requestMain += " <a:LogicalName>contact</a:LogicalName>";
requestMain += " <a:Name i:nil=\"true\" />";
requestMain += " </a:EntityReference>";
requestMain += " </b:value>";
requestMain += " </a:KeyValuePairOfstringanyType>";
requestMain += " </a:Parameters>";
requestMain += " <a:RequestId i:nil=\"true\" />";
requestMain += " <a:RequestName>Disassociate</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.DisassociateResponse(req, successCallback, errorCallback); };
req.send(requestMain);
},
DisassociateResponse: 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.DisassociateRequest function from your form jscript handler.
Thats all there is to it!
I hope this helps!
hi jamie
ReplyDeleteyour posts are very help full to CRM developers
Thanks for your posts
Thank you!
Delete