触发特定的帐户记录类型

时间:2018-07-02 09:45:56

标签: triggers salesforce apex recordtype

因此,我编写了一个触发器,该触发器工作得很好,并且完全可以执行我希望它执行的操作,但事实是,它可以在所有帐户上完成该工作,并且我希望它仅对一种记录类型起作用帐户。 有人可以告诉我要添加到触发器中的内容吗,这样我才能使其仅适用于一种记录类型?

以下是我的处理程序类:

public class AP03_OpportunityLineItem {
    public static void preventmultipleOpportunityLineItems(List<OpportunityLineItem> listOppLineItems){
        Set<Id>opportunityIds = new Set<Id>();
        // get all parent IDs
        for(OpportunityLineItem oli : listOppLineItems)
        {
            //Condition to pick certain records
            opportunityIds.add(oli.OpportunityId);
        }
        // query for related Opportunity Line Items
        Map<Id, Opportunity> mapOpportunities = new Map<Id, Opportunity>([SELECT ID,
                                                                          (SELECT ID 
                                                                           FROM OpportunityLineItems) 
                                                                          FROM Opportunity 
                                                                          WHERE ID IN :opportunityIds]);
        // opp counter of new records
        Map<Id, Integer> mapOppCounter = new Map<Id, Integer>();
        for(OpportunityLineItem oli : listOppLineItems)
        {
            if(mapOppCounter.containsKey(oli.OpportunityId))
            {
                mapOppCounter.put(oli.OpportunityId, mapOppCounter.get(oli.OpportunityId)+1);
            }
            else
            {
                mapOppCounter.put(oli.OpportunityId, 1);
            }
        }
        //loop to add error if condition violated
        for(OpportunityLineItem olitems : listOppLineItems)
        {
            if(mapOpportunities.get(olitems.OpportunityId).OpportunityLineItems.size()+mapOppCounter.get(olitems.OpportunityId)>1 || olitems.Quantity > 1)
            {
                olitems.addError('Ce client peut seulement loué un seul véhicule.');
            }
        }
    }
}

以下是我的PAD课程:

public class PAD 
{
    public static String bypassTrigger; //List of bypassed triggers

        public static final User user;

        static {
            user = [Select BypassApex__c
                   from User 
                   where Id=:UserInfo.getUserId()];
            bypassTrigger = ';'+ user.BypassApex__c+ ';';                                                                                                                                   
            System.debug('>>>>> PAD constructor : END <<<<<'+bypassTrigger);
        }

        /**
        * Method used for the class PAD
        * @param c object of type JonctionServicePrestation__c
        * @return boolean
        */
         public static boolean canTrigger(string Name){
            return (bypassTrigger.indexof(';' + Name + ';') == -1);

         }



}

以下是我的触发器:

trigger OpportunityLineItemBeforeInsert on OpportunityLineItem (before insert) {
    if(PAD.canTrigger('AP03_OpportunityLineItem')){
        AP03_OpportunityLineItem.preventmultipleOpportunityLineItems(Trigger.new);
    }
}

1 个答案:

答案 0 :(得分:0)

您将需要遍历机会产品并构建机会ID列表,然后使用要匹配的记录类型查询列表中其帐户的机会,并构建一组与指定记录类型匹配的ID然后检查该集合是否包含正在处理的机会的accountId,以了解是跳过还是处理它。

Set<Id> recordTypeOpp = new Set<ID>();
SET<Id> opportunityIds = new Set<Id>();
Id recordTypeIdYouWant = Schema.SObjectType.Account.getRecordTypeInfosByName().get('Record Type Name').getRecordTypeId();

for(OpportunityLineItem  item : listOppLineItems){
    opportunityIds.add(item.OpportunityId);
}

for(Opportunity item : [SELECT Id FROM Opportunity WHERE opportunityIds IN :opportunityIds and Account.RecordTypeId = :recordTypeIdYouWant]){
    recordTypeOpp.add(item.Id);
}

 for(OpportunityLineItem olitems : listOppLineItems)
 {
    if(recordTypeOpp.contains(olitems.OpportunityId)){
      //do processing
    }
     else {
       continue;
    }
 }