自定义对象的 Salesforce Apex 触发器

Salesforce Apex Trigger for a custom object

我有一个名为“FinanceCapture”的自定义对象,它有一个帐户查找字段和一个名为 Contract_Term 的字段。 我正在尝试编写一个 Apex 触发器,使 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
        }
    }
}

有几点,您的 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 的合同 accountid。您需要明确说明您正在尝试做什么,这似乎是...

  1. 获取合同记录列表,其中accountId包含在accountId[=30=列表中] 来自 FinanceCapture__c 条记录的 trigger.new 列表。
  2. 对于所有 FinanceCapture__c 记录,其中已找到给定帐户 ID 的合同,设置 contract_term__c字段到对应的Contract记录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;
    }
}