Showing posts with label Crm_Plugins. Show all posts
Showing posts with label Crm_Plugins. Show all posts

Friday 22 March 2013

Retrieving Marketing List members  in MSCRM  Statsic VS Dynamic:

Firstly, let’s identify the main difference between a static and dynamic Marketing List. A static Marketing List allows you to use Lookup or Advanced Find to add or remove members from the list. However, this is a manual process.
A dynamic Marketing List allows you to setup parameters to control which records will be added or removed from a list. For example, you can setup your dynamic Marketing List to include all Contacts who live in Auckland. Whenever a new Contact is created and has their City set to “Auckland”, CRM will automatically add them to the Marketing List.
The next important difference to note is the way in which Marketing List members are stored in the CRM database. Like Dynamics CRM 4.0, information regarding members belonging to a static Marketing List is stored in two tables. These are:
List – This table stores information about the Marketing List itself.
List Member – This is an intersect table which links a Contact, Account, or Lead to a particular Marketing List.
 Retrieving Marketing List Members in CRM 2011
For example, if we have a Contact in a static Marketing List, the intersect table will store the ContactId and the ListId to associate both records together.
Let’s contrast this with a dynamic Marketing List which doesn’t use the List or List Member tables at all. Instead, the Listtable stores a field called Query which stores a FetchXML query string to determine the Marketing List members. Carrying on with the example above, we would have a FetchXML representation of “all Contacts who live in Auckland”. When the Marketing List is opened in CRM and a user clicks on Marketing List Members, CRM will run the FetchXML query at runtime and display the results to the user.
 Retrieving Marketing List Members in CRM 2011

Code to get the execution entity id , name  in MSCRM custom Workflow:


IWorkflowContext contexto = context.GetExtension<IWorkflowContext>();
String entityName = contexto.PrimaryEntityName;
Guid entityId = contexto.PrimaryEntityId;
C# code to execute custom workflow in MSCRM 2011:


ExecuteWorkflowRequest request = new ExecuteWorkflowRequest()
{
    WorkflowId = _workflowId,
    EntityId = _leadId
};
Console.Write("Created ExecuteWorkflow request, ");

// Execute the workflow.
ExecuteWorkflowResponse response =
    (ExecuteWorkflowResponse)_serviceProxy.Execute(request);

code to retrieve the Marketing lIst memebers in MSCRM 2011:


Query Expression: we will fetch 5000 records first then next 5000 ...continued... more useful in custom workflows

 ArrayList memberGuids = new ArrayList();                        
                        PagingInfo pageInfo = new PagingInfo();
                         pageInfo.Count = 5000;
                         pageInfo.PageNumber = 1;

                        QueryByAttribute query = new QueryByAttribute("listmember");
                         // pass the guid of the Static marketing list
                        query.AddAttributeValue("listid", marketingListId);
                         query.ColumnSet = new ColumnSet(true);
                         EntityCollection entityCollection = service.RetrieveMultiple(query);

                        foreach (Entity entity in entityCollection.Entities)
                         {
                         memberGuids.Add(((EntityReference) entity.Attributes["entityid"]).Id);
                         }

                        // if list contains more than 5000 records
                         while (entityCollection.MoreRecords)
                         {
                         query.PageInfo.PageNumber += 1;
                         query.PageInfo.PagingCookie = entityCollection.PagingCookie;
                         entityCollection = service.RetrieveMultiple(query);

                        foreach (Entity entity in entityCollection.Entities)
                         {
                         memberGuids.Add(((EntityReference)entity.Attributes["entityid"]).Id);
                         }
                         }











Fetch XML:

string ListMembersfetchXml = @"<fetch version=""1.0"" output-format=""xml-platform"" mapping=""logical"" distinct=""false"">
                                                                      <entity name=""listmember"">
                                                                            <attribute name=""entityid"" />
                                                                            <attribute name=""entitytype"" />                                                      
                                                                            <filter type=""and"">
                                                                              <condition attribute=""listid"" operator=""eq""  value=""" + new Guid(marketingListId) + @""" />
                                                                            </filter>
                                                                      </entity>
                                                                     </fetch>";

                                                EntityCollection listMemberResult = service.RetrieveMultiple(new FetchExpression(ListMembersfetchXml));






Javascript code: BY NIshanth Rana

