1

请耐心等待,因为我是 Apex 和触发器的新手。

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

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

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

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

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

任何帮助将不胜感激。

4

1 回答 1

0

是的,如果您想计算与联系人相关的 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();
  }
}
于 2017-07-31T19:37:10.333 回答