Tuesday 13 May 2014

CRM 2011 / 2013 Mastering Plugin Registration Filtering Attributes

In plugin, we also can filter our logic to do or not to do something. Moreover, for Plugin onUpdate, for example : to prevent user to update AccountCode or Quote Type, or whatever, sometimes our logic only work, for example if Quote type has been changed, then you have to prompt user to say, you cannot change the Quote Type. But, if you only change the Address in Quote, you by default will also hit the plugin, so that you have to filter, like this :

if(entity.Attributes.Contains("tfp_quotetype"))
{
throw new InvalidPluginExecutionException("Hi you cannot change Quote Type");
}

But, again your plugin also will be executed.


Let’s say in your plugin, you update this entity using this plugin, this also can cause infinite looping for updating.


In this post, I would like to know to filter Attribute that you don’t want to fire the Plugin.


By default, your plugin, after registered will not filter any attributes, meaning that, once your entity updated, no matter which attribute it is updated, it will trigger your plugin.


image


In my code, I did not do any filter :


image


Meaning that, any changes on every field, the plugin will be triggered


We try this



image


Let’s we do filter, I don’t want to trigger this if Ship Method field changed,


image


then I try to uncheck this attribute :


image


Then, I try to update the Shipping Method :


Will it work? Meaning that if I update the Shipping Method, this plugin will not be triggered?


Let me try!


I update the value from null to Airbone,


But, why I still get this plugin executed?


image


Then, you debug, yes it hits your plugin :


image


If you thought like that, it is wrong, and you’re still confused about Plugin Filtering


Actually plugin filtering attributes is used to trigger plugin or execute plugin once the field is changed, then which fields you want to trigger the plugin, you have make it as checked.


When you uncheck, it doesn’t mean that if you change the shippingmethodcode value (only this field you change in UI) so that your plugin will not be executed, since there are many other attributes that your checked before that has changed, it can be CRM system field that is hidden.


Those fields, for example :


ModifiedOn


image


And you realize that ModifiedOn field is in the checked list.







image


So, even though you are only update the Shipping Method, it also affect to other field, even though your target entity as input parameter does not contain shippingmethodcode, your plugin will still be executed.


Then, you try to not include the ModifiedOn and its friends


image


Then you try again, your plugin is still being hit


image


Then, what you do?


Okey, let’s understand this filtering, let’s change your mind to not focus to what you don’t want, but let’s focus to what you want.


You will fill difficult to uncheck every attribute that you don’t want.


For example, you don’t want to execute plugin after you change your shippingmethod only.


Now, let’s think that actually you want to execute your Plugin, IF QUOTE TYPE is changed.


Okay, what will do is :


1. Deselect all your attributes


2. Then check the ‘Quote Type’


image


Until your plugin step will be look like this.


image


Then stay tune in your plugin and trigger your quote, keep your breakpoint, then let’s you see if your plugin is triggered or not.


Wow, your plugin is not executed after you change the shipping method :


image


So, let’s you have very long code for calculation, it is better to filter attribute do you want to trigger and execute your plugin rather than you let any minor change in your field then run your long lines code of plugin.


Remember that QuoteId (uniqueidentifier) will be always be the InputParameter


image


Hope it helps and change your mind!

1 comment:

  1. How do you debug your plugin? Please share with me your step (ryanshee1982@gmail.com)

    ReplyDelete

Aileen Gusni

Aileen Gusni