如何利用流(flow)新建一个累计汇总(Roll-Up Summary)字段?

Salesforce flow study

​累计汇总(Roll-Up Summary)字段广泛应用于Salesforce中,但是其限制是只能适用于Master-Detail关系,而普通的查找关系(Lookup Relationship)是不能新建累计汇总(Roll-Up Summary)字段。如果有该需求,常用做法是新建一个字段,通过系统的触发器进行计算。

今天带大家来探讨一下,如何利用流(flow)和进程生成器(Process builder)在查找关系(Lookup Relationship)中新建一个累计汇总(Roll-Up Summary)字段

假设现在我们有如下案例:

我们新建一个对象名字为Project ,同时与Account建立查找关系(Lookup Relationship),并且建立如下字段:

现在需要做的是每一次添加一个Project,都会计算该Project对应的Account一共拥有多少个Project,由于Account和Project不是Master-Detail 关系,我们无法新建累计汇总(Roll-Up Summary)字段。因此,可以在Account对象下,新建一个Number字段,名字为Project Count Total。

接下来需要做的是:每一次Project数据变动,通过进程生成器(Process builder)调用流(flow)统计Project的Account下面的所有Project数量,并且更新回Account的字段:Project Count Total。

现在我们先新建一个Flow。

Flow的步骤如下:

  1. 通过外部传入Project对象的Account的Id, 利用这个Account的Id获得有关的Project

  2. 创建循环,遍历这个Account下面的Project数据

  3. 在每一次循环时候,累加总数。

  4. 将该总数更新回Account字段中。

现在我们先实现第一步,利用一个外部参数:Account的Id,查询到所有有关的Project数据。现在,新建一个Get Records:

这里对象选择的是Project,因为我们需要统计的是Project一共有多少数据。在Account等于某一个Value处,我们需要新建一个value,选择新建一个resource,选择variable,这里命名为curAccountID。我们会在之后其他地方传入这个ID,同时,我们会在之后基于这个变量更新Account的相关字段。

新建完输入变量之后,在store Project Records处,新建另外一个variable,设定输出变量。

这里命名store的Records为curAccountProjects,同时选择Allow multiple values, 因为可能查询多于一个Project的记录。这个在Apex中就是List的变量。

最后整个Get Records页面如下,并点击Done。该步骤返回的是一组Project数据。

接下来,我们写上面步骤的第二步:设计循环。这里新建一个Loop,Collection Variable选择Get Records 里面定义的curAccountProjects。

在select Loop Variable里面,需要新建一个变量Variable,也就是每一次遍历时候的Project这个变量。

然后,在Select Loop Variable中选择 Loop Variable 为{!Project},如下:

建完循环之后,需要新建一个Assignment,也就是基于上面的循环Loop,统计有多少记录数目。

在Set Variable Values处,新建一个Variable,命名其为TotalProjectCount

然后,在Set Variable Values,选择Equals Count 之前Loop的变量值curAccountProjects,也就是不断累加,最后Assignment如下。

最后,把countProjects(Loop)和Total Project Count(Assignment)连起来,选择每一个item都执行累加计算。然后,再把Total Project Count(Assignment)和countProjects(Loop)连一次,形成一个循环。

截止目前的整个Flow如下,已经实现了统计循环里面的数据数目的功能:

计算了总共的Project数目之后,需要把总数更新回Account中,这里我们新建一个Update Records 元素:

这里选择Specify conditions to identify records, and set fields individually,并且选择更新的是Account对象:

选择Account数据的条件为设定Account的ID为之前定义的会有外部传入的curAccountID。也就是说,之后会传入一个Account ID经过一系列计算,把总值更新回Account对象里面。然后更新的字段为我们新建的Account roll up summary的number field。注意这里是一个普通数字的字段。并且把Total Project Count(Assignment)里面的变量TotalProjectCount传入Account的字段中。

最后的flow样式如下:

最后保存Flow:

至此,整个Flow已经完成了。

现在可以测试你的flow,点击flow的右上角的debug,输入Account Id。

这里拿了两条数据的Account进行测试

可以看到debug的结果是计算出有两条Project 数据,并且更新了现在的Account。

测试完成之后,返回Flow,激活你的flow。

然后需要新建一个进程生成器(Process builder)触发这个Flow。

选择每次新建或者编辑Project数据时候都执行这个进程生成器(Process builder):

然后选择无条件进入Flow:

进入Flow需要传入变量,把Project对象上的Account字段传进去:

这里value 处选择[Project__c].Account__c,传入Account Id。

然后点保存并且激活Process builder。至此整个功能已经完成了。整个过程没有用代码实现。

后记:

由于process builder我们设定只能是数据更新和建立才能被触发,如果数据被删除是不能被触发的。目前Workflow, Visual Workflow, Process Builder都无法在数据被删除时候被触发,有关idea可以参考如下链接:

https://success.salesforce.com/ideaView?id=08730000000DlPBAA0

参考链接:

【1】https://admin.salesforce.com/use-flow-builder-to-create-a-roll-up-summary-field

【2】https://youtu.be/EDD_7wDmPGY