【问题标题】:Process builder and Trigger possible recursion流程构建器和触发可能的递归
【发布时间】:2020-11-26 12:10:03
【问题描述】:

我在 Order 对象上创建了一个触发器。 Order 和 Order 产品对象中都有一个称为 pacing 的字段。当订单中的 Pacing 更新时,我也在使用以下代码更新 Order Products 中与该特定订单相关的 Pacing 字段。

if(ord.Pacing__c != oldOrd.Pacing__c) {
      changedPacing.put(ord.Id, ord);
      pacingMapVal.put(ord.Id, oldOrd.Pacing__c);
}

if(changedPacing.size() > 0) {
      OrderToOrderProductAutomation.updateLineItemRecord(changedPacing, null, null, null, pacingMapVal);
}

if(pacingArgMapVal != null && pacingArgMapVal.size() > 0) {
       List<OrderItem> updates = new List<OrderItem>();
       for (OrderItem detail : [SELECT Id, OrderId, Customer_Success_Manager__c, Line_Item_Start_Date__c, Line_Item_End_Date__c, Pacing__c
                                            FROM OrderItem
                                            WHERE OrderId IN :ordersListMap.keySet()]) {
            Order oso = ordersListMap.get(detail.OrderId);
            String pacing = oso.Pacing__c;
            if (detail.Pacing__c == pacingArgMapVal.get(detail.OrderId)) {
                 detail.Pacing__c = pacing;
                 updates.add(detail);
            }
        }
        update updates;
  }

我创建了流程构建器,每当特定 6 个字段按顺序更新时,它会在名为 History__c 的自定义对象中创建一条记录,包括使用流程构建器调用流程。

现在每当我更新节奏时。在历史对象中创建了 3 个相同的记录。当我评论我的触发代码时,会按预期创建一个历史记录。谁能告诉我为什么会发生这种情况以及我该如何解决这个问题。

注意:Order Object 中有 3 个汇总字段,用于 Order Product 对象。

这就是我的流程构建器条件的样子。

【问题讨论】:

    标签: recursion salesforce apex processbuilder custom-object


    【解决方案1】:

    没有调试日志很难说,所以这更多的是几个想法。这是一段代码还是合并2?变量名有点混乱。

    这是如何运行的?仅在订单上“更新后”?

    您将值写入pacingMapVal,但从pacingArgMapVal 读取值。它是同一个变量(只是在传递给函数或其他东西时重命名)?如果这些是单独的变量,我猜pacingArgMapVal 是空的。它上面的任何get 都将返回null,因此您正在与null 进行比较。您是否打算仅将此值级联到 Pacing = null 的行?你可以用WHERE OrderId IN :ordersListMap.keySet() AND Pacing__c = nullWHERE OrderId IN :ordersListMap.keySet() AND Pacing__c IN :pacingArgMapVal.values() 做得更聪明...

    类似ordersListMap - 这是在哪里设置的?

    您(可能)在OrderToOrderProductAutomation.updateLineItemRecord 内部发生了 1 次更新。我们不知道里面是什么,你有没有可能复制代码?

    然后在update updates; 中发生了另一个更新(除非它没有更新任何东西)。

    您的流程/流程构建器如何决定何时写入新行?

    【讨论】:

    • 您好,抱歉回复延迟。您在上面看到的代码取自两个不同的地方。前两个 if 块来自触发器,第三个块来自处理触发器调用的关联顶点类。我从触发器传递参数并在类中使用它,因此变量名称有所不同。
    • 当订单级别的 Pacing 从一个选项列表值更新为另一个选项列表值时,我的流程构建器会创建一个自定义对象记录。此外,我还设置了触发逻辑,该逻辑在 Order 更新时使用 Order 的 Pacing 字段值更新 Order Item 中存在的 Pacing 字段。我开始认为,这是导致问题的原因。订单到订单行项目中有 3 个汇总汇总字段。当触发器更新行项目值时,它们可能是再次调用流程构建器的罪魁祸首。
    • 流程构建器的决策节点中有什么(蓝色菱形)。如果你把一些 ISCHANGED() 公式放在那里,那么它不应该在汇总期间执行。
    • 其实我一直在使用 ISCHANGED() 条件。我已经编辑并添加了决策节点中的条件在问题中的样子。
    • 有趣。汇总不应该以任何方式影响这 6 个字段?这 6 个字段都不是汇总,没有一个通过工作流更新或在汇总字段更改等时触发的东西?您可能需要查看调试日志,也许还有其他触发器/工作流程/流程/流程在起作用。如果您稍微消除它,请更改仅在第一次(起搏)时执行的此过程的新版本,并查看它是否写入了一个或 3 个条目。另外 - 你可能是help.salesforce.com/… 的受害者,看看你是否可以临时禁用和测试。
    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 2017-12-31
    • 2010-11-30
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多