// call this function and pass the id of the static marketing list to it
 function GetAllMembers(listGuid)
 {

 _oService='';
 _sOrgName = "";
 memberArray = new Array();
 morePages = 'true';
 pageNumber = 1;
 pageCookie = '';
 recordGuid='';
 XMLHTTPSUCCESS = 200;
 XMLHTTPREADY = 4;

 context = typeof (Xrm) == "undefined" ? GetGlobalContext() : Xrm.Page.context;
 var _sServerUrl = context.getServerUrl();
 if (_sServerUrl.match(/\/$/)) {
 _sServerUrl= _sServerUrl.substring(0, serverUrl.length - 1);
 }

 GetMarketingListMembers(listGuid);

}

function GetMarketingListMembers(listGuid) {

 fetchOnLoad(pageNumber, pageCookie, listGuid);

for (var i = 0; i < memberArray.length; i++) {

alert(memberArray[i]);
 // Iterates over numeric indexes from 0 to 5, as everyone expects
 }
 }

function fetchOnLoad(pageNumber, pageCookie, listGuid) {

 recordGuid = listGuid;

var sFetch = "<fetch mapping='logical' page='" + pageNumber + "' count='5000' paging-cookie='" + pageCookie + "' version='1.0'>" +
 "<entity name='listmember'>" +
 "<attribute name='entityid' />" +
 "<filter>" +
 "<condition attribute='listid' operator='eq' value='" + recordGuid + "' />" +
 "</filter>" +
 "</entity>" +
 "</fetch>";

_oService = new FetchUtil(_sOrgName, _sServerUrl);
 _oService.Fetch(sFetch, myCallBack);

}
 function myCallBack(results) {

// add all the member in the array

for (i in results) {
 memberArray.push(results[i].attributes.entityid.guid);
 }

if (morePages == 'true') {
 fetchOnLoad(pageNumber, pageCookie, recordGuid);
 }

}

function FetchUtil(sOrg, sServer) {
 this.org = sOrg;
 this.server = sServer;
 if (sOrg == null) {
 if (typeof(ORG_UNIQUE_NAME) != "undefined") {
 this.org = ORG_UNIQUE_NAME;
 }
 }
 if (sServer == null) {
 this.server = window.location.protocol + "//" + window.location.host;
 }
 }

FetchUtil.prototype._ExecuteRequest = function(sXml, sMessage, fInternalCallback, fUserCallback) {
 var xmlhttp = new XMLHttpRequest();
 xmlhttp.open("POST", this.server + "/XRMServices/2011/Organization.svc/web", false);
 xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*");
 xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
 xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
 if (fUserCallback != null) {
 //asynchronous: register callback function, then send the request.
 var crmServiceObject = this;
 xmlhttp.onreadystatechange = function() {
 fInternalCallback.call(crmServiceObject, xmlhttp, fUserCallback)
 };
 xmlhttp.send(sXml);
 } else {
 //synchronous: send request, then call the callback function directly
 xmlhttp.send(sXml);
 return fInternalCallback.call(this, xmlhttp, null);
 }
 }
 FetchUtil.prototype._HandleErrors = function(xmlhttp) {
 /// <summary>(private) Handles xmlhttp errors</summary>
 if (xmlhttp.status != XMLHTTPSUCCESS) {
 var sError = "Error: " + xmlhttp.responseText + " " + xmlhttp.statusText;
 alert(sError);
 return true;
 } else {
 return false;
 }
 }
 FetchUtil.prototype.Fetch = function(sFetchXml, fCallback) {
 /// <summary>Execute a FetchXml request. (result is the response XML)</summary>
 /// <param name="sFetchXml">fetchxml string</param>
 /// <param name="fCallback" optional="true" type="function">(Optional) Async callback function if specified. If left null, function is synchronous </param>
 var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
 request += "<s:Body>";
 request += "<Execute xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services'>" + "<request i:type=\"b:RetrieveMultipleRequest\" " + ' xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" ' + ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' + '<b:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">' + '<b:KeyValuePairOfstringanyType>' + '<c:key>Query</c:key>' + '<c:value i:type="b:FetchExpression">' + '<b:Query>';
 request += CrmEncodeDecode.CrmXmlEncode(sFetchXml);
 request += '</b:Query>' + '</c:value>' + '</b:KeyValuePairOfstringanyType>' + '</b:Parameters>' + '<b:RequestId i:nil="true"/>' + '<b:RequestName>RetrieveMultiple</b:RequestName>' + '</request>' + '</Execute>';
 request += "</s:Body></s:Envelope>";
 return this._ExecuteRequest(request, "Fetch", this._FetchCallback, fCallback);
 }

