【问题标题】:Salesforce Apex Trigger for a custom object自定义对象的 Salesforce Apex 触发器
【发布时间】:2019-10-06 13:47:33
【问题描述】:

我有一个名为“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
        }
    }
}

【问题讨论】:

    标签: object triggers salesforce apex


    【解决方案1】:

    有几件事,您的 contractList 对象似乎没有填充任何内容,它只是一个空列表,因此,ContractList.AccountId == fin.get(a.TMS_lookup_Account__c) 此处的“if”语句条件永远不会起作用,不仅因为它是一个空列表,但因为您正在尝试访问也不起作用的合同列表的 accountId。另一件事是,您使用 FinanceCapture__c 上的两个不同字段作为您的帐户查找字段,第一个是 SOQL 查询中的FinanceCapture__lookup_Account__c,第二个是TMS_lookup_Account__c,在使用 FinanceCaptures accountId 检查合同 accountid 时。您需要明确说明您正在尝试做什么,这似乎是......

    1. 从 FinanceCapture__c 的 trigger.new 列表中获取 accountId 包含在 accountId 列表中的 Contract 记录列表记录。
    2. 对于所有 FinanceCapture__c 记录,如果已找到给定帐户 ID 的合同,请将 contract_term__c 字段设置为相应的合同记录 contractTerm em> 字段

    这是应该实现这一点的触发器(我使用 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;
        }
    }
    

    【讨论】:

    • 嗨,KDH,不错!感谢您的明确指示,这真的很有帮助!
    • 没问题@jfordecH 乐于提供帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多