Blog, Development

Cancelling save event based on the result of async operation

This post is similar to previous one related to showing/hiding of the button based on the result of async operation but in this scenario script allows/disallows form to be saved. In my case I check if there is any account with the same “Account Number” available already and if there is script blocks the save. Yes, I know that it’s safer to allow platform to that task for me (for example using Alternate Key feature or so) but it’s just an example that demonstrates the approach could be used in similar use cases.

So here is the code with detailed comments what is happening:

Don’t forget to set “Pass execution context as first parameter” checkbox during the registration of handler:

If you attach onsave handlers on-the-fly inside onload handler using addOnSave method executionContext is passed inside automatically as a first parameter.

PS I appreciate Chris Groh for code review and suggestions related to:

  • different save modes
  • sequential execution of several save handlers

13 Comments

  1. Great article Andrew! And the previous one also.
    In order to do same thing, I used Promise. With your code, it seems easier.

    Thanks for sharing

  2. Hi Andrew,
    Thanks for your article.
    We’ve used the same approach for some time.
    But if you need ot save something on the form calling
    ctx.getFormContext().data.save().then(() => {
    then -> will always get a canceled callback.
    of course, there’s a workaroud but it should be kept in mind.

    1. Sergii,
      You are welcome. There always will be a scenario that is not covered by the code provided. That’s why we are paid – to close those gaps.
      Thanks,
      Andrew

  3. execContext.getEventArgs().preventDefault(); is not working in CRM online. It is not throwing error also. Tried debugging javascript. But getEventArgs() is not null. When I print it, it is set to an object. Also Passexecutionparameter is checked in Handler properties. isDefaultPrevented also returns the correct value but preventdefault is not working.

    Any suggestions !!!

    Thanks,
    Neha

    1. Neha,
      I’m not sure why it doesn’t work for you. I did my development in online environment and it worked fine for me.
      Andrew

  4. Hi, should this script be attached to the OnSave event of the form? or is it better to attach it to the OnLoad event? Thanks

  5. Thank you Andrew. I was close to the same solution but after reading your code I figured out a few critical aspects.
    Excellent article!

  6. Microsoft wrote that functions formContext.data.entity.save() will be deprecated . I applied new one as suggested
    formContext.data.save();
    formContext.data.save({ saveMode: 2}).
    And it is working until latest Microsft update Dec 17 2021 . After this Microsoft Christmas gift(update) when the user press button Save and Close, then the data on my form could be saved, but the form won’t close, Any help or comments for this case will be useful

    1. Hello Mikhail,
      I’m not sure why it doesn’t work when it should according to the documentation.
      I would recommend getting in touch with Microsoft and ask what’s wrong and as a workaround in a callback of the promise that is returned calling formContext.data.save – call https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/formcontext-ui/close in order to close the form after it was saved. I understand that it’s a workaround but it should fix the flow for your users.
      Andrew

      1. Hi Andrew,
        We contacted with Microsoft support regarding this issue , and they confirmed that some “enhancements” were done , and MS product team will be notified about this. I hope, the documentation will be updated as well. So far we applied to fix as
        formContext.data.save({ saveMode: SaveMode.SaveAndClose })
        .then(successCallback, errorCallback);
        and
        function successCallback() {
        formContext.ui.close();
        };
        It is working fine.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.