Apex Batch Class用于更新自定义对象字段中的Contact字段

时间:2018-05-21 15:06:34

标签: salesforce apex-code apex

我有一个顶级批处理类,我需要更新一个联系人布尔字段' Active_Subscriptions__c'基于相关自定义对象字段的状态。

自定义对象'订阅_c'有一个' Contact__c'主细节领域,还有一个'IsActive__c'布尔字段。

我想运行一个批处理,它将通过Id找到与联系人记录相关的任何订阅。如果找到任何有效的订阅,则需要设置' Active_Subscriptions__c'在联系人记录中为true,否则设置为false。

我是apex的新手,并且似乎无法提前触发我需要的结果,提前感谢。

global class BatchContactUpdate implements Database.Batchable<sObject>{

    List <Subscription__c> mapSubs = new List <Subscription__c> ();
    List <Contact> contactlist = new List <Contact> ();

    global Database.QueryLocator start(Database.BatchableContext BC) {
        return DataBase.getQueryLocator([SELECT Id, Contact__c FROM Subscription__c WHERE Contact__c =:contactlist]);
    }

    global void execute(Database.BatchableContext BC , List <Subscription__c> mapSubs) {
        for (Subscription__c sub : mapSubs){ 
            for (Contact con : contactList){

                if (con.Id == sub.Contact__c && sub.IsActive__c == true){
                        contactlist.add(new Contact(
                            Active_Subscriptions__c = true
                           ));
                    } else {

                        contactlist.add(new Contact(
                            Active_Subscriptions__c = false
                           ));

                    }

            }   
       }

         update contactlist;
    } 

    global void finish(Database.BatchableContext BC){

    }

}

1 个答案:

答案 0 :(得分:0)

看起来你的联系人列表是空的开始,所以它不会返回任何结果。但是对于你的查询,为什么不做像

这样的事情
[SELECT Id, (SELECT Id FROM Subscriptions__r WHERE Is_Active__c = true) FROM Contact];

并在执行中执行

List<Contact> cList = new List<contact>();
for(Contact c : scope){
   c.Active_Subscriptions__c = c.Subscriptions__r.size() > 0;
   cList.add(c);
}
//etc... to start