示例 Dataverse 低代码插件(预览版)
[本主题是预发行文档,有可能会有所更改。]
这些插件示例的目标是帮助您通过将其集成到您的应用中来入门。 您将了解创作体验包括Microsoft Dataverse创作 Power Fx 表达式支持的自定义 API,用于在 Dataverse 内部或外部触发操作。
重要
- 这是一项预览功能。
- 预览功能不适合生产使用且功能可能受限。 这些功能在正式发布之前推出,以便客户可以提前使用并提供反馈。
先决条件
要将示例插件之一用于数据事件,必须在环境中安装 Dataverse 加速器应用程序。 详细信息: 创建低代码插件的先决条件
备注
电子邮件模板仅对特定表可用。 详细信息:创建电子邮件模板
返回非负值
此示例使用 Abs() 函数返回其参数的非负值。 如果是负数,Abs
将返回绝对值。
运行 Dataverse 加速器应用,然后在命令栏中选择新建操作 > 即时插件。
提供显示名称(如公式名称)和说明。
创建一个
Out
参数来验证有意义的预期行为(如字符串“可选”使用输入参数来简化测试)对公式是否有效。在公式编辑器中,用大括号括起
Out
参数:{Out: "" }
输入用于测试公式的表达式:
- 验证 IntelliSense 接受公式(文本将变为浅蓝色)。
- 例如,实施一个提供输出的表达式来帮助验证结果。
{Out: "Abs(-5) = 5: " & Text( Abs(-5) = 5 ) }
选择下一步,然后选择保存。
选择测试以测试此公式。 使用输出参数验证结果。
输入验证和自定义错误
重复检测
实现用于引发自定义错误消息的服务器端输入验证,例如重复错误检测。
- 运行 Dataverse 加速器应用,然后在命令栏中选择新建操作 > 自动化插件。
- 在“名称”框中,输入重复检查。
- 对于表,选择联系人。
- 对于要运行此插件规则需要执行的行操作,选择创建。
- 在公式框中输入此公式。
If( !IsBlank(LookUp([@Contacts],'Last Name'=ThisRecord.'Last Name' && 'First Name'=ThisRecord.'First Name')),
Error("You have existing contacts with the same first name and last name")
)
- 选择保存。
测试插件
- 若要测试插件,请通过执行以下步骤使用联系人表创建一个画布应用:指定表
- 创建一个联系人行。
- 再创建一个与上一步同名的联系人。
- 将显示一条消息,指出发现了重复记录。 在错误消息提示中选择忽略并保存。
将显示以下自定义错误消息:您有两位联系人的姓名相同。
数据验证
使用 ErrorKind 枚举显示特定类型的错误。
创建一个新的自动化插件。
提供以下值:
- 名称:验证输入
- 说明:检查日期是否有效,无效时是否引发错误
- 表:约会
- 要运行此插件规则需要执行的行操作:更新
输入下面的公式。
If(ThisRecord.'Due Date' < Now(), Error({ Kind: ErrorKind.Validation , Message: "The due date cannot be in the past" }) );
在高级选项下,将运行时间设置为操作前;您希望保存数据前运行此规则,以避免无效数据。
选择保存。
转到 Error() 函数详细了解自定义错误。
基于数据事件发送电子邮件
必备条件:
- 为您的环境设置服务器端同步。 详细信息:设置电子邮件、约会、联系人和任务的服务器端同步
- 电子邮件模板。
示例电子邮件模板
下面是一个可以为基于 SenMail 的数据事件创建的电子邮件模板示例:
- 模板类型:全局
- 名称:感谢下单
- 说明:使用此模板感谢客户下订单。
- 主题:
Thank you for your order <orderconfirmation-{!salesorder:Order Number; }>
- 正文:使用此代码。
Hello {!Sales Order:First Name;},
Order Type: {! Sales Order: Order Type;},
Location Type: {! Sales Order: Location Type;},
Address1: {! Sales Order: Address 1;},
Address2: {! Sales Order: Address 2;},
Preferred Service Start Date 1: {! Sales Order: Preferred Service Start Date;},
Next Step- We take upto 48 hrs to schedule an in-person and will notify you as soon as we have a In-person Technician allocated at your site. For any questions, please contact us at 1-800-CON-SOLAR
Yours Sincerely,
Contoso Sales
创建自动化插件
- 运行 Dataverse 加速器应用,然后在自动化插件下选择 +新建插件。
- 输入以下信息:
名称:SendEmailUponCreate
表:选择销售订单的逻辑表名称,即 SalesOrder。 此事件基于“销售订单”表。
要运行此插件规则需要执行的行操作:创建
公式:将下面的代码粘贴到公式框中。 有关 SendEmailFromTemplate 函数的详细信息,请转到 SendEmailFromTemplate 操作。
XSendEmailFromTemplate( LookUp('Email Templates',StartsWith(title,"Order Thank You")).'Email Template', ThisRecord, LookUp(Users,'Primary Email'="sampleemail@sample.com"),[ThisRecord.Email] )
- 选择高级 > 操作后。
- 选择保存。
将显示确认消息插件已成功保存。
基于即时操作发送应用内通知
开发者可以使用应用内通知在模型驱动应用中为用户配置可操作的上下文通知。
创建用于发送应用内通知的低代码插件
- 运行 Dataverse 加速器应用,然后在即时插件下选择 + 新建插件。
- 输入以下信息,然后选择下一步:
- 名称:NotifyNicnican1
- 说明:此即时插件用于通知应用用户。
- 在定义页面上,创建以下数据类型的输入参数:
- OrderID:字符串
- TechnicianEmail:字符串
- 公式。 将以下代码粘贴到公式框中。 有关此函数的详细信息,请转到 SendAppNotification 操作。
XSendAppNotification( "New service", LookUp(Users,'Primary Email'=TechnicianEmail), "You have a new solar panel installation scheduled on "& LookUp('Scheduling Results','OrderId'=OrderID).'ServiceDate'&" in "& LookUp('Service Orders','Order Number'=OrderID).City &". Contact the coordinator with any questions.", [ XCreateSidePaneActionForEntity( "View order", OrderID, "Sales Order", "cr8b8_serviceorder1", LookUp('Service Orders','Order Number'=OrderID).'Service Order' ) ] )
- 选择下一步。
- 在摘要页面中,选择保存。
调用应用内通知即时操作
- 选择一个画布应用,然后在命令栏上选择编辑(或新建一个)。
- 在左侧导航窗格中选择屏幕,或新建一个。
- 在插入菜单中,使用文本 通知技术人员向页面添加一个按钮。
- 选择此按钮,然后在 fx 编辑栏中输入以下信息,其中 DataCardValue17 是包含订单 ID 的列,DataCardValue15 是包含技术人员电子邮件地址的列。 在此示例中,将使用的画布应用名称为服务订单应用。
Environment.cr8b8_Notifytechnician1({ OrderID: DataCardValue17.Text, TechnicianEmail: DataCardValue15.Text }); Notify("The technician was notified!", NotificationType.Success, 2000);
- 保存并发布您的更改。
在应用中选择通知技术人员操作后,会向已分派给服务订单的技术人员发送应用内通知。 对通知执行的操作会在侧窗格中打开服务订单详细信息。
带有 MSN 天气连接器的示例即时插件
此插件使用MSN 天气连接器返回特定位置的当前天气。
必备条件:
- 创建低代码插件的先决条件
- 环境中允许 MSN 天气连接器
为 MSN 天气创建连接引用(如果在环境中尚不可用):
复制代码段:
使用智能感知完成公式编辑,并根据需要使用连接器响应属性:
保存
提示
如果要访问响应可能具有的不同属性,请使用 With() 函数从一个操作中捕获整个响应。 在下面的例子中,有一个输入参数 Location
(字符串)和一个输出参数 Out
(字符串)。
With({ /* Capture current weather response from connector */
c: new_MsnWeather.CurrentWeather( Location, "Imperial" ).responses.weather.current
},{ /* Return concatenated weather details */
Out: "Current temp: " & c.temp & " degrees. Feels like " & c.feels & " degrees. Wind speed is " & c.windSpd & " mph."
})
最佳做法
在自动低代码插件中处理无限循环错误
发生“Update”事件时,不要对自动插件编写 patch 语句,因为补丁发生在与插件相同的表上。 这会导致无限循环和插件执行失败。
问题模式:使用 Patch()
公式会触发另一个更新。
建议模式:改用 Set()
公式以避免此问题。