power automate怎么看批到哪里了?
微软dynamics 365 & power platform方面的工程师罗勇,也是20157月到2018年6月连续三年dynamics crm/business solutions方面的微软最有价值专家(microsoft mvp),欢迎关注我的微信公众号 msftdynamics365erluoyong ,回复395或者20200224可方便获取本文,同时可以在第一间得到发布的最新信息,follow me!dynamics 365 customer engagement已经强烈推荐使用power automate代替workflow,主要收集常见的问题做解答。1. power automate如何调用dynamics 365 customer engagement中的操作(action)?可以登录 或者 ,打开左边的solutions ,新建或者打开已有solution。然后新建flow。power automate怎么看批到哪里了调用操作时候,注意connector 要选择 common data service (current environment ).然后可以选择 perfrom a bound action 或者 perform an unbound action 进行调用即可。如果选不到,确认action已经激活,然后看看 https://***.crm.dynamics.com/api/flow/openapi 这个url访问是否报错。2. 如何获取选项集字段的显示文本。我开始以为直接查询的时候获取不到,以为只能获取到存储值,后来经高人指点是可以的。之前我的方法很笨,就是再查询一次stringmap实体,比如 https://***.crm.dynamics.com/api/data/v9.1/stringmaps?$filter=objecttypecode eq 'ly_demo' and attributename eq 'statuscode' and langid eq 1033 and attributevalue eq 1 。更好的办法是直接从trigger返回的body中获取值,注意选项集字段若为statuscode,需要写成 _statuscode_label。需要使用表达式输入,例如: triggeroutputs()?['body/_lvo_addresschangetype_label'] ,当然不要全部手写,可以选一个字段值,然后选择 peek code,查看使用的表达式,然后自己用表达式来输入,修改自动生成的表达式为自己想要的字段值即可。如果是通过 get a record等查询方式,请通过类似 outputs('your_action_name')?['body/ly_optionsetfieldname@odata.community.d**play.v1.formattedvalue'] 的表达式来获取。3.如何获取当前环境的base url。这个url很重要,我们在邮件或者别的地方插入链接让用户可以点击打开dynamics 365的记录就需要这个。参考文章 quick tip: cds base url in flow 可以知道从前面的查询中获取body中的@odata.id元素的值,然后分割下获取第一元素值即可,表达式类似:first(split(outputs('get_creators_primary_emailaddress')?['body']['@odata.id'],'/api/')) 。或者first(split(outputs('get_creators_primary_emailaddress')?['body']['@odata.context'], '/api/'))我一般用一个变量将这个值保存起来,假设变量名是currentenvbaseurl ,那么插入url使用的表达式就类似:concat(variables('currentenvbaseurl'),'/main.aspx?pagetype=entityrecord&etn=ly_demo&id=',triggeroutputs()?['body/ly_demoid'])power automate中可以用到的函数参考文档:reference guide to using functions in expressions for azure logic apps and power automatedynamics 365 customer engagement通过url打开记录,窗体,视图等请参考官方文档: open forms, views, dialogs, and reports with a url 4.如何查询的时候同时获取查找字段的其他信息(含主属性信息)。使用common data service (current environment) 这个connector中的get a record或者l**t records查询记录的时候,默认情况下对于查询字段只返回类似如下的三个属性: "_modifiedby_value@microsoft.dynamics.crm.lookuplogicalname": "systemuser", "_modifiedby_value@odata.type": "#guid", "_modifiedby_value": "21c43fb9-f446-ea11-a816-000d3a3788d7",如果我要获取查找字段的主属性值甚至其他值呢?如果我要获取modifiedby这个人主属性fullname的值甚至其邮箱呢?当然,通过再一次查询肯定可以。我这里介绍的是另外一种方法,原理可以参考我的文章 dynamics 365 we api odata语法根据父记录查询子记录,根据子记录查询父记录(附上根据团队,队列名称查成员) 。具体设置类似如下:然后你可能会问如何获取这个值?对于使用get a record,类似的表达式是 outputs('get_a_record')?['body/modifiedby']['internalemailaddress'] 对于使用l**t records,类似的表达式是 items('apply_to_each')?['modifiedby']['internalemailaddress'] 。也不用特别记忆,看自动生成的语法是什么样的,自己修改下即可。5.能调用自定义工作流活动吗?我认为当前不能,不代表后续不能。 对比可以参考官方文档, ,power automate的功能在不断增强。6.能发送邮件并显示在d365中的timeline吗?在power automate中可以通过outlook这个connector来发送邮件,但是这种邮件与dynamics 365的关系不大。有些时候我们希望能调用dynamics 365中workflow那种发送邮件的能力,发送的邮件能和d365的记录关联,并展示在关联记录的timeline中。答案是可以的,详情可以参考 send dynamics 365 emails from power automate 或者 creating and sending an email from dynamics 365 using power automate。我总结下重点,也是创建 email **s 这个实体记录,收件人可以通过 activity party attribute name 设置为to,然后在其对应的 activity party attribute value中设置值来设置,可以设置为类似 /contacts(@{triggeroutputs()?['body/contactlid']}) 这种。邮件的主题当然是subject字段,内容是description字段,关于字段会出现很多类似 regarding (opportunities) 的字段,找到你要管理的实体类型,设置为类似 /contacts(@{triggeroutputs()?['body/contactlid']}) 这种格式。发送邮件是通过 common data service (current environment ) 这个connector通过 perform an bound action来做的,调用的action name是sendemail,参考下图。如果要将收件人设置为文本字段的值,可以参考我这个博文 dynamics 365中使用工作流发邮件让其可以发往文本字段指定的邮箱 注册一个插件来实现。7.有类似child flow的功能吗?答案是有,2019年10月份ga的,可以参考官方文档 call child flows ,博文可以参考 october updates for microsoft flow 。一般对于child flow我选择power apps作为触发器,如果child flow有输出参数,那么它的最后一个action一般是respond to a power app or flow 或者 response。parent flow调用child flow的时候选择flows连接器下面的 run a child flow 这个action来调用。 8.异常处理一般如何做?可以参考 advanced error handling with power automate , microsoft flow error handling ,try-catch pattern in microsoft flow 。主要使用result函数,函数参考见 reference guide to using functions in expressions for azure logic apps and power automate 。参考官方文档:handle errors and exceptions in azure logic apps 。还需要考虑一些limit,官方文档请参考:limits and configuration **rmation for azure logic apps 我的如下可以供参考:用到的表达式分别是:result('main_scope')createarray('failed', 'timedout')item()['status'])body('filter_array')items('apply_to_each_result')['name']items('apply_to_each_result')['status']items('apply_to_each_result')['code']items('apply_to_each_result')['outputs']['body']['error']['**'] 20210311