Salesforce Apex更新触发器-更新查找字段

Salesforce Apex更新触发器-更新查找字段,salesforce,apex-code,Salesforce,Apex Code,我正在尝试编写我的第一个Apex更新触发器,在尝试设置自定义查找字段的值时遇到了一些困难 我有一个名为Deployment\uuuu c的对象,它是与名为Service\uu c的对象(名称简化了!) Salesforce中的服务\uuuu c字段没有所有者,因为它是主-明细关系中的子/明细。因此,我们在此对象上创建了一个名为owner\uu c的伪所有者字段,它是一个查找Salesforce中User对象的查找字段 触发器的目的是将服务所有者的值设置为部署的所有者用户的值,前提是服务上没有设置

我正在尝试编写我的第一个Apex更新触发器,在尝试设置自定义查找字段的值时遇到了一些困难

我有一个名为
Deployment\uuuu c
的对象,它是与名为
Service\uu c
的对象(名称简化了!)

Salesforce中的
服务\uuuu c
字段没有
所有者
,因为它是主-明细关系中的子/明细。因此,我们在此对象上创建了一个名为
owner\uu c
的伪所有者字段,它是一个查找Salesforce中
User
对象的查找字段

触发器的目的是将
服务所有者
的值设置为
部署
的所有者用户的值,前提是
服务
上没有设置
所有者

我的守则如下:

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;
        }
    }
}
但是,我在尝试保存此触发器时出错:

错误:编译错误:第5行第13列的SObject ASE_部署____c的字段所有者____c无效


我已验证字段名是否正确,但无法使其正常工作。欢迎指点

尝试将
owner\uu c
更改为
Ownerld

我刚刚重新创建了您在测试组织中描述的对象结构,无法重现您得到的错误。另一方面,我能够让您描述的触发器与以下代码一起工作,这些代码已经为您进行了扩展:

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;
        }
    }
}

希望这有帮助

非常感谢,如果我正在更新的字段是“真实”所有者字段,那么这将起作用-但这是我创建的自定义查找字段,因为SF不会在主-详细关系中的详细对象上为您提供所有者字段谢谢您的帮助-非常感谢。在昨天花了太多时间在这件事上之后,我剥离了我的“膨化”,以尝试证明逻辑!令人尴尬的是,我意识到我的沙盒已过时(刷新但未激活),这解释了我收到的错误消息。我昨天同时登录了沙盒和live环境,所以我正在live环境中检查关系名称。。。啊!
@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();
    }

}