Skip to main content

Capture and Handle event when one entity record is attached through a Many to Many relationship - MS CRM 4

If you have already dug up too much about trying to capture the event when an entity record in MS CRM is attached ~ linked to a record in many to many relationship.


For example, if you have two entities : Supplier and Company in MS CRM where a supplier can do business with many companies and at the same time a Company can order stuff from many suppliers. What if you want to send some notification whenever a new supplier or an existing supplier is linked to a company; similarly you may want to send a notification when a Supplier signs a deal with 2-3 companies and gets linked to those.


Some experts from MS CRM fraternity have suggested some ways to over ride this limitation of MS CRM that it does not expose any event for the above mentioned scenario, below is one of the examples:  
http://ayazahmad.wordpress.com/2009/07/23/event-on-many-to-many-relationship-nn-in-crm-4/

But making changes to the default plugin model of MS CRM to add Associate or Disassociate event is not so easy and simple while going from another approach : Javascript can save your day and you can capture events when records are linked or unlinked into a many to many relationship.
-----------------------------------------------------------------------------------
Here's how to carry this out: action begins :

1. As you can see, first step in javascript approach is to get the id of the IFRAME element that shows the many to many relationship associated view which in this case is Accounts. As you can see below, you can get it by doing a F12, and clicking on the border of the iframe: areanew_new_supplier_accountFrame



2. Then you need to bubble the event when a record is linked in m-m rel. which is the Add Button. For that you need the id of the button, do an F12 to bring the developer toolbar, click on and pick the mouse pointer under HTML tab in the bar and click on the Add Existing Account button, if will show you the html tags behind and and you can see the id here : _MBtoplocAssocObjlnewnewsupplieraccount1 as shown in the blue line in the image.





Also you will need the id of the remove button, you may have this button on the main toolbar of the associated view as shown, or you may find it under More Actions menu with sub-menu label "Remove". Find the id of that button or sub menu using the same F12 method, it has a  very long string as id as can be seen below.




 Now go to the Form load script of the entity form, on form load, and add a function for capturing the readystatechange event because we want to bubble ~ over ride the on click event of the add/remove link buttons  so that we can push our own logic.

Things to notice in the following code :
1. Overriding Add existing click button is straight forward, attach an onclick event

2. Since Remove is a sub option under the More Actions menu, I fould it could not be overridden the same above way, so I had tweaked it's Action property, and appended one statement after the default Action, this extra statement is the function call.

function InitializeIFrameEvents(Iframe) {
  Iframe.onreadystatechange = function IframeButtonEvent() {
    if (Iframe.readyState == 'complete') { 
      var iFrame = frames[window.event.srcElement.id];

          if(Iframe.contentWindow.document.getElementById(' _MBtoplocAssocObjlnewnewsupplieraccount1 ')!=null) 
{ Iframe.contentWindow.document.getElementById(' _MBtoplocAssocObjlnewnewsupplieraccount1 ').attachEvent( "onclick" ,onLinkAdd); }    
         if(Iframe.contentWindow.document.getElementById(' _MIdoActionExcrmGrid....very long id of the remove sub option from more actions menu ')!=null) 
       {         
        removeButton=Iframe.contentWindow.document.getElementById('_MIdoActionExcrmGrid....very long id of the remove sub option from more actions menu');
        removeButton.action=" doActionEx('crmGrid', '10047', top.crmFormSubmit.crmFormSubmitId.value, 'disassociate', top.crmFormSubmit.crmFormSubmitObjectType.value, 'tab=areanew_new_supplier_account&associationName=new_new_supplier_account&roleOrd=2');   window.parent.crmForm.  onLinkRemoved();";
       }

    }
  }
}





InitializeIFrameEvents(document.getElementById(' areanew_new_supplier_accountFrame '));


// Here is the javascript handler for Add Existing button 


function onLinkAdd()  

   alert(' link added'); 
   //  you can write your own code here , maintain a Counter field on form that keeps the number of records linked in this m2m relationship, this can help in situation when you want to send some email on each record linked
}


// And this function is for the remove sub option click


