Javascript Dynamics CRM - 防止保存

问题描述 投票:0回答:1

我有以下脚本,它成功验证表单上是否存在与当前项目处于同一级别的子项目,并在验证失败时给出对话。我想要做的是,如果验证失败,则阻止表单保存,但如果验证正常,则允许保存表单。我一直在兜圈子,却一无所获,任何帮助将不胜感激

//On Save validation
varProjectMainForm = (function () {
  "use strict";

var SaveMode = {
    Save: 1,
    SaveAndClose: 2,
    SaveAndNew: 59,
    Autosave: 70
};

var saveMode;

var hasCheckedConflict = false;

function OnSave(executionContext) {
    
     //preventing of the save operation before async operation is started
    var eventArgs = executionContext.getEventArgs();
    var formContext = executionContext.getFormContext();
    
/*  if (!hasCheckedConflict)
    {
    executionContext.getEventArgs().preventDefault();
    }
    else
    {
    formContext.data.entity.save()
    } */
    
    saveMode = executionContext.getEventArgs().getSaveMode();
    
    // Specific validation for existing records (not new)
    if (formContext.ui.getFormType() === 2) {
    if (!hasCheckedConflict) {
      hasCheckedConflict = true;
      fetchChildrenProjects(formContext, eventArgs);
    }
    } else {
        console.log("Skipping execution for new records");  // Log for new records, no validation needed
    }

/*     if (eventArgs.isDefaultPrevented()) {
        return;  // No further validation is required if default save has been prevented
    } */

    //saveMode = eventArgs.getSaveMode();
    if (![SaveMode.Save, SaveMode.SaveAndClose, SaveMode.SaveAndNew, SaveMode.Autosave].includes(saveMode)) {
        return;  // Exit if the save mode is not one of the expected modes
    }

}

function fetchChildrenProjects(formContext, eventArgs) {
    var projectID = formContext.getAttribute("dmis_dmisid").getValue();
    var projectLevel = formContext.getAttribute("dmis_displaylevel").getValue();
    


    var fetchXML = "<fetch top='1'>" +
        "<entity name='dmis_dmishierarchy'>" +
        "<attribute name='dmis_dmishierarchyid'/>" +
        "<filter>" +
        "<condition attribute='dmis_dmisid' operator='eq' value='" + projectID + "'/>" +
        "</filter>" +
        "</entity>" +
        "</fetch>";

    var encodedFetchXML = encodeURIComponent(fetchXML);
    Xrm.WebApi.retrieveMultipleRecords("dmis_dmishierarchy", "?fetchXml=" + encodedFetchXML).then(
        function success(result) {
            if (result.entities.length > 0) {
                var hierarchyId = result.entities[0].dmis_dmishierarchyid;
                checkForConflict(formContext, projectLevel, hierarchyId, eventArgs);
            } else {
                console.log("No children projects found for: " + projectID);
               // eventArgs.preventDefault();
            }
        },
        function (error) {
            Xrm.Navigation.openAlertDialog({ text: "Error retrieving hierarchy ID: " + error.message });
           // eventArgs.preventDefault();
        }
    );
}

function checkForConflict(formContext, projectLevel, hierarchyId, eventArgs) {
    
    
    var fetchXML = "<fetch>" +
        "<entity name='dmis_dmishierarchy'>" +
        "<attribute name='dmis_displaylevel'/>" +
        "<filter>" +
        "<condition attribute='dmis_parent' operator='eq' value='" + hierarchyId + "'/>" +
        "</filter>" +
        "</entity>" +
        "</fetch>";

    var encodedFetchXML = encodeURIComponent(fetchXML);
    Xrm.WebApi.retrieveMultipleRecords("dmis_dmishierarchy", "?fetchXml=" + encodedFetchXML).then(
        function success(result) {
            if (result.entities.some(entity => entity.dmis_displaylevel <= projectLevel)) {
                Xrm.Navigation.openAlertDialog({
                     title: "Save Conflict",
                    text:"Cannot save due to this object having children at or below this display level."
                })
                hasCheckedConflict = true;
            } else {
          //There's no issue, allow saving

          //and save event is called again
          if (saveMode === SaveMode.Save || saveMode === SaveMode.Autosave) {
            formContext.data.entity.save();
            hasCheckedConflict = true;
          } else if (saveMode === SaveMode.SaveAndClose) {
            formContext.data.entity.save("saveandclose");
          } else {
            formContext.data.entity.save("saveandnew");
          }
        } 
        },
        function (error) {
            Xrm.Navigation.openAlertDialog({ text: "Error checking for conflicts: " + error.message });
            eventArgs.preventDefault();  // Error occurred, prevent save
        }
    );
}

return {
    OnSave: OnSave
};
})();

我尝试添加验证检查和更新全局变量,但似乎没有任何效果。验证确实可以防止默认关闭,但一旦我添加executionContext.getEventArgs().preventDefault();它不会保存任何记录

javascript microsoft-dynamics powerapps powerapps-modeldriven
1个回答
0
投票

也许检查模型驱动应用程序是否启用了异步保存处理程序。 另请注意,异步保存处理程序有 10 秒的超时时间。您可能想要检查该流程检查需要多长时间,并确保您可以将多个 Web api 调用包装在 Promise.all() 方法中。 我假设您已经查看了文档,但这里是 OnSave Event 的链接 Async Save handler

个人看看你在 JS 中使用 fetchxml 查询做了什么,然后比较/检查冲突...我会在预验证上使用自定义插件,最后插件只会处理逻辑检查,如果它无效,它根本不会保存它。

希望这有帮助! :)

© www.soinside.com 2019 - 2024. All rights reserved.