Yesterday, I realized the error in my ways of not using a PreImage to get the values that were not being included in the updated attributes collection - SCORE! Now, the plugin works, but it only works every other time I trigger the plugin.
So, it seems the plugin is actually firing (I can see the plugin profile in Settings > plugin profiles), but is not performing the update that I need, until I trigger the plugin a second time. This seems to happen on all 3 attributes that I am listening for, and each of the attributes will need to be updated twice (as in, if I update Attribute 1, plugin doesn't update my value, if I then update attribute 2, plugin still doesn't update my value, until I re-update Attribute 1 or Attribute 2 again). As I profile/debug my code and step through it, I can see that the if statements are being hit, and the line of code that updates the entity field is also being executed - but for whatever reason, it does not set the value (CLIENT_nteexceeded = true or false) until I trigger it for the second time. It would make a lot more sense if it just didn't update the entity record value at all, and I was missing some type of an 'update' message (I have played with service.Entity.Update() but it does not seem to apply to this plugin)
I am still relatively new to CRMDEV, so please excuse the silly question. This just seems like a really silly issue to me, and it's gotta be something small that I'm missing. Any thoughts as to why this is forcing me to trigger the code twice to get the update executed?
Here is the config of the plugin step. The three filter attributes are those referenced in the code. Again, plugin works fine, just doesn't update the record every time.
Code Below (with references to Client's name removed)
using System; using System.Linq; using System.Collections.Generic; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Query; using Microsoft.Crm.Sdk.Messages; using System.ServiceModel; using System.Data.SqlClient; using System.Threading.Tasks; namespace CLIENTNTE { public class NTEExceedance : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = factory.CreateOrganizationService(context.UserId); //Extract the tracing service for use in debugging sandboxed plug-ins. ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); Money subtotal = null; Money nte = null; Decimal nte_percent = 0; Decimal subtotalDecimal = 0; Decimal nteDecimal = 0; Decimal amountDiffDecimal = 0; Decimal percentDifference = 0; try { if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { Entity entity = (Entity)context.InputParameters["Target"]; if (entity.LogicalName == "msdyn_workorder") { //code fires onChange of NTE Amount (same logic will apply to NTE % and Est Subtotal Amount) if (entity.Attributes.Contains("CLIENT_nteamount") == true) { //String NewValue = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString())); // String NewSubTotal = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()), entity["msdyn_estimatesubtotalamount"].ToString()); //String NewNTE = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()), entity["CLIENT_nteamount"].ToString()); //String Newpercent = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()), entity["CLIENT_ntepercent"].ToString()); if (context.PreEntityImages.Contains("WONTEPreImage") && context.PreEntityImages["WONTEPreImage"] is Entity) { Entity preMessageImage = (Entity)context.PreEntityImages["WONTEPreImage"]; // get topic field value before database update perform //pretopic = (String)preMessageImage.Attributes["subject"]; subtotal = (Money)preMessageImage.Attributes["msdyn_estimatesubtotalamount"]; nte = (Money)preMessageImage.Attributes["CLIENT_nteamount"]; nte_percent = (Decimal)preMessageImage.Attributes["CLIENT_ntepercent"]; } //old way of trying to get values NON IMAGE //subtotal = (Money)entity.Attributes["msdyn_estimatesubtotalamount"]; //nte = (Money)entity.Attributes["CLIENT_nteamount"]; //nte_percent = (Decimal)entity.Attributes["CLIENT_ntepercent"]; subtotalDecimal = subtotal.Value; nteDecimal = nte.Value; amountDiffDecimal = (subtotalDecimal - nteDecimal); percentDifference = ((amountDiffDecimal / nteDecimal) * 100); if (percentDifference > nte_percent) { //know this snippet works entity["CLIENT_nteexceeded"] = true; } if (percentDifference <= nte_percent) { //know this snippet works entity["CLIENT_nteexceeded"] = false; } } if (entity.Attributes.Contains("CLIENT_ntepercent") == true) { if (context.PreEntityImages.Contains("WONTEPreImage") && context.PreEntityImages["WONTEPreImage"] is Entity) { Entity preMessageImage = (Entity)context.PreEntityImages["WONTEPreImage"]; // get topic field value before database update perform //pretopic = (String)preMessageImage.Attributes["subject"]; subtotal = (Money)preMessageImage.Attributes["msdyn_estimatesubtotalamount"]; nte = (Money)preMessageImage.Attributes["CLIENT_nteamount"]; nte_percent = (Decimal)preMessageImage.Attributes["CLIENT_ntepercent"]; } //old way of trying to get values NON IMAGE //subtotal = (Money)entity.Attributes["msdyn_estimatesubtotalamount"]; //nte = (Money)entity.Attributes["CLIENT_nteamount"]; //nte_percent = (Decimal)entity.Attributes["CLIENT_ntepercent"]; subtotalDecimal = subtotal.Value; nteDecimal = nte.Value; amountDiffDecimal = (subtotalDecimal - nteDecimal); percentDifference = ((amountDiffDecimal / nteDecimal) * 100); if (percentDifference > nte_percent) { //know this snippet works entity["CLIENT_nteexceeded"] = true; } if (percentDifference <= nte_percent) { //know this snippet works entity["CLIENT_nteexceeded"] = false; } } if (entity.Attributes.Contains("msdyn_estimatesubtotalamount") == true) { if (context.PreEntityImages.Contains("WONTEPreImage") && context.PreEntityImages["WONTEPreImage"] is Entity) { Entity preMessageImage = (Entity)context.PreEntityImages["WONTEPreImage"]; subtotal = (Money)preMessageImage.Attributes["msdyn_estimatesubtotalamount"]; nte = (Money)preMessageImage.Attributes["CLIENT_nteamount"]; nte_percent = (Decimal)preMessageImage.Attributes["CLIENT_ntepercent"]; } //old way of trying to get values NON IMAGE //subtotal = (Money)entity.Attributes["msdyn_estimatesubtotalamount"]; //nte = (Money)entity.Attributes["CLIENT_nteamount"]; //nte_percent = (Decimal)entity.Attributes["CLIENT_ntepercent"]; subtotalDecimal = subtotal.Value; nteDecimal = nte.Value; amountDiffDecimal = (subtotalDecimal - nteDecimal); percentDifference = ((amountDiffDecimal / nteDecimal) * 100); if (percentDifference > nte_percent) { //know this snippet works entity["CLIENT_nteexceeded"] = true; } if (percentDifference <= nte_percent) { //know this snippet works entity["CLIENT_nteexceeded"] = false; } } } } } catch (FaultException<OrganizationServiceFault> e) { tracingService.Trace("CLIENTPlugin - Update NTEExceededNonCalc: {0}", e.ToString()); throw e; } } } }