2014-02-10 1 views
0

У меня есть пакетная программа, которая мне нужна для объединения (свертывания) нескольких полей валюты по конкретному контакту и фонду. Мне нужен свежий взгляд на это, так как я не могу понять, как мне нужно правильно сворачивать поля по контакту и фонду.как заполнить записи в списке

Вот мой текущий код в пакетной программе:

for (My_SObject__c obj : (List<My_SObject__c>)scope) { 
     if(!dbrToContactMap.isEmpty() && dbrToContactMap.size() > 0) { 
      if(dbrToContactMap.containsKey(obj.DBR__c)) { 
       List<Id> contactIds = dbrToContactMap.get(obj.DBR__c); 
       for(Id contactId : contactIds) { 
        My_Rollup__c rollup = new My_Rollup__c(); 
        rollup.Fund_Name__c = obj.FundName__r.Name; 
        rollup.DBR__c = obj.DBR__c; 
        rollup.Contact__c = contactId; 
        rollup.YearToDate__c = obj.YearToDate__c; 
        rollup.PriorYear__c = obj.PriorYear__c; 
        rollupsToInsert.add(rollup); 
       } 
      } 
     } 
    }  
    if(!rollupsToInsert.isEmpty() && rollupsToInsert.size() > 0) { 
     insert rollupsToInsert; 
    } 

Я итерация объем записей, что составляет около 275000 записей, которые возвращаются. У меня есть карта, которая возвращает список контактов по ключевому полю в моей области.

Теперь, когда я контактирую через каждый контакт, я помещаю их в список и вставляю. Проблема в том, что мне нужно объединять (сворачивать) фонды и контакты.

Например, карта возвращает контакт для «John Doe» десять раз для конкретного поля ключа. Итак, в записи контакта «John Doe» будет 10 записей.

Проблема в том, что один и тот же фонд может быть в тех 10 записях, которые необходимо объединить.

Итак, если «Фонд А» появляется в 5 раз, а «Фонд Б» появляется 3 раза, а «Фонд С» появляется 2 раза, тогда у меня должно быть всего 3 связанных записи в общей сложности на «Джон Доу», контактные данные, которые агрегируются (свертываются) фондом.

Мне не удалось выяснить, как сделать накопительный фонд в моем списке.

Может ли кто-нибудь помочь?

Любая помощь приветствуется.

Спасибо.

ответ

0

Ключевым моментом здесь является использование строкового ключа индекса для вашей карты, вместо использования необработанного идентификатора Sobject. Подумайте об этом как о сложном внешнем ключе, где объединены значения из Фонда и DBR. Вот основная идея:

Map<String, My_Rollup__c> rollupMap = new Map<String, My_Rollup__c>(); 

for (My_SObject__c obj : (List<My_SObject__c>) scope) { 
    // .. stuff .. 

    String index = '' + new String[] { 
     '' + obj.FundName__r.Id, 
     '' + obj.DBR__c, 
     '' + contactId 
    }; 

    // Find existing rollup, or create new rollup object... 
    My_Rollup__c rollup = rollupMap.get(index); 

    if (rollup == null) { 
     rollup = new My_Rollup__c(); 
     rollupMap.put(index, rollup); 
    } 

    // Aggregate values.. 
} 

// And save 
if (rollupMap.isEmpty() == false) { 
    insert rollupMap.values(); 
} 

Результат является то, что вы объединить все различные «ключи», что макияж уникальной накопительную запись в единый строковой ключ, а затем с помощью этой строковой ключ в качестве индекса в карте до обеспечить уникальность.

Приведенный выше пример неполный, но вы должны уметь его оттуда.

+0

Спасибо! Это именно то, что мне нужно! – Dman100