【问题标题】:Update Parent Standard Object Getting Sum Value from Child in APEX更新父标准对象从 APEX 中的子对象获取总和值
【发布时间】:2014-05-15 01:47:31
【问题描述】:

我是 Apex 的新手。我想为before insert 编写一个触发器。我有两个标准对象(联系人、机会)。

SELECT  sum(amount),  Bussiness__c FROM opportunity
WHERE stagename='Closed Won' and id='006i000000Kt683AAB' GROUP BY   Bussiness__c

我想在触发器运行时获取 sum(Amount) 字段和 Bussiness__c 值,然后使用 Sum(Amount) 值更新 Contact Total_Business__c。这里的 Bussiness__C 是机会对象中的联系人 ID。

提前致谢,等待您的积极回复。

【问题讨论】:

  • 您是否使用货币管理,或者您在系统中看到的所有值都是在组织级别指定的相同货币?

标签: object collections salesforce apex soql


【解决方案1】:
  1. 我假设您的组织中没有启用货币(如果您在对象的某处看到“CurrencyIsoCode”,则必须稍微修改此设计)。
  2. 我是一个懒惰的人,你没有写任何关于你期望的数据量的东西。当每个联系人有合理数量的机会时,我所写的内容将起作用。如果您开始达到 50K 查询行的州长限制,则必须以不同的方式完成(我会在最后写一点)。
  3. 我不会为您提供现成的解决方案,因为“自制汇总摘要”是您在 SF DEV 501 认证期间可能遇到的任务之一。我将概述一些指示和思考。

我不会这样做before insert,在after insert, after update 中更容易(当金额发生变化时,您没有考虑重新计算,是吗?)。如果您的用户被允许删除机会,也应该对after delete, after undelete 进行说明。

首先是建立一组“我们必须重新计算的联系人”:

Set<Id> contactIds = new Set<Id>();
for(Opportunity o : trigger.old){
    contactIds.add(o.Business__c);
}
for(Opportunity o : trigger.new){
    contactIds.add(o.Business__c);
}
contactIds.remove(null);

这会强制重新计算所有相关联系人,并忽略没有联系的机会。它总是会触发......这不是最好的事情,因为在插入、删除、取消删除时,您希望它始终触发,但在更新时,您希望它仅在金额或联系人更改时触发(trigger.old 将与 trigger.new 保持不同的联系)。您可以使用 Trigger.isUpdate 之类的东西来控制这些场景,请阅读它。

无论如何 - 您有一组独特的联系人 ID。我说过我会在“之后”触发器中执行此操作,因为此时新的金额已经保存到数据库中,您可以从中查询:

SELECT Business__c, SUM(Amount) sumAmount
FROM Opportunity
WHERE Business__c IN :contactIds

这种类型的查询返回一个“AggregateResult”,您必须像这样解析它:

List<Contact> contactsToUpdate = new List<Contact>();
for(AggregateResult ar : [SELECT Business__c, SUM(Amount) sumAmount
    FROM Opportunity
    WHERE Business__c IN :contactIds]){

    System.debug(ar);
    contactsToUpdate.add(new Contact(Id = (Id) ar.get('Business__c'),
        Total_Business__c = (Double) ar.get('sumAmount)
    );
}
update contactsToUpdate;

正如我所说 - 这是一个基本大纲,应该可以帮助您入门。


这个东西查询给定联系人的所有机会。您的触发器最多可以触发 200 Opps。想象一下,您更改所有 200 个 opps 的联系人 -> 为您提供 400 个联系人,您需要更新以清除/修复旧值并设置新值。使用 50K 行限制,假设没有触发其他业务逻辑(例如更新帐户?由于添加了一些机会产品而开始的操作?)当平均 1 个联系人参与 125 个 Opps 时,它会给您带来问题。这听起来像是一个荒谬的问题,但在某些情况下您需要采取不同的方式。

在这种情况下,你可以从另一个角度攻击它。您实际上并不需要查询给定联系人的所有 opps,它很懒惰。相反,您可以了解总业务的当前值(如果恰好为空,则输入 0),然后根据需要添加/减去对金额的所有更改,只查看您的 trigger.old 和 trigger.new。它需要更多的代码和更多的前期规划,但性能会显着提高,并且此解决方案将随着 opps 数量的增长而扩展(它将继续仅查看触发器范围内当前的最大 200 opps)。

另一种方法是接受此汇总摘要中的一些延迟并为其编写批处理作业。

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2022-12-15
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多