通过子网格按钮获取选中记录
前言
如果没看过这篇文章:
Dynamics 365 | 添加自定义按钮 Add custom buttons - GongDonghai Blog (gdhblog.com)
请看这篇文章后再回来看本文。
在本文中,你将学会:
1.设置按钮显隐;
2.按钮传参的使用;
需求
- 【创建销售订单发票】一直显示;
- 【创建销售订单发票】仅拥有 "销售订单" 实体读取权限的用户才显示;
- “经销商”状态等于审批通过时,【创建销售订单发票】才显示;
- 点击【创建销售订单发票】后,根据对应的 "销售订单记录" 创建 "销售订单发票" 。
本示例中实体关系如下:
经销商 :销售订单 = 1:N
经销商: 销售订单发票= 1:N
开始
1.解决选择记录后,按钮消失的问题
需求1:【创建销售订单发票】一直显示;
这篇文章中添加的【创建销售订单发票】按钮,选中子网格中任何一个记录后这个按钮就会消失。我们先解决一下这个问题。
添加Enable Rules:
AppliesTo,选择PrimaryEntity。
Minimum,填写0的意思是无论是否选择记录,这个按钮都会显示。如果填写1的话,就是至少选择1条记录才显示。
Maximum,根据Minimum反推过来理解即可。
2.根据用户权设置按钮显隐
需求2:【创建销售订单发票】仅拥有 "销售订单" 实体读取权限的用户才显示;
有查看 "销售订单" 权限的用户,才可以看到【创建销售订单发票】按钮。
添加Dispaly Rule:
3.状态等于审批通过时显示按钮
需求3:“经销商”状态等于审批通过时,【创建销售订单发票】才显示;
添加自定义规则:
(重要)为Command添加规则
上面我们只是添加了Display Rule和Enable Rule,这个时候还没有和Command绑定,很多人都忽略了这一步,发布后才发现刚刚设置的逻辑都未生效!
4.根据"销售订单记录" 创建 "销售订单发票"
需求4:点击【创建销售订单发票】后,根据对应的 "销售订单记录" 创建 "销售订单发票" 。
大致思路:
1.取子网格记录id;
2.将记录id传给Action;
3.Action创建销售订单发票;
开始:
1.为了取子网格记录id,我们需要设置按钮的Commands加一个传递参数。
设置完后修改下JavaScript中的CreateSalesOrderItemInvoice
方法,修改如下:
//创建销售订单发票
CreateSalesOrderItemInvoice: function (primaryControl, selectedControl, ids) {
console.log("===Start:CreateSalesOrderItemInvoice===");
console.log("当前表单记录(经销商)的ID = " + primaryControl.data.entity.getId());
var selectedRows = selectedControl.getGrid().getSelectedRows();
console.log("共选择了" + selectedRows.getLength() + "条记录!");
if (ids.length == 0) {
this.alertDialog("信息", "请选择记录。");
return;
}
console.log("ids:" + ids);
console.log("===End:CreateSalesOrderItemInvoice===");
}
更新SalesOrderItem.js
后验证下是否能取到所选记录的id:
可以取到的,接下来我们在写一个Action,Action我另外再写一篇:
Dynamics 365 自定义Action开发实例 - GongDonghai Blog (gdhblog.com)
写好Action后,我们再调整一下CreateSalesOrderItemInvoice
方法:
CreateSalesOrderItemInvoice: function (primaryControl, selectedControl, ids) {
console.log("===Start:CreateSalesOrderItemInvoice===");
console.log("当前表单记录(经销商)的ID = " + primaryControl.data.entity.getId());
var selectedRows = selectedControl.getGrid().getSelectedRows();
console.log("共选择了" + selectedRows.getLength() + "条记录!");
if (ids.length == 0) {
this.alertDialog("信息", "请选择记录。");
return;
}
console.log("ids:" + ids);
console.log("===End:CreateSalesOrderItemInvoice===");
/*调用Action*/
var arg = "";
for (var i = 0; i < ids.length; i++) {
if (arg != "") {
arg += ";";
}
arg += ids[i];
}
var argument = { "tag": "createsalesorderIteminvoice", "arg": arg };
var retObj = this.callAction("gdh_EntityExtendAction", argument);
if (retObj.status == 200) {
var result = JSON.parse(retObj.response).results;
var objResult;
if (result != null && typeof (result) == "string") {
objResult = eval('(' + result + ')');
}
else {
objResult = result;
}
console.log("objResult= " + objResult);
console.log("objResult.status = " + objResult.status);
if (objResult != null && objResult.status == 0) {
this.alertDialog("信息提示", "销售订单发票创建成功");
/*完成后刷新子网格显示新建数据*/
var gridContext = primaryControl.getControl("sales_order_item_invoice");
gridContext.refresh();
}
else {
parent.Xrm.Utility.closeProgressIndicator();
var alertMsg = objResult;
if (objResult != null) {
alertMsg = objResult.msg;
}
this.alertDialog("信息提示", alertMsg);
return false;
}
}
else {
parent.Xrm.Utility.closeProgressIndicator();
var msg = eval('(' + retObj.response + ')');
this.alertDialog("信息提示", msg.error.message);
return false;
}
}
本实例写的JavaScript
SalesOrderItem.js
/*销售订单脚本*/
if (typeof SalesOrderItem == "undefined") {
SalesOrderItem = { __namespace: true };
}
SalesOrderItem = {
_executionContext: null,
_formContext: null,
_lookupsupplierId: null,
OnLoad: function (executionContext) {
this.executionContext = executionContext;
this._formContext = executionContext.getFormContext();
},
/*创建销售订单发票*/
CreateSalesOrderItemInvoice: function (primaryControl, selectedControl, ids) {
console.log("===Start:CreateSalesOrderItemInvoice===");
console.log("当前表单记录(经销商)的ID = " + primaryControl.data.entity.getId());
var selectedRows = selectedControl.getGrid().getSelectedRows();
console.log("共选择了" + selectedRows.getLength() + "条记录!");
if (ids.length == 0) {
this.alertDialog("信息", "请选择记录。");
return;
}
console.log("ids:" + ids);
console.log("===End:CreateSalesOrderItemInvoice===");
/*调用Action*/
var arg = "";
for (var i = 0; i < ids.length; i++) {
if (arg != "") {
arg += ";";
}
arg += ids[i];
}
var argument = { "tag": "createsalesorderIteminvoice", "arg": arg };
var retObj = this.callAction("gdh_EntityExtendAction", argument);
if (retObj.status == 200) {
var result = JSON.parse(retObj.response).results;
var objResult;
if (result != null && typeof (result) == "string") {
objResult = eval('(' + result + ')');
}
else {
objResult = result;
}
console.log("objResult= " + objResult);
console.log("objResult.status = " + objResult.status);
if (objResult != null && objResult.status == 0) {
this.alertDialog("信息提示", "销售订单发票创建成功");
/*完成后刷新子网格显示新建数据*/
var gridContext = primaryControl.getControl("sales_order_item_invoice");
gridContext.refresh();
}
else {
parent.Xrm.Utility.closeProgressIndicator();
var alertMsg = objResult;
if (objResult != null) {
alertMsg = objResult.msg;
}
this.alertDialog("信息提示", alertMsg);
return false;
}
}
else {
parent.Xrm.Utility.closeProgressIndicator();
var msg = eval('(' + retObj.response + ')');
this.alertDialog("信息提示", msg.error.message);
return false;
}
},
CreateSalesOrderItemInvoiceEnableRule: function (primaryControl) {
var flag = false;
var formContext = primaryControl;
var approvalStatu = formContext.getAttribute("gdh_approvalstatus").getValue();
//草稿 10
//已提交 20
//审批中 30
//审批通过 40
//审批驳回 50
//撤回 60
if (approvalStatu == 40) {
flag = true;
}
return flag;
},
callAction: function (action, data) {
var retObj;
var serverURL = Xrm.Page.context.getClientUrl();
var req = new XMLHttpRequest();
req.open("POST", serverURL + "/api/data/v9.2/" + action, false);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
retObj = this;
}
};
req.send(window.JSON.stringify(data));
return retObj;
},
alertDialog: function (title, msg) {
var alertStrings = { confirmButtonLabel: "确定", text: msg, title: title };
var alertOptions = { height: 120, width: 260 };
Xrm.Navigation.openAlertDialog(alertStrings, alertOptions);
}
};
更新并发布脚本后,接下来进行测试。
测试
以上。
2 条评论
[...]前言如果你没添加过自定义按钮,自定义Action,建议花两杯茶时间看下前几篇:Dynamics 365 按钮(一) 添加自定义按钮 - GongDonghai Blog (gdhblog.com)Dynamics 365 按钮(二) 实例 - GongDonghai Blog (gdhblog.com)Dynamics 365 自定义Action开发实例 - GongDonghai Blog (g[...]
[...]Dynamics365 自定义Action开发实例前言本文是为了完善之前写的Dynamics 365 按钮(二) 实例 - GongDonghai Blog (gdhblog.com),如果您一开始就看这篇文章的话可能看不明白,建议花几分钟瞄一下前面2篇文章。Dynamics 365 按钮(一) 添加自定义按钮 - GongDonghai Blog (gdhblog.com)Dynamics 36[...]