Apex Batch Class для обновления поля контакта из поля настраиваемого объекта - PullRequest
0 голосов
/ 21 мая 2018

У меня есть класс пакета Apex, который необходим для обновления логического поля контакта «Active_Subscription__c» на основе состояния связанного поля настраиваемого объекта.

Пользовательский объект «Subscription__c» имеет мастер «Contact__c».поле сведений, а также имеет логическое поле IsActive__c.

Я хочу запустить пакет, который найдет все подписки, связанные с записью контакта по идентификатору.Если он находит какие-либо активные подписки, ему нужно установить для параметра Active_Subscription__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 голосов
/ 22 мая 2018

Похоже, ваш список контактов пуст для начала, поэтому он не вернет никаких результатов.Но для вашего запроса, почему бы вам не сделать что-то вроде

[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
...