前段時間微軟發布了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";
}
};
})();