2012-03-01 2 views
1

Мне нужно иметь карту на карте в одном из моих триггеров. Я знаю, как построить карту изначально, как документировано:Apex Карта на карте

Map<Id, Map<Id, Addendum__c>> addendums = new Map<Id, Map<Id, Addendum__c>>{};

Однако у меня возникают проблемы на самом деле присвоения значений многомерной карте. Обычно я бы использовал .put(), чтобы поместить значения в одномерную карту. Возможно, я все еще должен использовать эту функцию, но я не могу, чтобы жизнь меня определяла правильный синтаксис.

Я попытался следующие, которые не работают:

addendums.put(addendum.Opportunity__c, addendum.Id, addendum);

addendums.put(addendum.Opportunity__c, (addendum.Id, addendum));

Кто-нибудь знает, как это сделать?

Спасибо!

ответ

3

Использование вашего образца кода будет работать, хотя, конечно, карта второго уровня может иметь только одну запись, если вы находитесь в ситуации, когда вам может понадобиться больше, то код ниже поможет вам:

// This line creates the map in the proper format 
Map<Id,Map<Id,Addendum__c>> addendums = new Map<Id,Map<Id,Addendum__c>>{}; 

// This for loop goes through each addendum and first places it into a single dimension map. 
// Once that map is created, it is placed into the final multi-dimensional 
for(Addendum__c addendum : [SELECT Id,Opportunity__c FROM Addendum__c WHERE Opportunity__c IN :oppBatch]) 
{ 
    if(addendums.get(addendum.Opportunity__c) == null) 
    { 
     addendums.put(addendum.Opportunity__c, new Map<Id, Addendum__c>{addendum.Id => addendum); 
    } 
    else 
    { 
     addendums.get(addendum.Opportunity__c).put(addendum.Id, addendum); 
    } 
} 

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

0

Я нашел способ сделать это, хотя я не уверен, является ли это наиболее эффективным методом или нет. Поэтому, если у вас есть лучшее решение, сообщите мне, я передам вам кредит «Решение».

То, что я сделал, было назначить первую карту, а затем поместить эту карту в финальную карту.

// This line creates the map in the proper format 
Map<Id,Map<Id,Addendum__c>> addendums = new Map<Id,Map<Id,Addendum__c>>{}; 

// This for loop goes through each addendum and first places it into a single dimension map. 
// Once that map is created, it is placed into the final multi-dimensional 
for(Addendum__c addendum : [SELECT Id,Opportunity__c FROM Addendum__c WHERE Opportunity__c IN :oppBatch]){ 
    Map<Id,Addendum__c> thisAddendum = new Map<Id,Addendum__c>{ addendum.Id => addendum }; 
    addendums.put(addendum.Opportunity__c,thisAddendum); 
} 
1

Метод, который предоставил Джош, отлично работает. Если вы хотите, чтобы удалить одну строку кода, вы можете, используя следующий подход:

Map<Id, Map<Id,Addendum__c>> addendums = new Map<Id,Map<Id,Addendum__c>>(); 
for(Addendum__c addendum : [SELECT Id,Opportunity__c FROM Addendum__c WHERE Opportunity__c IN :oppBatch]){ 
    addendums.put(addendum.opportunity__c, new Map<Id, Addendum__c>{addendum.id => addendum}); 
} 

Я не знаю более эффективный подход, чем этот.

+0

Спасибо за ответ, я думаю, что я просто оставлю его разбитым, чтобы его было легче читать, когда я неизбежно должен вернуться к нему через год. – VictorKilo