Нужна помощь в том, как автоматически заполнять значения возможностей из объекта возможности в пользовательское числовое поле в объекте учетной записи? У меня есть number_of_Opportunities, number_of_open_Opportunities и number_of_closed_Opportunities, созданные в объекте Account. поэтому необходимо получить количество возможностей из возможностей и заполнить поле number_of_Opportunities в учетной записи. попытался создать триггер для количества возможностей в качестве начала, но, похоже, не работает. Благодарность

trigger PopulateAccountOpportunities on Opportunity (after insert, after update) {

    Set<Id> accountIds = new Set<Id>();
    for(Opportunity opp : Trigger.new) {
         accountIds.add(opp.AccountId);
    }
    //Update Accounts
   Map<ID, Account> mapAccounts = new Map<ID, Account>([SELECT Id, Number_of_Opportunities__c
                             FROM Account where Id IN :accountIds]);
    List<Account> lstAccOpp = new List<Account>();
    for(Opportunity opp : Trigger.new) {
       Account acc = mapAccounts.get(opp.AccountId);
       acc.Number_of_Opportunities__c = (opp.StageName);
       lstAccOpp.add(acc);
    }
  update lstAccOpp;
    Map<Id, Account> mapUpdatedAccounts = new Map<Id,Account>();
    for(Account acc : lstAccOpp) {
        mapUpdatedAccounts.put(acc.Id,acc);
        }
}
-1
sfdcfox 10 Янв 2019 в 08:22
Что вы подразумеваете под не работает? Были ли у вас какие-либо ошибки при срабатывании триггера? Пожалуйста, добавьте соответствующие детали, чтобы прояснить вашу проблему.
 – 
Reshma
10 Янв 2019 в 09:31
Привет, Решма, да, сообщение об ошибке: «Недопустимое присвоение из строки в десятичное число» в строке 13.
 – 
vlink
10 Янв 2019 в 09:34
Ошибка прямо вперед. Как вы можете скопировать текстовое значение в числовое поле. Stagename – это текст, и вы хотите скопировать его в Number_of_Opportunities__c. Странный!!
 – 
Reshma
10 Янв 2019 в 09:37
Да. просто пытаюсь использовать поле StageName, поскольку существует множество возможностей. поэтому не уверен, как получить значения для заполнения в поле Number_of_Opportunities__c в учетной записи
 – 
vlink
10 Янв 2019 в 09:44
Вам нужно запросить возможности каждой учетной записи и добавить логику для подсчета. Я бы рекомендовал использовать поля сводной сводки, которые намного проще и эффективнее.
 – 
Reshma
10 Янв 2019 в 09:55

2 ответа

Лучший ответ

Вы можете попробовать код ниже, если вам нужно реализовать триггер без использования сводных полей сводки.

trigger PopulateAccountOpportunities on Opportunity (after insert, after update) {

    Set<Id> accountIds = new Set<Id>();
    for(Opportunity opp : Trigger.new) {
        accountIds.add(opp.AccountId);
    }

    List<Account> lstAccOpp = new List<Account>();
    Map<ID, Account> mapAccounts = new Map<ID, Account>(
                            [SELECT Id, Number_of_Opportunities__c, Number_of_Closed_Opportunities__c, Number_of_Open_Opportunities__c,
                                (SELECT Id, IsClosed FROM Opportunities)
                             FROM Account 
                             WHERE Id IN :accountIds]);

    for(Account acc :mapAccounts.values()){
        Integer closedCount = 0;
        Integer openCount = 0;
        for(Opportunity opp :acc.Opportunities){
            if(opp.IsClosed){
                closedCount = closedCount + 1;
            }
            else{
                openCount = openCount + 1;
            }
        }
        acc.Number_of_Open_Opportunities__c = openCount;
        acc.Number_of_Closed_Opportunities__c = closedCount;
        acc.Number_of_Opportunities__c = openCount + closedCount;
        lstAccOpp.add(acc);
    }
    update lstAccOpp;
}

Здесь я использовал IsClosed поле возможности для проверки статуса. Вы можете добавить критерии согласно вашему требованию.

0
Reshma 10 Янв 2019 в 12:02
Привет, сэр, Решма, я пробовал, и это работает !!!! Большое спасибо за вашу помощь .. Я многому научился у вас. Я буду следить за поведением этого триггера и сообщу вам. еще раз спасибо.
 – 
vlink
10 Янв 2019 в 15:22

Почему вы делаете это с кодом? Поскольку у Oppty есть связь Master Detail с учетной записью, вы можете просто создать три поля сводной информации в учетной записи и установить соответствующие фильтры для возврата количества записей в зависимости от того, закрыта/открыта ли Oppty и т. д....

Кодировать вообще не нужно.

Пожалуйста, обратитесь к документации здесь: https://help.salesforce.com/articleView?id=fields_about_roll_up_summary_fields.htm&type= 0

1
Rodrigo 10 Янв 2019 в 06:25
Привет, Родриго, спасибо за комментарии, я пытаюсь создать триггер для его автоматического заполнения без использования поля rorupsummary. Я также создал поле формулы, которое необходимо для этого триггера. Спасибо. из этого триггера я получил сообщение об ошибке «Недопустимое назначение из строки в десятичное число»
 – 
vlink
10 Янв 2019 в 06:49