ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dynamics 365为子网格添加按钮并获取选择记录的信息

2020-11-04 03:02:00  阅读:396  来源: 互联网

标签:function requestMsg 网格 push var Dynamics 365 为子 ly


我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复426或者20201103可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

前面的博文 Dynamics 365定制:在实体的列表界面添加按钮 讲述了实体列表界面添加按钮,博文 Dynamics 365中的导出至Excel,批量编辑,导入权限及限制导出至Excel 讲述了修改Application Ribbon来定制命令栏模板以达到修改实体公共按钮的目的,今天我们来讲述下修改子网格(Subgrid)的按钮。

我假设一个需求,如下界面,我想在Sales Order Item实体的子网格命令栏添加一个【Create Invoices】按钮,点击后将选中的Sales Order Items批量插入到下面的Invoices子网格中。

  

好的,基本的我不解说了,就将设置的内容捡重点说一下。新增一个按钮放到最前面,这个按钮对应的command如下,Custom JavaScript Action对应的 Libray为 $webresource:ly_/scripts/salesorderitem/salesorderitem.js ,Function Name为 LuoYong.SalesOrderItem.CreateInvoiceAction ,传递了PrimaryControl 和 SelectedControl 这两个Crm Parameter 给执行的函数。还关联了一个Enable Rule。

 

 这个Enable Rule的定义如下,注意要让这个按钮一直显示的话,记得添加一个 SelectionCountRule. 一般我还会添加一个FormStateRule。

我这里添加了一个Custom Rule,使用的Library还是 $webresource:ly_/scripts/salesorderitem/salesorderitem.js,执行的FunctionName是 LuoYong.SalesOrderItem.CreateInvoiceEnableRule

其实这个Function的功能很简单,看表单对应的实体Sales Order上的statuscode是否为Approved。你会问为啥不直接用 Value Rule,原因是不行啊。

  

我这里使用的代码如下:

