Я создал триггер для нижеприведенного сценария и хочу найти решение для этого. - вершина, отдел продаж
Есть два объекта: фонд и возможность. и объект возможности имеет поиск фонда. Я разработал один триггер, который суммирует общую сумму всех относительных возможностей и установил эту сумму в настраиваемом поле объекта фонда. Теперь проблема в моем коде состоит в том, что всякий раз, когда я пытаюсь создать массовую возможность, используя CSV-файл, который содержит данные для нескольких фондов в то время, он суммирует общую сумму всего фонда и устанавливает ее только в первом идентификаторе записи фонда. Мне нужно решение с помощью карты. Спасибо.
Спусковой крючок:
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);
}
}
}
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;
PS Проверьте это приложение на appexchange: https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000009i3UpEAI Я не связан с ними, но если вы являетесь администратором, его может быть проще настроить, чем писать код, модульные тесты..