Object 更新父标准对象,从APEX中的子对象获取和值

Object 更新父标准对象,从APEX中的子对象获取和值,object,collections,salesforce,apex,soql,Object,Collections,Salesforce,Apex,Soql,我是新来的。我想在插入之前在apex中为编写一个触发器。我有两个标准对象(联系人、机会) 我想知道触发器何时运行这个get sum(Amount)字段和Bussiness\uuuu c值,然后用sum(Amount)值更新Contact Total\u Business\uu c。这里business_u_C是opportunity对象的联系人id 提前感谢并等待您的积极回应 我假设您的组织中没有启用货币(如果您在对象的某处看到“CurrencyIsoCode”,您必须稍微修改一下此设计) 我是

我是新来的。我想在插入之前在apex中为
编写一个触发器。我有两个标准对象(联系人、机会)

我想知道触发器何时运行这个get sum(Amount)字段和Bussiness\uuuu c值,然后用sum(Amount)值更新Contact Total\u Business\uu c。这里business_u_C是opportunity对象的联系人id

提前感谢并等待您的积极回应

  • 我假设您的组织中没有启用货币(如果您在对象的某处看到“CurrencyIsoCode”,您必须稍微修改一下此设计)
  • 我是一个懒惰的人,你没有写任何关于你期望的数据量的东西。当每个联系人都有合理数量的机会时,我所写的将起作用。如果开始达到调控器限制的50K查询行数,则必须采用不同的方式(我将在最后写一点)
  • 我不会给你们一个现成的解决方案,因为“自制汇总”是你们在SF DEV 501认证过程中可能遇到的任务之一。我将概述一些要点和供思考的东西
  • 我不会在插入前执行
    ,插入后、更新后执行
    会更容易(金额发生变化时,您没有考虑重新计算,是吗?)。如果您的用户被允许删除Opportunity,那么还应该在删除后和取消删除后说明

    第一件事是建立一套“我们必须重新计算的联系人”:

    这种类型的查询返回一个“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;
    
    List contactsToUpdate=new List();
    对于(AggregateResult ar:[选择业务,合计(金额)合计金额
    来自机遇
    其中业务(在:联系人ID中){
    系统调试(ar);
    contactsToUpdate.add(新联系人(Id=(Id)ar.get('Business___c'),
    业务总额c=(双倍)应收账款(合计金额)
    );
    }
    更新联系人更新;
    
    正如我所说,这是一个基本的大纲,应该让你开始


    此功能查询给定联系人的所有机会。您的触发器最多可触发200个Opp。假设您在所有200个Opp上更改联系人->为您提供400个需要更新的联系人,以清除/修复旧值并设置新值。假设未触发其他业务逻辑,则有50K行限制(比如账户更新?因为添加了一些Opportunity产品而启动的操作?)当平均有1个联系人参与125个Opp时,它会给您带来问题。这听起来像是一个荒谬的问题,但在某些情况下,您需要以不同的方式进行操作

    在这种情况下,您可以从另一个角度对其进行攻击。您实际上不需要查询给定联系人的所有Opp,这是懒惰的。您可以学习total business的当前值(如果正好为空,则将其置为0)然后根据需要添加/减去对数量的所有更改,只查看您的trigger.old和trigger.new。这有助于更多代码和更多前期规划,但性能将显著提高,并且此解决方案将随着Opp数量的增长而扩展(它将继续只查看触发器范围内当前最大的200 Opp)


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

    是否使用货币管理,或者是否在组织级别以相同货币指定系统中的所有值?
    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);
    
    SELECT Business__c, SUM(Amount) sumAmount
    FROM Opportunity
    WHERE Business__c IN :contactIds
    
    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;