数据操作
您可以使用插件,将修改或增强数据的逻辑集中起来。 即时插件非常有用,因为可以随时按需完成操作。 例如,您可以使用一个 ScheduleService 即时插件,通过连接器在预订服务中查找下一个可用的服务时段。 然后,该连接器可以创建与请求者相关的数据行,以跟踪预订。
在将主数据行添加到 Dataverse 后,非常适合用自动插件修改数据或添加相关数据行。 自动插件的一项显著优势是插件所做的任何数据更改都是原始事务的一部分,系统可完成事务或回滚所有改动。 例如,请考虑这样一个场景:当您创建一个项目数据行时,一个运行的插件会创建一些与该项目相关的初始任务。 如果其中一项任务无效,创建失败,系统将回滚该项目以及任何已创建的任务。
在保存数据之前进行更改
在保存数据之前进行更改选项仅适用于针对创建或更新的事件运行的自动插件。 在这两种情况下,您都可以将插件设置为在预操作期间运行,这样您就有机会在保存之前修改正在创建或更新的行中的数据。 在您想要设置一些默认值的情况下,此选项很有用。 此外,您可以使用条件 Power Fx 逻辑,使默认值取决于您正在修改的行中的其他数据。
您需要在预操作时运行插件,并使用 Set 函数修改数据列。 这种方法可确保在保存数据行时包含您的改动,而不是将这些改动作为另外的更新完成(这可能会导致无限循环,还可能因单独的更新而触发不需要的自动化运行)。
以下示例展示如何使用 Set 函数修改您正在创建的项目行中的预算列。
Set(contoso_budget,1000)
对于触发插件的行,您只能使用这种方法来更改其中的数据。 您无法在预操作阶段创建相关数据,因为没有可用于附加相关数据的主行。
创建相关数据行
另一种常见的场景是,您想要创建与主数据行相关的数据。 您可以通过使用即时和自动插件来完成此任务。为此,您可以使用 Collect 函数来添加数据。 例如,以下函数可自动将项目的创建者添加为初始团队成员。
Collect([@'Team Members'],{Name: "David So",'Team Project': ThisRecord })
在上一示例中,ThisRecord 是通过即时插件传入的项目行(该插件设置的实体范围是项目表),或者通过“Create of the project”表的自动插件传入的项目行。
在某些应用场景中,您需要使用 Patch 函数而不是 Collect 函数。 例如,当您处理 Tasks 表中的 Regarding 列时,可以使用 Patch 函数,以便系统能够正确设置 Regarding 列。 这是因为 Regarding 列是多态的,可以指向许多不同的表行类型。 以下示例展示了一个在创建项目时运行的插件,用于添加每个项目都会有的一些初始任务。
Patch([@Tasks], Collect([@Tasks], { Subject : "Review Project"} ),{ Regarding: ThisRecord });
Patch([@Tasks], Collect([@Tasks], { Subject : "Schedule Project Launch"} ),{ Regarding: ThisRecord });
Patch([@Tasks], Collect([@Tasks], { Subject : "Assign Project Lead"} ),{ Regarding: ThisRecord });
在上一个示例中,Patch 函数和 Collect 函数结合使用以更新 Regarding 列。
查找并删除相关数据
另一个常用场景是有条件地删除相关数据。 例如,您可以创建一个名为“取消项目”的即时插件。 对于您要取消的项目,此插件将具有 EntityReference 类型的输入参数。 然后,此插件可以更新项目行,指示它已被取消,然后查找并删除公开工作项,这样就没有人可以处理已取消的项目。 以下逻辑展示了用于查找与项目相关的所有工作项的表达式,并显示了如何使用 ForAll 循环遍历每个工作项并调用 Remove。
ForAll(Filter([@'Work Items'], 'Team Project'.'Team Project' = Project.'Team Project'), Remove([@'Work Items'], ThisRecord))