Statement of the day. 5/26/2009

On May 26, 2009, in Meanderings, by Mitch Milam

I had the following conversation with a customer today:

Mitch:

I think we outsmarted ourselves.

Customer:

Oh no.

Mitch:

I didn’t say it was unsmartable.

 

Using the Form OnSave Event

On May 11, 2009, in Customization, Dynamics CRM, by Mitch Milam

While working on a customer project recently, we added logic to prevent the user from saving should certain form conditions exist.  During testing, we found that Save events were coming from a variety of unexpected places.

Take for instance the Opportunity Entity.  There are several related entities connected to Opportunity:

image

Clicking on the Orders link on the Opportunity allows you to  review or created new associated Orders.

When you click the New Order button on the Orders pane, one of the first actions it will perform is to save the parent Opportunity with an internal call that looks something like this:

crmForm.SubmitCrmForm(21, true, true, false);

 

How This Causes Problems

This system-originated save caused a problem in our solution because we had actually removed the Save and Save and Close buttons until our approval processes had been completed.  This “save from nowhereâ€? broke our validation processes.

 

Making Your Save Process Solid

If you review the OnSave event documentation on MSDN ( or or the SDK help file ), you’ll see that you can actually determine from where the save originated.

The property event.Mode will contain the origination point for the save activity.  In our case, we only wanted the OnSave event to fire if the event.Mode was 1 ( Save ), or 2 ( Save and Close ).  The code looks like this:

if (event.Mode == 1 || event.Mode == 2)
{
}

 

Finally, if it turns out that you need to watch for a specific save event, the first parameter of the crmForm.SubmitCrmForm will contain value that will be used to set the event.Mode.

 

Stopping the Save

As you will see in the SDK documentation, you can actually stop the save from occurring, using the following code:

event.returnValue = false;

This is useful should you need to inspect the form state and only allow the process to complete if all checks pass.