FetchUtil.prototype._FetchCallback = function(xmlhttp, callback) {
 ///<summary>(private) Fetch message callback.</summary>
 //xmlhttp must be completed
 if (xmlhttp.readyState != XMLHTTPREADY) {
 return;
 }
 //check for server errors
 if (this._HandleErrors(xmlhttp)) {
 return;
 }
 var moreRecordsXML = xmlhttp.responseXML.selectSingleNode("//a:MoreRecords").text;
 if (moreRecordsXML == 'true') {
 morePages = 'true';
 pageCookie = xmlhttp.responseXML.selectSingleNode("//a:PagingCookie").text;
 pageCookie = pageCookie.replace( /\"/g , '\'');
 pageCookie = pageCookie.replace( /</g , '&lt;');
 pageCookie = pageCookie.replace( />/g , '&gt;');
 pageCookie = pageCookie.replace( /'/g , '&quot;');
 pageNumber = pageNumber + 1;
 } else {
 morePages = 'false';
 }

// get the value of the morerecords

var sFetchResult = xmlhttp.responseXML.selectSingleNode("//a:Entities").xml;
 var resultDoc = new ActiveXObject("Microsoft.XMLDOM");
 resultDoc.async = false;
 resultDoc.loadXML(sFetchResult);
 //parse result xml into array of jsDynamicEntity objects
 var results = new Array(resultDoc.firstChild.childNodes.length);
 for (var i = 0; i < resultDoc.firstChild.childNodes.length; i++) {
 var oResultNode = resultDoc.firstChild.childNodes[i];
 var jDE = new jsDynamicEntity();
 var obj = new Object();
 for (var j = 0; j < oResultNode.childNodes.length; j++) {
 switch (oResultNode.childNodes[j].baseName) {
 case "Attributes":
 var attr = oResultNode.childNodes[j];
 for (var k = 0; k < attr.childNodes.length; k++) {
 // Establish the Key for the Attribute
 var sKey = attr.childNodes[k].firstChild.text;
 var sType = "";
 // Determine the Type of Attribute value we should expect
 for (var l = 0; l < attr.childNodes[k].childNodes[1].attributes.length; l++) {
 if (attr.childNodes[k].childNodes[1].attributes[l].baseName == 'type') {
 sType = attr.childNodes[k].childNodes[1].attributes[l].text;
 }
 }
 switch (sType) {
 case "a:OptionSetValue":
 var entOSV = new jsOptionSetValue();
 entOSV.type = sType;
 entOSV.value = attr.childNodes[k].childNodes[1].text;
 obj[sKey] = entOSV;
 break;
 case "a:EntityReference":
 var entRef = new jsEntityReference();
 entRef.type = sType;
 entRef.guid = attr.childNodes[k].childNodes[1].childNodes[0].text;
 entRef.logicalName = attr.childNodes[k].childNodes[1].childNodes[1].text;
 entRef.name = attr.childNodes[k].childNodes[1].childNodes[2].text;
 obj[sKey] = entRef;
 break;
 default:
 var entCV = new jsCrmValue();
 entCV.type = sType;
 entCV.value = attr.childNodes[k].childNodes[1].text;
 obj[sKey] = entCV;
 break;
 }
 }
 jDE.attributes = obj;
 break;
 case "Id":
 jDE.guid = oResultNode.childNodes[j].text;
 break;
 case "LogicalName":
 jDE.logicalName = oResultNode.childNodes[j].text;
 break;
 case "FormattedValues":
 var foVal = oResultNode.childNodes[j];
 for (var k = 0; k < foVal.childNodes.length; k++) {
 // Establish the Key, we are going to fill in the formatted value of the already found attribute
 var sKey = foVal.childNodes[k].firstChild.text;
 jDE.attributes[sKey].formattedValue = foVal.childNodes[k].childNodes[1].text;
 }
 break;
 }
 }
 results[i] = jDE;
 }
 //return entities
 if (callback != null) callback(results);
 else return results;
 }

function jsDynamicEntity(gID, sLogicalName) {
 this.guid = gID;
 this.logicalName = sLogicalName;
 this.attributes = new Object();
 }

function jsCrmValue(sType, sValue) {
 this.type = sType;
 this.value = sValue;
 }

function jsEntityReference(gID, sLogicalName, sName) {
 this.guid = gID;
 this.logicalName = sLogicalName;
 this.name = sName;
 this.type = 'EntityReference';
 }

function jsOptionSetValue(iValue, sFormattedValue) {
 this.value = iValue;
 this.formattedValue = sFormattedValue;
 this.type = 'OptionSetValue';
 }







Plugin message for the Marketing list Association to Campaign in MSCRM 2011:


Message : ADDITEM meesage will be fired when Marketing list Association to Campaign but not The Association message

Primary entity is : Campaign

Input parameters received in plugin context is:

1. Entity name: List
2. Campaign id: Campaign Guid
3.  Entity id: Associated marketing List Guid

Sample code:



if (context.InputParameters.Contains("EntityName"))
                        {
                            if (context.InputParameters["EntityName"].ToString() == "list")
                            {
                                if (context.InputParameters.Contains("EntityId"))
                                {
                                    marketingListId = context.InputParameters["EntityId"].ToString();
                                }
                                if (context.InputParameters.Contains("CampaignId"))
                                {
                                    campaignId = context.InputParameters["CampaignId"].ToString();
                                 }
                             }
                         }

Monday 11 March 2013




How to Debug CRM 2011 online plugin  BY Guru Prasad



 its difficult to debug plugins registered in sandbox on CRM 2011 online version. Follow the Steps to debug plugins registered for online version
  • Install Plugin Pro-filer in the plugin registration Tool.(if you don’t find this option, download latest SDK)
  • Now Register the plug-in and step on the Microsoft Dynamics CRM server. Keep a copy of the debug compiled plug-in assembly on the computer where you are running the tool(@SDK\sdk\tools\pluginregistration\bin\Debug)
  • Select a plug-in step and click Profile to enable profiling.
  •  Perform the operation in Microsoft Dynamics CRM that causes the plug-in to run. Ex: Here updation of Account which trigger the plugin.
  • Now the plug-in throws an exception and the Business Process Error dialog is displayed, click Download Log File and save this file.
  • In the Plug-in Registration tool, click Debug.

  • Debug Dialog will open

            select the Saved Error Log File in the “Profile Location” and then select the Plugin assembly location in the “Assembly Location” where .rdb file available to debug. select the plugin which needs to be debug in the “Plug-in” dropdown list.

    • Now open the plugin solution in Visual Studio and then place the break point to debug, attach the debugger to PluginRegistration.exe process.
    • Click Start Plug-in Execution in the Debug Existing Plug-in dialog box
    • Now the debugger will start debugging from the break point in  the VS. Now you can debug the plugin in the normal way like on-premise.
    Unable to connect to plugin registration toll for online mscrm polaris:

    Try browsing to Settings --> Customizations --> Developer Resources and use the URL under Discovery Service.  It looks like with the change to the new authentication system they changed the default discovery service URL for CRM online to use disco.crm.dynamics.com rather than the old dev.crm.dynamics.com. For the plugin registration tool exclude the /XRMservices/2011/Discovery.svc  part of the url, the tool appends that the URL you enter either way.


    Mscrm 2011 plugin syntax on opportunity lose message:


    public void CloseAssociatedOpportunity(IPluginExecutionContext context, IOrganizationService service)
            {
                if (context.InputParameters.Contains("EntityMoniker") &&
                              context.InputParameters["EntityMoniker"] is EntityReference
                    && context.PostEntityImages.Contains("PostImage") && context.PostEntityImages["PostImage"] is Entity)

                {
                    List<Guid> opportunityIds = new List<Guid>();
                    EntityReference entity = (EntityReference)context.InputParameters["EntityMoniker"];
                    OptionSetValue state = (OptionSetValue)context.InputParameters["State"];
                    OptionSetValue status = (OptionSetValue)context.InputParameters["Status"];

                    //state 1 = Inactivate : state 0 = Activate
                    if (entity.LogicalName == "tls_joborder" && state.Value == 1)
                    {
                        //Fecth the associated Opportunities of the Job Order
                        opportunityIds = GetOpportunitiesIds(service, entity.Id);

                        // Fetching Opportunity selected in the Lookup
                        if(context.PostEntityImages["PostImage"].Contains("tls_opportunity")
                            && !String.IsNullOrEmpty(((EntityReference)context.PostEntityImages["PostImage"].Attributes["tls_opportunity"]).Id.ToString()))
                           opportunityIds.Add(((EntityReference)context.PostEntityImages["PostImage"].Attributes["tls_opportunity"]).Id);

                        if (opportunityIds.Count > 0)
                        {
                            foreach (Guid opprtunityId in opportunityIds)
                            {
                                CloseOpportunitiesAsLost(service, opprtunityId);
                            }
                        }

                    }
                }
            }


    Mscrm 2011 C# code to close the opportunity as Lost :

     public void CloseOpportunitiesAsLost(IOrganizationService service, Guid opportunityId)
            {

                Entity entity = new Entity("opportunityclose");
                entity["opportunityid"] = new EntityReference("opportunity", opportunityId);
                entity["actualend"] = DateTime.Now;
                LoseOpportunityRequest woReq = new LoseOpportunityRequest();            
                woReq.OpportunityClose = entity;
                woReq.Status = new OptionSetValue(-1);
                service.Execute(woReq);

            }

    Mscrm 2011 plugin: direct fetch xml synatx  used for retrieve

     public List<Guid> GetRelatedPracticeGroupIds(IOrganizationService service, Guid accountId)
            {
                List<Guid> PracticeGroupIds = new List<Guid>();
                string fetchXml = @"<fetch version=""1.0"" output-format=""xml-platform"" mapping=""logical"" distinct=""true"">
                          <entity name=""lrl_practicegroup"">
                            <attribute name=""lrl_practicegroupid"" />
                            <order attribute=""lrl_name"" descending=""false"" />
                            <link-entity name=""lrl_lrl_practicegroup_account"" from=""lrl_practicegroupid"" to=""lrl_practicegroupid"" visible=""false"" intersect=""true"">
                              <link-entity name=""account"" from=""accountid"" to=""accountid"" alias=""ac"">
                                <filter type=""and"">
                                  <condition attribute=""accountid"" operator=""eq"" uitype=""account"" value=""" + accountId + @""" />
                                </filter>
                              </link-entity>
                            </link-entity>
                          </entity>
                        </fetch>";

                EntityCollection Result = service.RetrieveMultiple(new FetchExpression(fetchXml));
                if (Result.Entities.Count > 0)
                {

                    foreach (Entity node in Result.Entities)
                    {
                        PracticeGroupIds.Add(node.Id);
                    }
                }
                return PracticeGroupIds;



            }
         
            }



    Mscrm 2011 plugin registered on Associate message code:


     //Getting the Relationship Name ,Target(Practice group id) and Relted entity (Account ID)


                        if (!context.InputParameters.Contains("Relationship")) { return; }
                        Relationship relationship = (Relationship)context.InputParameters["Relationship"];
                        if (relationship.SchemaName != "lrl_lrl_practicegroup_account") { return; }
                        if (!context.InputParameters.Contains("Target")) { return; }
                        EntityReference target = (EntityReference)context.InputParameters["Target"];
                        Guid practiceGroupId = target.Id;
                        if (!context.InputParameters.Contains("RelatedEntities")) { return; }
                        EntityReferenceCollection related = (EntityReferenceCollection)context.InputParameters["RelatedEntities"];
                        foreach (EntityReference entityReferenceObj in related)
                        {
                            accountId = entityReferenceObj.Id;
                        }
                         


    Mscrm 2011 plugin: direct fetch XML syntax  used for retrieve:

     public List<Guid> GetRelatedPracticeGroupIds(IOrganizationService service, Guid accountId)
            {
                List<Guid> PracticeGroupIds = new List<Guid>();
                string fetchXml = @"<fetch version=""1.0"" output-format=""xml-platform"" mapping=""logical"" distinct=""true"">
                          <entity name=""lrl_practicegroup"">
                            <attribute name=""lrl_practicegroupid"" />
                            <order attribute=""lrl_name"" descending=""false"" />
                            <link-entity name=""lrl_lrl_practicegroup_account"" from=""lrl_practicegroupid""    to=""lrl_practicegroupid"" visible=""false"" intersect=""true"">
                              <link-entity name=""account"" from=""accountid"" to=""accountid"" alias=""ac"">
                                <filter type=""and"">
                                  <condition attribute=""accountid"" operator=""eq"" uitype=""account"" value=""" +               accountId + @""" />
                                </filter>
                              </link-entity>
                            </link-entity>
                          </entity>
                        </fetch>";

                EntityCollection Result = service.RetrieveMultiple(new FetchExpression(fetchXml));
                if (Result.Entities.Count > 0)
                {

                    foreach (Entity node in Result.Entities)
                    {
                        PracticeGroupIds.Add(node.Id);
                    }
                }
                return PracticeGroupIds;



            }
         
            }



    Mscrm C# code for associate and disassociate:

     #region Associate

                                            AssociateRequest associatePracticeGroup = new AssociateRequest
                                            {
                                                Target = new EntityReference("lrl_practicegroup", practiceGroupId),
                                                RelatedEntities = new EntityReferenceCollection
                                              {
                                              new EntityReference("account", parentAccountId)
                                             },
                                                Relationship = new Relationship("lrl_lrl_practicegroup_account")
                                            };

                                            // Execute the request.
                                            service.Execute(associatePracticeGrou
      #endregion

     #region DisAssociate
     DisassociateRequest disassociatePracticeGroup = new DisassociateRequest
                                                {
                                                    Target = new EntityReference("lrl_practicegroup", practiceGroupId),
                                                    RelatedEntities = new EntityReferenceCollection
                                                 {
                                                 new EntityReference("account", parentAccountId)
                                                  },
                                                    Relationship = new Relationship("lrl_lrl_practicegroup_account")
                                                };

                                                // Execute the request.
                                                service.Execute(disassociatePracticeGroup);

      #endregion

    Monday 1 October 2012


    FetchXML syntax:


    Legend:

              Xxxx :=   à production

              (   ) à choice

              | à or

              ? à optional

              * à repeat

    // à comments

     

    FetchXml :=

      <fetch

        (page='page-number')? // start page default is 0

        (count='items-per-page')? // count default is 5000

        (utc-offset='utc-offset')? // utc-offset default is 0

        (mapping='logical')?

        (distinct = ('true' | 'false' | '1' | '0') )? //default false

        (paging-cookie='page-cookie')?

       >

        <entity name='entity-name'>

        Entity-Xml

        </entity>

      </fetch>

     

     Example:

    <fetch page=‘10’ count=‘50’ distinct=‘true’

         page-cookie=‘Page1’>

        <entity name=‘account’ >

        …. Put Entity-Xml here ….

        </entity>

    </fetch>

     

     

     

              Entity-Xml :=

              (<all-attributes/> | <no-attrs/> |Attribute-Xml* )

                ( Filter-Xml |  LinkEntity-Xml |  Order-Xml )*

              Attribute-Xml :=

                <attribute name='attr-name'

                  (aggregate=(AggOp) alias='alias-name')?

                />

              AggOp :=

              (avg | min | max | count(*) |count(attribute name))

              Filter-Xml :=

                <filter (type= ('or' | 'and'))? // default is 'and'  >

                ( Condition-Xml | Filter-Xml )*

                </filter>

               

              LinkEntity-Xml :=

                <link-entity name = 'entity-name'

                  // to is the column on the remote entity

                  (to = 'column-name')? 

                  // from is the column on the local entity

                  (from = 'column-name')? 

                  (alias = 'table-alias')?

                  (link-type = ('natural' | 'inner' | 'outer'))?

                >

                Entity-Xml

                </link-entity>

              Order-Xml :=

                <order attribute='attr-name'

                  (descending= ('true' | 'false' | '1' | '0')?

                />

     

     

    Thursday 13 September 2012

    Plugin tips:

    Prevalidation stage example:

    Requirement:
    while deleting account, check for all lthe sub contcts associated to accounts. and if sub contacts exist donot delete.

    Issue:
    If we register plugin in pre event to  chec the associated contacts for this account , we will not get zero accounts allways ,

    Solution: need to register plugin in prevalidation, then we will get associated contacts .




     
    Pros of using early binding in mscrm 2011:

    • East to verify entity and attribute names at compile time.
    • Take the advantage of intelligence while coding.

    cons of using early binding in mscrm 2011:

    • Slightly lowe performance compared to the code in late binding.
    • Not possible to write generic code which will be support future expansion.