Thursday, June 30, 2011

Change Business Unit for System User in Microsoft Dynamics CRM 2011 in Jscript or .NET

This illustration shows how to change or update the business unity for a systemuser / user in Microsoft Dynamics CRM 2011 in code in jscript and also C#  using the SetBusinessSystemUserRequest.   This example will be given in SOAP (JScript) and in C# (.NET).

Ok, here is what the code look like!
First in C#:

SetBusinessSystemUserRequest req = new SetBusinessSystemUserRequest();
//business unit to assign user to
req.BusinessId = new Guid("9225A2E5-4970-E011-8D78-1CC1DEE8DA78");

//user to re-assign
req.UserId = new Guid("E497532F-D37C-E011-8D72-1CC1DEE8EA49");

//can be a different team or systemuser, used to reassign records owned by person
req.ReassignPrincipal = new EntityReference("systemuser", new Guid("F97371A0-E669-45C7-B611-267E7F2B7E9F"));

SetBusinessSystemUserResponse resp = (SetBusinessSystemUserResponse)service.Execute(req);

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:

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;
               }, 
           SetBusinessSystemUserRequest: 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=\"b:SetBusinessSystemUserRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
               requestMain += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
               requestMain += "          <a:KeyValuePairOfstringanyType>";
               requestMain += "            <c:key>UserId</c:key>";
               requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">e497532f-d37c-e011-8d72-1cc1dee8ea49</c:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "          <a:KeyValuePairOfstringanyType>";
               requestMain += "            <c:key>BusinessId</c:key>";
               requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">9225a2e5-4970-e011-8d78-1cc1dee8da78</c:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "          <a:KeyValuePairOfstringanyType>";
               requestMain += "            <c:key>ReassignPrincipal</c:key>";
               requestMain += "            <c:value i:type=\"a:EntityReference\">";
               requestMain += "              <a:Id>f97371a0-e669-45c7-b611-267e7f2b7e9f</a:Id>";
               requestMain += "              <a:LogicalName>systemuser</a:LogicalName>";
               requestMain += "              <a:Name i:nil=\"true\" />";
               requestMain += "            </c:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>SetBusinessSystemUser</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.SetBusinessSystemUserResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       SetBusinessSystemUserResponse: 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.SetBusinessSystemUserRequest function from your form jscript handler.
Thats all there is to it!

I hope this helps!

Wednesday, June 29, 2011

Check if an Entity Can be the Primary Entity in a One-To-Many Relationship in Microsoft Dynamics CRM in Jscript or .NET

This illustration shows how to check if an entity can be the primary entity in a one-to-many relationship in Microsoft Dynamics CRM 2011 in code in jscript and also C#  using the CanBeReferencedRequest.   This example will be given in SOAP (JScript) and in C# (.NET).

Ok, here is what the code look like!
First in C#:

CanBeReferencedRequest canBeReferencedRequest = new CanBeReferencedRequest
{
    EntityName = "account"
};

CanBeReferencedResponse canBeReferencedResponse =
    (CanBeReferencedResponse)service.Execute(canBeReferencedRequest);

//here is how to get the response boolean value
bool result = canBeReferencedResponse.CanBeReferenced;

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:

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;
               }, 
           CanBeReferencedRequest: 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:CanBeReferencedRequest\" 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>EntityName</b:key>";
               requestMain += "            <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">account</b:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>CanBeReferenced</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.CanBeReferencedResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       CanBeReferencedResponse: 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.CanBeReferencedRequest function from your form jscript handler.
Thats all there is to it!

I hope this helps!

Tuesday, June 28, 2011

Delete an Option Set using Jscript or .NET in Microsoft Dynamics CRM 2011

This illustration shows how to delete an option set in Microsoft Dynamics CRM 2011 in code in jscript and also C#  using the DeleteOptionSet Request.   This example will be given in SOAP (JScript) and in C# (.NET).

Ok, here is what the code look like!
First in C#:

DeleteOptionSetRequest req = new DeleteOptionSetRequest
{
    Name = "new_testoptionset"
};

DeleteOptionSetResponse response = (DeleteOptionSetResponse)service.Execute(req);

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:

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;
               }, 
           DeleteOptionSetRequest: 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:DeleteOptionSetRequest\" 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>Name</b:key>";
               requestMain += "            <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">new_testoptionset2</b:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>DeleteOptionSet</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.DeleteOptionSetResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       DeleteOptionSetResponse: 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.DeleteOptionSetRequest function from your form jscript handler.
