目标:
Dynamics 365 CRM Online 使用Ribbon Workbench 2016在view或form上方添加按钮并根据View中所选中的记录实现CURD
内容步骤:
1、 安装Ribbon workbench 2016, 可参照官网如何下载与安装
- 2、 创建供Ribbon workbench 2016所需的solution
- 3、 使用Ribbon workbench 2016加载并打开solution
4、 在Ribbon workbench 2016界面中添加button
5、 在Ribbon workbench 2016界面的button事件中指定command
6、在Ribbon workbench 2016界面为command指定javascript action
7、编写实现业务逻辑的javascript脚本及其相关的方法
过程:
1、 创建soultion后,使用Ribbon workbench 2016打开soultion,此处我不介绍在dynamics 365 online如何创建soultion ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201208105143897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDEzNjgyMw==,size_16,color_FFFFFF,t_70)2、 在Ribbon workbench 2016界面中,首先是有三个level, 一个Home view, Sub grid和Form, 我这里选在Home view上添加一个button,选项如下设置,添加button,为button指定所调用的代码库,我这里使用javascript脚本,这里需要指定View所选的记录集,所以要启用参数Crm parameters
3、设置显示规则所调用的代码库与方法,方法在javascript代码库中有定义
4、 指定button所以调用的command
5、编写的javascript代码库中的方法
//获取用户组,如果是retail用户,则菜单按钮不可见,此处的harcode可以用参数设置
function Fei_EnableAnonyMousButton() {
var roleEnable = false;
var currentUserName = Xrm.Page.context.getUserName();
// var currentuserRole = Xrm.Page.context.getUserRoleName();
// alert(currentuserRole);
if (currentUserName == "# Retail") {
roleEnable = false;
}
else {
roleEnable = true;
}
return roleEnable;
}
//获取view中已选中的记录集
function Fei_getViewSelectedItems(Items,SelectedControl) {
var currentUser = Xrm.Page.context.getUserName();//获取当前操作的用户
//此处理写了hardcode测试,如果是为retail用户则没权限
if (currentUser == "# Retail") {
return;
}
var con = confirm("Are you sure to anonymous these contacts ?");
if (con == true) {
var contactItems = JSON.stringify(Items);
var obj = eval('(' + contactItems + ')');
for (var i = 0; i < obj.length; i++) {
var contact_guid = obj[i].Id;
contact_guid = contact_guid.replace('{', '').replace('}', '');
Fei_GetContactInfo(contact_guid);
}
}
SelectedControl.refresh();
}
//获取CRM的Url
function Fei_GetClientUrl() {
var ClientURL = Xrm.Page.context.getClientUrl();
var serviceurl = encodeURI(ClientURL + "/api/data/v8.1/");
return serviceurl;
}
//根contactid查找contacts的部分字段信息
function Fei_GetContactInfo(contact_guid) {
var querystring = "contacts?$select=emailaddress1,mobilephone,fullname,firstname,thk_contact_no&$filter=contactid eq '" + contact_guid + "'";
var WebAPIUrl = Fei_GetClientUrl() + querystring;
var data = ExecuteCrmCommand(WebAPIUrl, "GET");
// alert(data);
var obj = eval('(' + data + ')');
var contact = Object.create(ContactInfo);
for (var j = 0; j < obj.value.length; j++) {
contact._contactid = contact_guid;
contact._email = obj.value[j].emailaddress1;
contact._mobilephone = obj.value[j].mobilephone
contact._contact_no = obj.value[j].thk_contact_no;
contact._fullname = obj.value[j].fullname;
// alert(contact._contact_no + " " + contact._contactid);
Fei_CreateAnonyMousContact(contact); //备份需要清空内容的字段信息,把信息添加到另一个entity
Fei_CleanContactMainMsg(contact);//清空当前contact表的部分字段信息
}
}
//把选择的记录集信息Post到另一个表中,
function Fei_CreateAnonyMousContact(ContactInfo) {
var entityname = "Fei_anonymouses";
var anonymous_json = {};
anonymous_json["Fei_email"] = ContactInfo._email;
anonymous_json["Fei_member_card_id"] = ContactInfo._contact_no;
anonymous_json["Fei_phone"] = ContactInfo._mobilephone;
anonymous_json["Fei_name"] = ContactInfo._fullname;
anonymous_json["Fei_contactId@odata.bind"] = "/contacts(" + ContactInfo._contactid + ")";
var jsonEntity = JSON.stringify(anonymous_json);
//alert(jsonEntity);
var WebAPI = Fei_GetClientUrl() + entityname;
// alert(WebAPI);
// alert(ContactInfo._contact_no);
ExecuteCrmCommand(WebAPI, "POST", jsonEntity);
alert("Create is OK");
}
//对当前已做备份的记录做部分字段值清空处理
function Fei_CleanContactMainMsg(ContactInfo) {
var _contactid = ContactInfo._contactid;
var entityname = "contacts(" + _contactid+")";
var contactJson = {};
contactJson["emailaddress1"] = "";
contactJson["mobilephone"] = "";
// contactJson["address1"] = "";
contactJson["new_Fei_phoneareacode"] = "";
// contactJson["new_emailaddressstatus"] = -1;
var jsonEntity = JSON.stringify(contactJson);
var WebAPI = Fei_GetClientUrl() + entityname;
ExecuteCrmCommand(WebAPI, "PATCH", jsonEntity);
alert("PATCH is OK");
}
function ContactInfo() {
var _contactid;
var _email;
var _mobilephone;
var _contact_no;
var _fullname;
var _firstname;
}
//CRM command执行方法
function ExecuteCrmCommand(WebApiUrl, action, data) {
var req = new XMLHttpRequest()
if (action == "GET")
req.open(action, WebApiUrl, false);
if (action == "POST")
req.open(action, encodeURI(WebApiUrl), true);
if (action == "PATCH")
req.open(action, encodeURI(WebApiUrl), true);
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) {
switch (this.status) {
case 200: // Success with content returned in response body.
req.onreadystatechange = null;
//data = JSON.parse(this.responseBody);
case 204: // Success with no content returned in response body.
var accountUri = this.getResponseHeader("OData-EntityId");
console.log("Created account with URI: " + accountUri)
// data = JSON.parse(this.responseText);
break;
default: // All other statuses are unexpected so are treated like errors.
var error;
try {
error = JSON.parse(request.response).error;
}
catch (e) {
error = new Error("Unexpected Error");
}
reject(error);
break;
}
}
};
req.send(data);
return req.responseText;
}
测试结果:
1、Contact view中选中二行记录可见Contact anonymous按钮,选中二行记录点击该按钮产生预期的功能效果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201208140318202.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDEzNjgyMw==,size_16,color_FFFFFF,t_70#pic_center)在contact view中选中几行记录点击按钮测试一下再转到anonymous view中查看,确实更新过来,并将原始表中的相关字段值清空