Я создал триггер для упомянутого ниже сценария, и мне нужно решение для этого. - вершина, отдел продаж

Есть два объекта: фонд и возможность. и объект возможности имеет поиск Fund. Я разработал один триггер, который суммирует общую сумму всех относительных возможностей и устанавливает эту сумму в пользовательском поле объекта фонда. теперь проблема в моем коде заключается в том, что всякий раз, когда я пытаюсь создать массовую возможность, используя CSV-файл, который содержит данные для нескольких фондов в то время, он суммирует общую сумму всех фондов и устанавливает это только в первом идентификаторе фонда записи. Мне нужно решение с помощью Map. Спасибо.

Вызывать:

trigger newLeadTrigger on Opportunity (after insert , after update, after delete , after undelete) {

    if(trigger.isAfter && (trigger.isInsert || trigger.isUpdate || trigger.isUndelete)){
           OpportunityCustomRollup.CountRollup(Trigger.new);
    }

    if(Trigger.isDelete)
    {
        OpportunityCustomRollup.CountRollup(Trigger.old);
    }
}

Класс контроллера:

public class OpportunityCustomRollup {

    public static void CountRollup(List<Opportunity> lstOpportunity){

        set<id> oppIds = new set<id>();
        map<string, integer> classroomIDToDeskCountMap = new map<string, integer>();
        id objrecordtypeid = [SELECT Id FROM RecordType WHERE DeveloperName ='Fund_Raising'].Id;
        double amount = 0;

        try {
                for (Opportunity objOpportunity : lstOpportunity){
                    oppIds.add(objOpportunity.Fund__c);
                }

                Fund__c objfund = [SELECT Id, Total_opportunity_amount__c  FROM Fund__c WHERE Id = :oppIds];
                List<Opportunity> list_Opportunity = [SELECT Id, Amount FROM Opportunity WHERE Fund__c = :objfund.Id and StageName = 'Closed Won' and RecordTypeId =: objrecordtypeid];


                 for(Opportunity AmountOpportunity : list_Opportunity) {
                        amount += AmountOpportunity.amount; 
                 }


                  objfund.Total_opportunity_amount__c = amount;
                  update objfund;   
            } 


        catch (Exception e) {
                System.debug(e);
            }

    }

}

person Dharmik Thummar    schedule 22.01.2018    source источник
comment
Возможно, вам повезет больше спросить об этом на Salesforce Stack Exchange: salesforce.stackexchange.com   -  person ZeroOne    schedule 22.01.2018


Ответы (1)


Это должно дать вам некоторые идеи, но вам придется немного поэкспериментировать самостоятельно. Отредактируйте свой вопрос с обновленным кодом и напишите мне комментарий, если вы все еще застряли.

// This is just for testing because when executing standalone apex code
// you don't have trigger.new. Modify the query as you want.

List<Opportunity> lstOpportunity = [SELECT Id
     FROM Opportunity
     WHERE StageName = 'Closed Won' and RecordType.DeveloperName = 'Fund_Raising'
     LIMIT 10];


List<Fund__c> funds = new List<Fund__c>();
for(AggreateResult ar : [SELECT SUM(Amount) amt, Fund__c fund
    FROM Opportunity
    WHERE Id IN :lstOpportunity
        AND StageName = 'Closed Won' and RecordType.DeveloperName = 'Fund_Raising'
        AND Fund__c != null
    GROUP BY Fund__c]){
    Fund__c f = new Fund__c(
        Id = (Id) ar.get('fund'),
        Total_opportunity_amount__c = (Decimal) ar.get('amt')
    );

    funds.add(fund);
}
update funds;

P.S. Проверьте это приложение на appexchange: https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000009i3UpEAI Я не связан с ними, но если вы администратор, вам может быть проще настроить его, чем писать код, модульные тесты..

person eyescream    schedule 23.01.2018