【问题标题】:Apex update trigger - update lookup fieldApex 更新触发器 - 更新查找字段
【发布时间】:2013-02-19 15:49:09
【问题描述】:

我正在尝试编写我的第一个 Apex 更新触发器,并且在尝试设置自定义查找字段的值时略有挣扎。

我有一个名为 Deployment__c 的对象,它是与名为 Service__c 的对象建立主从关系的主对象(名称简化!)

Service__c 字段在 Salesforce 中没有 Owner,因为它是主-详细信息关系中的子/详细信息。因此,我们在此对象上创建了一个名为 Owner__c 的伪所有者字段,这是在 Salesforce 中查找 User 对象的查找字段。

触发器的目的是将Service__c.Owner__c 的值设置为Deployment__c 的所有者用户的值,如果Service__c 上尚未设置Owner__c

我的代码如下:

trigger AfterServiceUpdate on Service__c (before update) {
    for (Service__c oldService : Trigger.new) {
        if (oldService.Owner__c == null) {
            User defaultUser = [Select Id FROM User WHERE User.Id = :oldService.Deployment__r.OwnerId];
            oldService.Owner__c = defaultUser.Id;
        }
    }
}

但是,当我尝试保存此触发器时出现错误:

错误:编译错误:SObject ASE_Deployment__c 在第 5 行第 13 列的字段 Owner__c 无效

我已验证我的字段名称正确,但无法使其正常工作。欢迎大家指点!

【问题讨论】:

    标签: salesforce apex-code


    【解决方案1】:

    我刚刚重新创建了您在测试组织中描述的对象结构,但无法重现您遇到的错误。另一方面,我能够让您描述的触发器与以下代码一起工作,该代码已为您批量化:

    trigger AfterServiceUpdate on Service__c (before update) 
    {
        //instantiate set to hold unique deployment record ids
        Set<Id> deplomentIds = new Set<Id>();
        for(Service__c s : Trigger.new)
        {
            deplomentIds.add(s.Deployment__c);
        }
    
        //instantiate map to hold deployment record ids to their corresponding ownerids
        Map<Id, Deployment__c> deploymentOwnerMap = new Map<Id, Deployment__c>([SELECT Id, OwnerId FROM Deployment__c WHERE Id IN: deplomentIds]);
    
        for (Service__c s : Trigger.new) 
        {
            if (s.Owner__c == null && deploymentOwnerMap.containsKey(s.Deployment__c)) 
            {
                s.Owner__c = deploymentOwnerMap.get(s.Deployment__c).OwnerId;
            }
        }
    }
    

    我还为你创建了一个测试类来测试结果:

    @isTest
    private class AfterServiceUpdateTest {
    
        @isTest static void test_method_one() {
            Deployment__c d = new Deployment__c();
            insert d;
    
            Service__c s = new Service__c();
            s.Deployment__c = d.Id;
            insert s;
    
            Id deploymentOwnerId = [SELECT Id, OwnerId FROM Deployment__c WHERE Id=:d.Id].OwnerId;
    
            test.startTest();
    
            update s;
    
            Service__c updatedService = [SELECT Id, Owner__c FROM Service__c WHERE Id=:s.Id];
    
            system.assertEquals(deploymentOwnerId, updatedService.Owner__c);
    
            test.stopTest();
        }
    
    }
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的帮助 - 非常感谢。在昨天花了太多时间之后,我去掉了我的“膨胀”,以试图证明逻辑!令人尴尬的是,我意识到我的沙箱已过时(已刷新但未激活),这解释了我收到的错误消息。昨天我同时登录了沙盒和实时环境,所以正在检查实时环境中的关系名称...... doh!
    【解决方案2】:

    尝试将owner__c 更改为Ownerld

    【讨论】:

    • 非常感谢,如果我要更新的字段是“真正的”所有者字段,这将起作用 - 但它是我创建的自定义查找字段,因为 SF 没有为您提供关于详细对象的所有者字段主从关系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2011-07-29
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多