REFORMULATED QUESTION (Apr 24):
I am using the CRM Developer Toolkit for VS2012 to create a CRM2011 plugin. The plugin is registered for the CREATE message of the "Invoice Product" entity. Pipeline-Stage is post-operational, execution is synchronous. I register for a post image that contains baseamount.
The toolkit creates an execute function that looks like this:
protected void ExecutePostInvoiceProductCreate(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
IPluginExecutionContext context = localContext.PluginExecutionContext;
Entity postImageEntity = (context.PostEntityImages != null && context.PostEntityImages.Contains(this.postImageAlias)) ? context.PostEntityImages[this.postImageAlias] : null;
}
Since we are in post operational stage, the value of baseamount in postImageEntity should already be calculated from the user input, right? However, the value of baseamountin the postImageEntity is zero. The same holds true for the value of baseamount in the target entity that I get using the following code:
Entity targetEntity = (context.InputParameters != null && context.InputParameters.Contains("Target")) ? (Entity)context.InputParameters["Target"] : null;
Using a retrieve request like the one below, I am getting the correct value of baseamount:
Entity newlyCreated = service.Retrieve("invoicedetail", targetEntity.Id, new ColumnSet(true));
decimal baseAmount = newlyCreated.GetAttributeValue<Money>("baseamount").Value;
The issue does not appear in post operational stage of an update event.
I'd be glad to hear your ideas/explanations/suggestions on why this is the case...
(Further information: Remote debugging, no isolation mode, plugin stored in database)
Original Question:
I am working on a plugin for CRM 2011 that is supposed to calculate the amount of tax to be paid when an invoice detail is created. To this end I am trying to get the baseamount of the newly created invoicedetail entity from the post entity image in post operational stage. As far as I understood it, the post entity image is a snapshot of the entity in the database after the new invoice detail has been created. Thus it should contain all properties of the newly created invoice detail.
I am getting a "postentityimages" property of the IPluginExecutionContext that contains an entity with the alias I registered ("postImage"). This "postImage" entity contains a key for "baseamount" but its value is 0. Can anybody help me understand why this is the case and what I can do about it?
(I also noticed that the postImage does not contain all but only a subset of the entities I registered for.)
Here is what the code looks like:
protected void ExecutePostInvoiceProductCreate(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
// Get PluginExecutionContext to obtain PostEntityImages
IPluginExecutionContext context = localContext.PluginExecutionContext;
// This works: I get a postImage that is not null.
Entity postImage = (context.PostEntityImages != null && context.PostEntityImages.Contains(this.postImageAlias)) ? context.PostEntityImages[this.postImageAlias] : null;
// Here is the problem: There is a "baseamount" key in the postImage
// but its value is zero!
decimal baseAmount = ((Money)postImage["baseamount"]).Value;
}
ADDITION: Pre and post images for post operational update contain non-zero values for baseamount.