title: D365/JavaScript issue: Need help appending an OnSave event to not allow a user to save a form
body: <p>I've created a JavaScript OnSave event that parses through a "Sales Quota Distribution" entity grid within an "Opportunity" entity form, and checks for duplicates in the "Resource" field of the "Sales Quota Distribution" grid.  When there is a duplicate, a warning message will appear.  This is working, but I'd like to be able to append the OnSave event to not allow the user to save the form if there are no duplicate resources.  How can I do this?</p>
  
  <p>Below is my current code:</p>
  
  <pre><code>function GetTotalResourceCount(executionContext) {
      console.log("function started");
      var execContext = executionContext;
      var formContext = executionContext.getFormContext();
      var resourceyescount = 0;
      try {
          var gridCtx = formContext._gridControl;
          var grid = gridCtx.getGrid();
          var allRows = grid.getRows();
          //get rows - use the getControl method and pass the grid name.
          //var gridContext = formContext.getControl("s_qd");
          //        if (formContext.getGrid().getTotalRecordCount() == 0) {
          //           setTimeout(function () { GetTotalResourceCount(execContext); }, 2000);
          //           return;
          //       }
          var duplicatesFound = 0;
          //loop through rows and get the attribute collection
          allRows.forEach(function (row, rowIndex) {
              var thisRow = row.getData().entity;
              var thisRowId = thisRow.getId();
  var thisResource = "";
  var thisResourceName = "";
  var thisResourceID = "";
              console.log("this row id=" + thisRowId);
              var thisAttributeColl = row.getData().entity.attributes;
              thisAttributeColl.forEach(function (thisAttribute, attrIndex) {
                  var msg = "";
                  if (thisAttribute.getName() == "new_resource") {
                      thisResource = thisAttribute.getValue();
  thisResourceID = thisResource[0].id;
  thisResourceName = thisResource[0].name;
                  }
              });
  
              // Loop through every row and find one with
              // thatresource == thisResource &amp;&amp;
              // thatrow ID != thisRowId
              var allRows2 = formContext.getGrid().getRows();
              //loop through rows and get the attribute collection
              allRows2.forEach(function (row, rowIndex) {
                  var thatRow = row.getData().entity;
                  var thatRowId = thatRow.getId();
                  var thatAttributeColl = row.getData().entity.attributes;
  var thatResource = "";
  var thatResourceName = "";
  var thatResourceID = "";
                  thatAttributeColl.forEach(function (thatAttribute, attrIndex) {
                      if (thatAttribute.getName() == "new_resource") {
                          thatResource = thatAttribute.getValue();
  thatResourceID = thatResource[0].id;
  thatResourceName = thatResource[0].name;
                          if (thatResourceID == thisResourceID &amp;&amp; thatRowId != thisRowId) {
                              duplicatesFound++;
                              var msg = "Duplicate resource " + thatResource;
                          }
                      }
                  });
              });
          });
  
          if (duplicatesFound &gt; 0) {
              console.log("duplicate found");
              Xrm.Utility.alertDialog("WARNING: There are duplicate resources in the Sales Quota Distribution grid.");
          }
      } catch (err) {
          console.log('Error occurred :' + err)
      }
  }
  </code></pre>
  
  <p>Any help would be greatly appreciated.  Thanks!
  <a href="https://i.stack.imgur.com/A1U4q.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/A1U4q.png" alt="enter image description here"></a></p>