function onLinkRemoved()  

   alert(' link removed'); 
  // you can reset the counter that will maintain the number of linked records
}

And there you go, you can now do whatever you want on the add and remove events, going more advanced, you will want to apply your own filter as to allow only certain records example Accounts with City London to be linked while restrict the other accounts. As you know default MS CRM lookup do not allow you this functionality, to do this, you will have to tweak the method that runs when you link records, and add your condition logic over there, I will explain that example in my next post.

Comments

Unknown said…
As for me it is better to do it with plugins...
hero said…
The only advantage here is you don't have to make changes into plugin model and some entries in the CRM table.
Unknown said…
Nice post ,thanks for sharing .
Dynamics CRM Developers
This is such a great resource that you are providing and you give it away for free. I love seeing websites that understand the value of providing a quality resource for free. It?s the old what goes around comes around routine. Did you acquired lots of links and I see lots of trackbacks??
Dynamics training
Recently, I did not give lots of consideration to leaving responses on site page reports and have positioned responses even less. Reading through by way of your enjoyable article, will assist me to do so sometimes.
Dynamics AX training

This is such a great resource that you are providing and you give it away for free. I love seeing websites that understand the value of providing a quality resource for free. It?s the old what goes around comes around routine. Did you acquired lots of links and I see lots of trackbacks??
Dynamics crm training
Colby said…
Smart stuff. I agree with you 100%!
best gadget reviews
Anonymous said…
Great information of on the Microsoft CRM. But you will be needing a developer to design custom plug-ins. We offer the best Microsoft dynamic CRM development. Take a look.

Popular posts from this blog

IME Mode in MSCRM attribute settings

When you create a new attribute for a MSCRM entity or open an exisitng one to see it's characteristics like data type, min-max values and schema name, you would have seen a property called IME mode, if you would've wondered what it is like me, here is what is got from the MSCRM Online resources
An Input Method Editor (IME) lets you to enter and edit Chinese, Japanese, and Korean characters. These Asian writing systems have more characters than can be encoded for a regular keyboard. The IMEs for these languages use sequences of base characters that describe an individual character or group of characters to enter a larger set of characters. Base characters can be component letters from Hangul syllables, phonetic components for Japanese kanji characters, or various combinations for Chinese characters. You can use the IME mode option to quickly enter these characters and symbols into text boxes, avoiding the manual switch to IME mode that would otherwise be required.Input Method …

Creating Email through Plugin / SDK in CRM 4 - line breaks don't work

You may have noticed when you create email using a sample code like below in a plugin or for that matter any other SDK based assembley for MS CRM. Your line breaks : \n or \r or System.Environment.NewLine will not work.


email Email = new email();
                     Email.to = new activityparty[] { toParty };
                     Email.from = new activityparty[] { fromParty };
                     Email.regardingobjectid = regardingObject;
                     Email.subject = "Hello!!";
                     Email.description = "Dear, line 1" +         
System.Environment.NewLine+
                      "my message for your - line 2";
                     Email.directioncode = new CrmBoolean();
                     Email.directioncode.Value = true;

                     Guid _emailId = _service.Create(Email);

                     SendEmailRequest sendEmailRequest = new SendEmailRequest();
                     sendEmailRequest.EmailId = _emailId;
                     send…

Import MS CRM Product Catalog : Step by Step Part 1

Hi,

Imagine you are working on a project where the client's business has hundreds of products such as a Telecommunication company. When you ask for a list of products they deal with, they give you lengthy brocures with rates, tariffs etc. How would you go about transforming those flashy brochures into MS CRM Products with different categories, product lines, price bundles etc.

Here I describe a step by step technique to import your whole Product Catalog that includes Units, Unit Groups, Products and Pricelists.

> Gather a list of all possible categories, types, map those into one or more MS CRM fields on Product entity : example  Product Type, Subject etc.

* Subject can be really useful in terms of grouping products for Knowledge base articles and Cases are you would generate Cases for select Product; and Sales Literature categoriazation.

> List down those categories in a CSV file, import Sujbects, refer to one of my previous posts on this.

> List all the Unit groups an…