我是微软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. Python一秒搭建ftp服务器,帮助你在局域网共享文件

    "老板 来碗面" "要啥面?" "内牛满面.." 最近项目上的事情弄得人心累,本来是帮着兄弟项目写套入口代码,搞着搞着就被拉着入坑了.搞开发 ...

  2. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: REFERENCES command denied to user 'nali'@'localhost' for table 'dbs'

    按照教程 Install hive on Mac with Homebrew,在 mac 上安装 Hive 时, 最后执行 hive 命令后,出现错误: Exception in thread &qu ...

  3. HTTP/2简介

    1.HTTP/2的定义: HTTP/2即超文本传输协议2.0,是HTTP/1.1下一代的协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (htt ...

  4. springboot执行延时任务-DelayQueue的使用

    DelayQueue简介 在很多场景我们需要用到延时任务,比如给客户异步转账操作超时后发通知告知用户,还有客户下单后多长时间内没支付则取消订单等等,这些都可以使用延时任务来实现. jdk中DelayQ ...

  5. nmon脚本——对Linux服务器的监控

    继服务器被挖之后,我又开拓了另一个监控工具----nmon! Nmon可以很轻松的监控系统的CPU.内存.网络.硬盘.文件系统.NFS.高耗进程.资源和IBM Power系统的微分区的信息,还有专属的 ...

  6. [TimLinux] Linux shell获取进程pid

    调用脚本时,获取进程PID: (/this/is/a/script/file.sh > /out/to/log.txt & echo $!) & 脚本内部,获取进程PID: ec ...

  7. CodeForces1006F-Xor-Paths

    F. Xor-Paths time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  8. 使用flatbuffers

    问题 张三是个java程序员,他写产生数据的程序.李四是个python程序员,他要用python处理张三产生的数据.最直观常用的方法就是张三用java把产生的数据保存成csv或者xml文件,然后李四用 ...

  9. 【JS】324- JS中的内存管理(中高级前端必备)

    前言 像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()用于分配内存和释放内存.而对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不再 ...

  10. Java_输入整数求阶乘

    import java.util.Scanner;public class Work4{ public static void main(String[] args){ // 创建Scanner对象 ...