"use strict";
var LuoYong = window.LuoYong || {};
LuoYong.SalesOrderItem = LuoYong.SalesOrderItem || {};
(function () {
    var getRandomString = function (len, charSet) {
        charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        var randomString = '';
        for (var i = 0; i < len; i++) {
            var randomPoz = Math.floor(Math.random() * charSet.length);
            randomString += charSet.substring(randomPoz, randomPoz + 1);
        }
        return randomString;
    };
    var executeBatch = function (clientURL, batchId, requestMsg, successCallback, errorCallback) {
        var req = new XMLHttpRequest()
        req.open("POST", encodeURI(clientURL + "/api/data/v9.1/$batch", true));//true是异步请求,false是同步请求
        req.setRequestHeader("Content-Type", "multipart/mixed;boundary=batch_" + batchId);
        req.setRequestHeader("Accept", "application/json");
        req.setRequestHeader("OData-MaxVersion", "4.0");
        req.setRequestHeader("OData-Version", "4.0");
        req.onreadystatechange = function () {
            if (this.readyState == 4) {
                req.onreadystatechange = null;
                if (this.status == 200) {
                    successCallback(this.responseText);
                }
                else {
                    errorCallback(this.responseText);
                }
            }
        };
        req.send(requestMsg);
    }

    this.CreateInvoiceAction = function (primaryControl, selectedControl) {
        var formContext = primaryControl;
        console.log("当前表单记录的ID=" + formContext.data.entity.getId());
        var entityId = formContext.data.entity.getId().replace('{', '').replace('}','');
        var entityPrimaryAttrValue = formContext.data.entity.getPrimaryAttributeValue();
        //获取子网格选中的记录,最多一次选中250行
        var selectedRows = selectedControl.getGrid().getSelectedRows();
        console.log("共选择了" + selectedRows.getLength() + "条记录!");
        if (selectedRows.getLength() === 0) {
            Xrm.Navigation.openErrorDialog({ message: "请选择至少一条记录!" }).then(
                function (success) {
                    return;
                },
                function (error) {
                    console.log(error);
                });
        }
        else {
            var clientURL = Xrm.Utility.getGlobalContext().getClientUrl();
            var batchId = getRandomString(12);
            var changesetId = getRandomString(12);
            var requestMsg = ["--batch_" + batchId];
            requestMsg.push("Content-Type: multipart/mixed;boundary=changeset_" + changesetId);
            requestMsg.push("");
            selectedRows.forEach(function (row, i) {
                //通过下面这种方式可以获取到子网格显示的列的值,但是不能获取到子网格没有显示的列的值
                //如果要获取就要额外自己查询了,或者显示到子网格中
                console.log(row.getData().getEntity().attributes.get("ly_quantity").getValue());
                //获取选择记录的ID
                console.log(row.getData().getEntity().getId());
                //获取选择记录的实体逻辑名称
                console.log(row.getData().getEntity().getEntityName());
                //获取选择记录的主属性的值
                console.log(row.getData().getEntity().getPrimaryAttributeValue());

                requestMsg.push("--changeset_" + changesetId);
                requestMsg.push("Content-Type: application/http");
                requestMsg.push("Content-Transfer-Encoding:binary");
                requestMsg.push("Content-ID: " + (i + 1).toString());
                requestMsg.push("");
                requestMsg.push("POST " + clientURL + "/api/data/v9.1/ly_luoyonginvoices HTTP/1.1");
                requestMsg.push("Content-Type: application/json;type=entry");
                requestMsg.push("");//注意这里要加空行
                var createData =
                {
                    "ly_name": entityPrimaryAttrValue + "-" + row.getData().getEntity().attributes.get("ly_itemno").getValue(),
                    "ly_quantity": row.getData().getEntity().attributes.get("ly_quantity").getValue(),
                    "ly_totalvalue": row.getData().getEntity().attributes.get("ly_totalvalue").getValue(),
                    "ly_unitprice": row.getData().getEntity().attributes.get("ly_unitprice").getValue(),
                    "ly_salesorderid@odata.bind": "/ly_luoyongsalesorders(" + entityId + ")",
                    "ly_salesorderitemid@odata.bind": "/ly_luoyongsalesorderitems(" + row.getData().getEntity().getId().replace('{', '').replace('}', '') + ")",
                };
                requestMsg.push(JSON.stringify(createData));
            });
            requestMsg.push("--changeset_" + changesetId + "--");//changeset结束这里前面不要加空行
            requestMsg.push("");//注意这里要加空行
            requestMsg.push("--batch_" + batchId + "--");//batch结束前面加空行
            executeBatch(clientURL, batchId, requestMsg.join("\n"), function (responseText) {
                var alertStrings = { confirmButtonLabel: "Yes", text: "Done!", title: "Info" };
                var alertOptions = { height: 120, width: 260 };
                Xrm.Navigation.openAlertDialog(alertStrings, alertOptions).then(
                    function (success) {
                        //完成后刷新当前子网格,以便取消之前选择的记录,可能还有其他逻辑会让处理的记录不显示
                        selectedControl.refresh();
                        //完成后刷新子网格显示新建数据
                        var gridContext = formContext.getControl("subgridInvoices"); 
                        gridContext.refresh();
                    },
                    function (error) {
                        console.log(error.message);
                    }
                );
            }, function (responseText) {
                Xrm.Navigation.openErrorDialog({ message: "Create invoices error. " + responseText});
            });

        }
    };
    this.CreateInvoiceEnableRule = function (primaryControl) {
        var formContext = primaryControl;
        return formContext.getAttribute("statuscode").getValue() === 364750000;
    };
}).call(LuoYong.SalesOrderItem);

 

演示下,选择记录后,点击【Create Invoices】按钮。

  

提示操作完成,速度很快的,因为是用web api执行批量操作,一次请求创建多条记录。关于使用Web API执行批量操作请参考我的博文 使用JS通过Web API执行批量操作,多个操作是一个事务! 。

 

上面的提示点击【Yes】后可以看到两个子网格刷新了,下面的Invoices子网格可以看到新数据了,上面子网格之前选择的记录也不选择了(其实也是刷新了的缘故)。 

 

标签:function,requestMsg,网格,push,var,Dynamics,365,为子,ly
来源: https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Add_Button_For_Subgrid_Get_Selected_Row

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有