通过子网格按钮获取选中记录

前言

如果没看过这篇文章:

Dynamics 365 | 添加自定义按钮 Add custom buttons - GongDonghai Blog (gdhblog.com)

请看这篇文章后再回来看本文。


在本文中,你将学会:

1.设置按钮显隐;

2.按钮传参的使用;

需求

  1. 【创建销售订单发票】一直显示;
  2. 【创建销售订单发票】仅拥有 "销售订单" 实体读取权限的用户才显示;
  3. “经销商”状态等于审批通过时,【创建销售订单发票】才显示;
  4. 点击【创建销售订单发票】后,根据对应的 "销售订单记录" 创建 "销售订单发票" 。

本示例中实体关系如下:

经销商 :销售订单 = 1:N

经销商: 销售订单发票= 1:N

开始

1.解决选择记录后,按钮消失的问题

需求1:【创建销售订单发票】一直显示;

这篇文章中添加的【创建销售订单发票】按钮,选中子网格中任何一个记录后这个按钮就会消失。我们先解决一下这个问题。

添加Enable Rules:

image.png

AppliesTo,选择PrimaryEntity。

Minimum,填写0的意思是无论是否选择记录,这个按钮都会显示。如果填写1的话,就是至少选择1条记录才显示。

Maximum,根据Minimum反推过来理解即可。

2.根据用户权设置按钮显隐

需求2:【创建销售订单发票】仅拥有 "销售订单" 实体读取权限的用户才显示;

有查看 "销售订单" 权限的用户,才可以看到【创建销售订单发票】按钮。

添加Dispaly Rule:

image.png

3.状态等于审批通过时显示按钮

需求3:“经销商”状态等于审批通过时,【创建销售订单发票】才显示;

添加自定义规则:

image.png

(重要)为Command添加规则

上面我们只是添加了Display Rule和Enable Rule,这个时候还没有和Command绑定,很多人都忽略了这一步,发布后才发现刚刚设置的逻辑都未生效!

image.png

4.根据"销售订单记录" 创建 "销售订单发票"

需求4:点击【创建销售订单发票】后,根据对应的 "销售订单记录" 创建 "销售订单发票" 。

大致思路:

1.取子网格记录id;

2.将记录id传给Action;

3.Action创建销售订单发票;

开始:

1.为了取子网格记录id,我们需要设置按钮的Commands加一个传递参数。

image.png

设置完后修改下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:

image.png

可以取到的,接下来我们在写一个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);
    }

};

更新并发布脚本后,接下来进行测试。

测试

image.png

image.png

以上。

最后修改:2023 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