Salesforce Apex Trigger для пользовательского объекта - PullRequest
0 голосов
/ 06 октября 2019

У меня есть пользовательский объект с именем «FinanceCapture», у него есть поле поиска в Account и поле с именем Contract_Term. Я пытаюсь написать Apex Trigger, чтобы значение Contract_Term было равно значению контракта в объекте контракта.

Составьте следующий код, но он не работает, вам нужна ваша помощь, пожалуйста. Спасибо

trigger populate_record on FinanceCapture__c (before insert) {
    List<Contract> ContractList = new List<Contract>();


    Map<Id,FinanceCapture__c> fin = new Map<Id,FinanceCapture__c>(
        [SELECT Id, FinanceCapture__lookup_Account__c FROM FinanceCapture__c WHERE Id IN :Trigger.New]);

    for (FinanceCapture__c a : Trigger.new){

//in Contract object, if its account ID matches with the account ID in FinanceCapture object, make the Contract_Term__c same as ContractTerm value

        If (ContractList.AccountId == fin.get(a.TMS_lookup_Account__c)){
            a.Contract_Term__c = ContractList.ContractTerm
        }
    }
}

1 Ответ

0 голосов
/ 07 октября 2019

Несколько вещей. Ваш contractList объект, похоже, не заполнен чем-то, это просто пустой список, поэтому условие операторов 'if' здесь ContractList.AccountId == fin.get(a.TMS_lookup_Account__c) никогда не сработает, не только потому, что егопустой список, но потому что вы пытаетесь получить доступ к accountId списка контрактов, который также не будет работать. Другое дело, что вы используете два разных поля в FinanceCapture__c в качестве поля поиска вашей учетной записи: первое FinanceCapture__lookup_Account__c в запросе SOQL и второе TMS_lookup_Account__c при проверке договора, связанного с идентификатором FinanceCaptures accountId. Вам необходимо уточнить, что именно вы пытаетесь сделать, что выглядит ...

  1. Получить список Контракт записей, где accountId содержится в списке accountId из списка trigger.new записей FinanceCapture__c.
  2. Для всех записей FinanceCapture__c , где был найден Контракт длядля данного идентификатора учетной записи установите в поле contract_term__c соответствующие записи контракта contractTerm поле

Вот триггер, который должен этого достичь (я использовал FinanceCapture__lookup_Account__c в качестве имени поля поиска)

trigger populate_record on FinanceCapture__c (before insert) {
    Map<Id, FinanceCapture__c> accountIds = new Map<Id, FinanceCapture__c>();

    for(FinanceCapture__c fin : trigger.new){
        accountIds.put(fin.FinanceCapture__lookup_Account__c, fin); //Add financeCapture Record to map with its accountId as the key
    }

    //Create a list of contracts with Id's in the set of id keys from account -> financeCapture map
    List<Contract> contractList = [SELECT id, contractTerm, accountId FROM Contract WHERE accountId IN :accountIds.keyset()];

    for(Contract contract : contractList){
        //Get the FinanceCapture record using the contracts accountId and
        //Set the Contract term fields to be equal
        accountIds.get(contract.AccountId).contract_Term__c = contract.ContractTerm;
    }
}
...