前段时间微软发布了Dynamics 365,这是Dynamics产品的又一次大的变动,期待新的版本能够更好的满足客户的需求,同时提供更多的可定制化的内容。
近期做Dynamics CRM项目遇到很多审批的业务,用户A提交审批给用户B,这时如果审批记录没有做分派即审批记录的负责人没有发生改变,通常情况下都会把审批记录对申请人不可编辑。
常见的做法是:依据记录的审批状态,在记录页面加载时使用JS方法,遍历停用页面上的所有控件。
但会遇到一个问题,子网格是无法停用的,子网格右上角的”+”仍然可以点击,仍然可以在子网格中直接删除关联记录,该如何处理呢?
我接触到处理方法:
1、 在页面加载完成后,使用JS方法隐藏”+”对应的div。(这不是官方支持的方法,而且如果系统升级,随时可能失效)。
2、 对子网格实体添加插件,当用户编辑子网格数据的时候,通过插件去做检验,抛异常告诉用户该子网格不可编辑。(这种方式用户体验度不是很好,并且增加了开发人员的工作量)。
下边我以报销申请为例介绍一种官方支持的方式:
实现思路:
为 ”+” 按钮添加JS可用规则,当审批条件不是草稿时不显示。
首先,我们先看下申请页面处理后的效果,图中 报销申请:案例 = 1:N
具体的操作:
1、 在报销页面上添加“审批状态”字段。
2、 使用Ribbon Workbench 为 案例 实体的新建、删除、编辑等按钮添加可用规则。
配置好脚本及脚本方法HideSunGridBtn.subGridBtnEnRule
为各按钮添加可用规则
最后,发布解决方案。
JS代码:
var FORM_TYPE_CREATE = 1;
var FORM_TYPE_UPDATE = 2;
var HideSunGridBtn = (function () {
return {
//页面的onload方法
onload: function () {
//审批状态
var statusValue = Xrm.Page.getAttribute("new_status").getValue();
//不是草稿状态时停用所有控件
if (statusValue != 1) {
HideSunGridBtn.DisableFormFields();
}
},
//停用子网格上的“+”和删除功能
subGridBtnEnRule: function () {
var statusValue = Xrm.Page.getAttribute("new_status").getValue();
var statecode = Xrm.Page.getAttribute("statecode").getValue();
var formType = Xrm.Page.ui.getFormType();
//审批状态=草稿 状态=可用 窗体类型=2
if (statusValue == 1 && statecode == 0 && formType == FORM_TYPE_UPDATE) {
return true;
}
return false;
},
//停用页面上的所有控件
DisableFormFields: function () {
Xrm.Page.ui.controls.forEach(function (control, index) {
if (HideSunGridBtn.DoesControlHaveAttribute(control)) {
control.setDisabled(true);
}
});
},
DoesControlHaveAttribute: function (control) {
var controlType = control.getControlType();
return controlType != "iframe" && controlType != "webresource" && controlType != "subgrid";
}
};
})();