Thats all there is to it!

I hope this helps!

Monday, June 27, 2011

Create an Option Set using Jscript and .NET in Microsoft Dynamics CRM 2011

This illustration shows how to create an option set in Microsoft Dynamics CRM 2011 in code in jscript and also C#  using the CreateOptionSet Request.   This example will be given in SOAP (JScript) and in C# (.NET).

Ok, here is what the code look like!
First in C#:

CreateOptionSetRequest createOptionSetRequest = new CreateOptionSetRequest
{
    // Create a global option set (OptionSetMetadata).
    OptionSet = new OptionSetMetadata
    {
        Name = "new_testoptionset",
        DisplayName = new Label("Example Option Set", 1033),
        IsGlobal = true,
        OptionSetType = OptionSetType.Picklist,
        Options = 
   {
       new OptionMetadata(new Label("yellow", 1033), null),
       new OptionMetadata(new Label("green", 1033), null),
       new OptionMetadata(new Label("blue", 1033), null),
       new OptionMetadata(new Label("brown", 1033), null)
   }
    }
};

// Execute the request.
CreateOptionSetResponse optionsResp =
    (CreateOptionSetResponse)service.Execute(createOptionSetRequest);

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:

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;
               }, 
           CreateOptionSetRequest: 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:CreateOptionSetRequest\" 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 i:nil=\"true\" />";
               requestMain += "              <c:Description i:nil=\"true\" />";
               requestMain += "              <c:DisplayName>";
               requestMain += "                <a:LocalizedLabels>";
               requestMain += "                  <a:LocalizedLabel>";
               requestMain += "                    <a:IsManaged i:nil=\"true\" />";
               requestMain += "                    <a:Label>Example Option Set</a:Label>";
               requestMain += "                    <a:LanguageCode>1033</a:LanguageCode>";
               requestMain += "                  </a:LocalizedLabel>";
               requestMain += "                </a:LocalizedLabels>";
               requestMain += "                <a:UserLocalizedLabel i:nil=\"true\" />";
               requestMain += "              </c:DisplayName>";
               requestMain += "              <c:IsCustomOptionSet i:nil=\"true\" />";
               requestMain += "              <c:IsCustomizable i:nil=\"true\" />";
               requestMain += "              <c:IsGlobal>true</c:IsGlobal>";
               requestMain += "              <c:IsManaged i:nil=\"true\" />";
               requestMain += "              <c:Name>new_testoptionset2</c:Name>";
               requestMain += "              <c:OptionSetType>Picklist</c:OptionSetType>";
               requestMain += "              <c:Options>";
               requestMain += "                <c:OptionMetadata>";
               requestMain += "                  <c:MetadataId i:nil=\"true\" />";
               requestMain += "                  <c:Description i:nil=\"true\" />";
               requestMain += "                  <c:IsManaged i:nil=\"true\" />";
               requestMain += "                  <c:Label>";
               requestMain += "                    <a:LocalizedLabels>";
               requestMain += "                      <a:LocalizedLabel>";
               requestMain += "                        <a:IsManaged i:nil=\"true\" />";
               requestMain += "                        <a:Label>yellow</a:Label>";
               requestMain += "                        <a:LanguageCode>1033</a:LanguageCode>";
               requestMain += "                      </a:LocalizedLabel>";
               requestMain += "                    </a:LocalizedLabels>";
               requestMain += "                    <a:UserLocalizedLabel i:nil=\"true\" />";
               requestMain += "                  </c:Label>";
               requestMain += "                  <c:Value i:nil=\"true\" />";
               requestMain += "                </c:OptionMetadata>";
               requestMain += "                <c:OptionMetadata>";
               requestMain += "                  <c:MetadataId i:nil=\"true\" />";
               requestMain += "                  <c:Description i:nil=\"true\" />";
               requestMain += "                  <c:IsManaged i:nil=\"true\" />";
               requestMain += "                  <c:Label>";
               requestMain += "                    <a:LocalizedLabels>";
               requestMain += "                      <a:LocalizedLabel>";
               requestMain += "                        <a:IsManaged i:nil=\"true\" />";
               requestMain += "                        <a:Label>green</a:Label>";
               requestMain += "                        <a:LanguageCode>1033</a:LanguageCode>";
               requestMain += "                      </a:LocalizedLabel>";
               requestMain += "                    </a:LocalizedLabels>";
               requestMain += "                    <a:UserLocalizedLabel i:nil=\"true\" />";
               requestMain += "                  </c:Label>";
               requestMain += "                  <c:Value i:nil=\"true\" />";
               requestMain += "                </c:OptionMetadata>";
               requestMain += "                <c:OptionMetadata>";
               requestMain += "                  <c:MetadataId i:nil=\"true\" />";
               requestMain += "                  <c:Description i:nil=\"true\" />";
               requestMain += "                  <c:IsManaged i:nil=\"true\" />";
               requestMain += "                  <c:Label>";
               requestMain += "                    <a:LocalizedLabels>";
               requestMain += "                      <a:LocalizedLabel>";
               requestMain += "                        <a:IsManaged i:nil=\"true\" />";
               requestMain += "                        <a:Label>blue</a:Label>";
               requestMain += "                        <a:LanguageCode>1033</a:LanguageCode>";
               requestMain += "                      </a:LocalizedLabel>";
               requestMain += "                    </a:LocalizedLabels>";
               requestMain += "                    <a:UserLocalizedLabel i:nil=\"true\" />";
               requestMain += "                  </c:Label>";
               requestMain += "                  <c:Value i:nil=\"true\" />";
               requestMain += "                </c:OptionMetadata>";
               requestMain += "                <c:OptionMetadata>";
               requestMain += "                  <c:MetadataId i:nil=\"true\" />";
               requestMain += "                  <c:Description i:nil=\"true\" />";
               requestMain += "                  <c:IsManaged i:nil=\"true\" />";
               requestMain += "                  <c:Label>";
               requestMain += "                    <a:LocalizedLabels>";
               requestMain += "                      <a:LocalizedLabel>";
               requestMain += "                        <a:IsManaged i:nil=\"true\" />";
               requestMain += "                        <a:Label>brown</a:Label>";
               requestMain += "                        <a:LanguageCode>1033</a:LanguageCode>";
               requestMain += "                      </a:LocalizedLabel>";
               requestMain += "                    </a:LocalizedLabels>";
               requestMain += "                    <a:UserLocalizedLabel i:nil=\"true\" />";
               requestMain += "                  </c:Label>";
               requestMain += "                  <c:Value i:nil=\"true\" />";
               requestMain += "                </c:OptionMetadata>";
               requestMain += "              </c:Options>";
               requestMain += "            </b:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>CreateOptionSet</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.CreateOptionSetResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       CreateOptionSetResponse: 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.CreateOptionSetRequest function from your form jscript handler.
