【问题标题】:Apex Trigger - Junction ObjectApex 触发器 - 连接对象
【发布时间】:2017-07-29 15:29:56
【问题描述】:

请多多包涵,因为我是 Apex 和触发器的新手。

我有一个自定义对象,会议。此自定义对象是自定义 Junction 对象 Junction 的主对象。该 Junction 对象设置为允许我显示标准对象联系人的相关列表,从而将联系人与会议相关联。

我正在尝试创建一个 Apex 触发器,该触发器将在插入、更新、删除和取消删除通过 Junction 对象分配给会议的联系人之后触发。触发器需要做的就是更新会议对象上的一个字段,该字段显示与会议关联的联系人数量的计数。

我觉得我必须让这件事变得比需要的更难。我正在为这项任务的数据建模而苦苦挣扎 - 我假设我的触发器需要在 Junction 对象上,因为那是联系人的计数所在,所以我假设我的代码会开始:

在 Junction__c 上触发 ConferenceAttendeesUpdater(插入后, 更新后, 删除后, 取消删除后 ) {

这似乎是草率的代码,因为我认为只要连接对象更新,触发器就会触发,而实际上唯一需要的是联系人计数发生变化时。出于某种原因,我在概念上难以掌握我需要的方法。我认为它将包括 Junction__c.Contacts.size() 用于分配给会议的联系人计数?

任何帮助将不胜感激。

【问题讨论】:

    标签: salesforce apex apex-trigger


    【解决方案1】:

    是的,如果您想计算与联系人相关的 Junction__c 记录的数量,您可以将触发器放在 Junction__c 对象上。最佳实践是将您的逻辑放在一个类中而不是触发器中。以下是您想要的粗略实现。

    trigger ConferenceAttendeesUpdater on Junction__c (after insert, after update, after delete, after undelete ) {
      if ( Trigger.isAfter && Trigger.isInsert ){
        junctionHelper.afterInsert(Trigger.new);
      }
      if ( Trigger.isAfter && Trigger.isUpdate ){
        junctionHelper.afterUpdate(Trigger.new, Trigger.old);
      }
      if ( Trigger.isAfter && Trigger.isDelete ){
        junctionHelper.afterInsert(Trigger.old);
      }
      if ( Trigger.isAfter && Trigger.isUndelete ){
        junctionHelper.afterInsert(Trigger.new);
      }
    }
    
    public without sharing junctionHelper(){
      public static void afterInsert(List<Junction__c> newList){
        Map<Id,Contact> contactRollup = new Map<Id,Contact>();
        for ( Integer i=0;i<newList[i].size();i++ ){
          if ( newList[i].Contact__c != null ){
            contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0));
          }
        }
      }
      public static void afterUpdate(List<Junction__c> newList, List<Junction__c> oldList){
        Map<Id,Contact> contactRollup = new Map<Id,Contact>();
        for ( Integer i=0;i<newList[i].size();i++ ){
          if ( newList[i].Contact__c != oldList[i].Contact__c ){
            contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0));
          }
        }
      }
      public static void rollUpContacts(Map<Id,Contact> contactMap){
        for ( AggregateResult ar : [
          SELECT COUNT(Id) cnt, Contact__c parentId
          FROM Junction__c
          WHERE Contact__c IN :contactMap.keySet()
        ]{
          Id parentId = (String)ar.get('parentId);
          Decimal cnt = (Decimal)ar.get('cnt');
          contactMap.put(parentId,new Contact(Id=parentId,Number_of_Junctions__c=cnt));
        }
        update contactMap.values();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多