使用Cloud Flow无代码实现读取Excel授予用户角色

Posted luoyong0201

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Cloud Flow无代码实现读取Excel授予用户角色相关的知识,希望对你有一定的参考价值。

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

前面的博文:​​读取Excel对用户执行增加/移除角色的控制台程序​​ 我用的是程序,微软大力推荐低代码平台Power Platform,我今天就做个简单的例子,我就读取Excel来授予用户角色。

大致包括几个步骤:

  • 读取Excel中的所有记录
  • 每行看下【增加角色】列是否有值
  • 【增加角色】列有值的话,查询下用户是否已经有这个角色
  • 若用户没有这个角色,再去Dynamics 365中查询这个角色的信息
  • 若是Dynamics 365存在这个角色的信息,将其授予给用户


我的Excel内容示例如下:

使用Cloud


首先需要对Excel进行处理,选择要处理的内容,点击 【Insert】 > 【Table】,其余保持默认即可。

使用Cloud


还需要将要处理的Excel上传到某个地方,我这里上传到Onedriver for business中,如下:

使用Cloud


登录 ​​https://make.powerapps.com/​​ ,点击 Solutions,打开自己的某个Solution,点击【New】>【Automation】>【Cloud flow】>【Instance】,我这里是新界面,如果不一样也不用担心,Instant类型的flow一般是手工触发运行,其他两种类型的Cloud flow从名字可以看出来,第一种是事件触发的flow,第三种是定期运行的flow。

使用Cloud


弹出界面我这么设置,触发器(trigger)我选择Manually trigger a flow。

使用Cloud


我先使用Initialize variable 这个Action 声明两个数组类型的变量。

使用Cloud

使用Cloud


然后使用Excel Online (Business)中的 List rows present in a table这个Action来获取excel中的数据。

使用Cloud


这个步骤的具体设置如下:

使用Cloud


对于每行数据我要循环处理,都要查询其用户信息,所以我添加一个Microsoft Dataverse下面的List rows 这个Action。

使用Cloud


我根据用户名来查询用户,写法如下,我这里只查询处我需要的三列fullname,_businessunitid_value,systemuserid,注意对于查找字段不能写字段逻辑名,前面要加上_,后面要加上 _value,这个用户名我使用前面步骤返回的【用户主体名称】这个字段的值,选择后可以看到自动会帮我生成一个for each。我这里还设置了Row count为1,因为我只需要第一条记录即可。

使用Cloud


我先检查要增加的角色列的值不为空,如下:

检查的左边的表达式是:empty(items(Apply_to_each_Excel_Row)?[增加角色])

操作符是:is not equal to

右边的表达式是 true。

如果不为空我这里会将之前声明的变量 toAssociateRoles 设置为null,用来存储每个用户需要添加的角色清单。

使用Cloud


下面我还是用一个for each将角色放到变量toAssociateRoles待用。这个for each针对的表达式是 split(items(Apply_to_each_Excel_Row)?[增加角色],;) ,也就是每行excel的【增加角色】列的值使用;分隔成一个数组,然后逐个添加到变量toAssociateRoles。

使用Cloud


然后我需要找出用户当前有哪些角色,需要添加的角色用户当前不拥有我才添加给用户。所以我查询下用户的角色,这里我用的FetchXml进行查询,如下:


<fetch version=1.0 mapping=logical distinct=true no-lock=true>
<entity name=role>
<attribute name=name />
<attribute name=roleid />
<link-entity name=systemuserroles from=roleid to=roleid visible=false intersect=true>
<link-entity name=systemuser from=systemuserid to=systemuserid alias=ad>
<filter type=and>
<condition attribute=systemuserid operator=eq value=@{items(Apply_to_each_User)?[systemuserid]} />
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>

使用Cloud


类似的,我清空 CurrentRolesofUser变量后用个foreach将用户的角色添加到CurrentRolesofUser变量中,用变量是为了后面维护起来方便。

使用Cloud


然后我需要针对每个要添加的角色,看下用户当前是否存在。这个for each的输入表达式是 variables(toAssociateRoles) ,检查表达式左边是 contains(variables(CurrentRolesofUser),items(Apply_to_each_toAssiciateRoles)) ,右边是false。

使用Cloud


如果不存在,当然我们要先查询出这个角色的id,查询角色id需要根据角色名称+用户的业务部门来查询,类似如下:

name eq @{items(Apply_to_each_toAssiciateRoles)} and _businessunitid_value eq @{items(Apply_to_each_User)?[_businessunitid_value]}

使用Cloud


如果查询到了角色,也就是判断这个查询结果是否返回记录,我这里进行如下判断:

length(outputs(Get_role_info_by_role_name_and_business_unit)?[body/value]) 的值是否等于1.

使用Cloud


如果找到的话就授予用户这个角色,没有找到可能就是角色名称写错了。

授予角色不是更新记录,需要用到 Relate rows这个Action

使用Cloud


具体的Action设置如下:

Row ID我设置的表达式是:items(Apply_to_each_User)?[systemuserid]

Relate with我设置的表达式是:first(outputs(Get_role_info_by_role_name_and_business_unit)?[body/value])[@odata.id]

因为我知道前面步骤返回role的数组只有一个元素,所以我这里也不想自动生成for each了,直接取第一行,让flow看起来更加简单一点。

使用Cloud


保存成功后就可以测试了,点击右上角的 Test进行测试,测试结果没问题。

使用Cloud


以上是关于使用Cloud Flow无代码实现读取Excel授予用户角色的主要内容,如果未能解决你的问题,请参考以下文章

无法解码密钥的 json 类型:Spring Cloud Data Flow 流中的 file_name

分析 Cloud Data Flow BigQuery 吞吐量/流水线

Spring Cloud Data Flow初探

Swarm 的 Spring Cloud Data Flow 支持

java无依赖读取Excel文件

在Cloud Flow和Workflow中使用多选选项集类型字段