Thats all there is to it!

I hope this helps!

Friday, June 24, 2011

70-503 WCF .NET 3.5 MSDN Study Links By Exam Topic and SubTopic

Here is another Nial Merrigan style post covering the 70-503 that I just passed with a 972/1000. As part of my study I put together a set of links from the MSDN by topic and subtopic. It's a little trick I picked up from Nial, who is truly a certification guru. Here is my study guide.


70-503 by topic

Creating Services (19 percent)

               Contracts

·         

·        Define Service contracts.









·        Define Data contracts.





·        Define Operation contracts.








o   WebGetAttribute Class  - uri template

o    




·        Define Message contracts.





·        Process generic messages.





o    

·         

Exposing and Deploying Services (23 percent)

·        Create and configure service endpoints.




















·        Manage consistency between life cycle, sessions, concurrency, and bindings.





o   basicHttpBinding  (Broadest Number of web service toolkits, has transport security)





o    








o   WAS





o    










·        Host a service in a managed application.






o   Hosting




·        Host a service on a Web server.









·        Create custom behaviors.




Instrumenting and Administering Services (11 percent)

·        Implement end-to-end service tracing.






·        Monitor service health.




    •  

·        Log messages.




o   WCF errors end up in application event log

o    



    •  

·        Dynamically configure the service by using the service model.




    •  

·        Implement inspectors.









Consuming Services (16 percent)





o    



·        Create a service proxy.





·        Configure the client endpoint.




o   Configuring Client Behaviors




  •  

·        Call a service by using a service proxy.




·        Handle exceptions on clients.











·        Consume non-WCF services.



Securing Services (16 percent)







o    

·        Implement transport-level security.

o   basicHttpBinding  (Broadest Number of web service toolkits, has transport security)





·        Implement message-level security.









·        Authenticate clients.

















·        Authorize clients.









·        Impersonate clients.




Managing the Service Life Cycle (15 percent)

·        Manage instances.

·        Manage sessions.

·        Manage transactions.






·        Manage concurrency.




·        Manage consistency between instances, sessions, transactions, and concurrency.




·        MISC


·         




I hope this helps!