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

今天的文章是接着前面的文章 Dynamics 365客户端编程示例:两个选项集字段的联动 继续的,请先阅读之前的文章。今天这个例子是教大家如何获取当前用户的信息,比如当前用户的角色,做项目的时候容易用到判断用户是否具有某个角色然后做个逻辑比如控制字段是否只读等。还有获取当前用户的一些信息,比如用户的主要电话,或者所属业务部门,显示表单级别的提示信息然后自动隐藏,然后教一下在窗体的OnLoad事件中执行代码。我这里例子是获取用户所属的业务部门,若属于某些业务部门,省份字段只能选择指定的省份。

首先贴上我用到的代码如下,这个是放在名称为 workorderform.js 的Web资源中的。

//定义命名空间,我一般用项目统一前缀加上实体去掉前缀后的架构名称(每个单词首字母大写)
var LuoYongWorkOrder = window.LuoYongWorkOrder || {};
(function () {
this.formOnLoad = function (executionContext) {
var formContext = executionContext.getFormContext();
var myUniqueId = "B76C4FF7-AF21-434D-8482-D39AA02A5F0B";
formContext.ui.setFormNotification("表单加载完毕,开始执行表单OnLoad代码!", "INFO", myUniqueId);
//等5秒钟后清除前面代码显示在表单上的提醒
window.setTimeout(function () { formContext.ui.clearFormNotification(myUniqueId); }, 5000);
//获取当前用户的Guid
var userId = Xrm.Utility.getGlobalContext().userSettings.userId;
//获取用户的角色ID
var roleIdArray = Xrm.Utility.getGlobalContext().userSettings.securityRoles;
var roleIdFilter = "";
roleIdArray.forEach(function (element) {
roleIdFilter = roleIdFilter + "roleid eq " + element + " or ";
});
var userRoleNames = [];
//通过Web API返回用户拥有的角色名称
Xrm.WebApi.retrieveMultipleRecords("role", "?$select=name&$filter=" + roleIdFilter.substring(0, roleIdFilter.length - 3)).then(
function success(result) {
for (var i = 0; i < result.entities.length; i++) {
userRoleNames.push(result.entities[i]["name"]);
}
console.log("当前用户拥有" + userRoleNames.length + "个角色,分别为" + userRoleNames.join(","));
},
function (error) {
console.log(error.message);
}
);
Xrm.WebApi.retrieveRecord("systemuser", userId, "?$select=systemuserid&$expand=businessunitid($select=name)").then(
function success(result) {
console.log("用户所属的业务部门名称为:" + result.businessunitid.name);
var formType = formContext.ui.getFormType();
//只有当前表单是可编辑窗体时才限制省份可选列表,节约计算资源
if (formType <= 2) {
//获取省份字段的所有可用选项信息
var provinceValidOptions = formContext.getAttribute("ly_province").getOptions();
if (result.businessunitid.name == "Demo") {
provinceValidOptions.forEach(
function (element) {
//移除不能让用户选择的选项
if (element.value != 430000) {
formContext.getControl("ly_province").removeOption(element.value);
}
}
);
}
else if (result.businessunitid.name == "Sub Unit") {
provinceValidOptions.forEach(
function (element) {
if (element.value != 440000) {
//移除不能让用户选择的选项
formContext.getControl("ly_province").removeOption(element.value);
}
}
);
}
}
},
function (error) {
console.log(error.message);
}
);
}
}).call(LuoYongWorkOrder);

然后打开窗体类型为主要的表单,点击Ribbon区的窗体属性,确认事件是 OnLoad后点击【添加】按钮。

我的输入如下,函数名称我输入 LuoYongWorkOrder.formOnLoad ,还是要记得勾选 【将执行上下文作为第一个参数传递】,保存后发布。

然后去看下效果:

按F12,Console中显示了用户的角色和所属业务部门的名字:

获取用户角色名称有更加简单的方法,请参考我的博文:

Dynamics 365 获取用户角色名称再也不用额外查询一次了。

Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码的更多相关文章

  1. Dynamics 365客户端编程示例:两个选项集字段的联动

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  2. spring security+freemarker获取登陆用户的信息

    spring security+freemarker获取登陆用户的信息 目标页面之间获取 ${Session.SPRING_SECURITY_CONTEXT.authentication.princi ...

  3. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-7.授权登录获取微信用户个人信息实战

    笔记 7.授权登录获取微信用户个人信息实战         简介:讲解使用授权码code获取用户个人信息接口 关键点:看微信文档,字段尽量用拷贝 1.通过code获取access_token      ...

  4. 与安卓联调,调用安卓那边的方法,获取到安卓传过来的数据,再携带这些数据发送axios请求,获取到用户的信息

    第一步:js调用Android方法:接收Android传递过来的数据,并做处理 //参数一:调用java中的方法   submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一 ...

  5. linux下shell编程示例-获取进程id

    今天初步学习了一下linux下的shell编程,简单记录一下测试用例 1.编辑shell脚本文件如下: #!/bin/bashecho "hello bash linux"echo ...

  6. Linux/UNIX编程:获取指定用户所有正在运行的进程ID和进程名

    先用系统函数 `getpwnam` 获得指定用户名的 UID,然后遍历 /proc/ 中所有 PID 目录,如果 /proc/PID/status 中的 UID 是输入用户名对应的 UID 则输出该 ...

  7. JAVA中经过nginx反向代理获取客户端ip并获取相关坐标等信息

    关于搜狐新浪ip库查询接口的使用 直接输出访客ip及所在城市: <script src="http://pv.sohu.com/cityjson?ie=utf-8" > ...

  8. SAP中获取当前用户相关信息的两个函数

    函数名:TH_USER_LIST作用:可以得到SM04界面显示样式的表. 函数名:TH_USER_INFO作用:可以得到当前特定用户的机器名.当前活动窗口数.IP地址等信息

  9. WPF获取当前用户控件的父级窗体

    方式一.通过当前控件名获取父级窗体 Window targetWindow = Window.GetWindow(button); 方式二.通过当前控件获取父级窗体 Window parentWind ...

随机推荐

  1. 图解leetcode —— 124. 二叉树中的最大路径和

    前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到 ...

  2. GROUP_CONCAT在组合商品中的使用

    表:combined_product_item -------------------------pid sku quality-------------------------1 sku1 11 s ...

  3. Golang 在电商即时通讯服务建设中的实践

    马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech ​即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个旅游商品可能会包括用户在未来一段时间的衣.食.住.行等 ...

  4. Vue底层实现原理总结

    要实现MVVM 响应式原理,要实现如下几点 1.实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者 2.实现一个指令解析器Compile,对每个元素 ...

  5. 5分钟搞清楚Synchronized和Lock的概念与区别

    前言 并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock. Synchronized 和 Lock的概念 Synchronized 是Java 并 ...

  6. python爬虫--多任务异步协程, 快点,在快点......

    多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 ...

  7. AES-加密解密工具类

    注意:AES加密算法对于不同系统之间的tokens可能会不同,需要在相同的系统间使用 如果设置为private,在其它类调用AES访问不了这个tokens常量,需要自主定义一个tokens或者在配置文 ...

  8. js prop方法

    添加和删除属性 $("button").click(function(){ var $x = $("div"); <!--添加属性--> $x.pr ...

  9. 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

    一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除.修改),则会抛出Concurrent Modification Exceptio ...

  10. 《Java练习题》进阶练习题(二)

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题. [程序58 ...