1

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

我有一个名为的对象Deployment__c,它是与一个名为Service__c(名称简化!)

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

触发器的目的是将 的值设置Service__c.Owner__c为 的所有者用户的值Deployment__c(如果Owner__c尚未设置 on )Service__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 无效

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

4

2 回答 2

3

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

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

}

希望这可以帮助!

于 2013-02-20T02:39:02.363 回答
0

尝试更改owner__cOwnerld

于 2013-02-19T16:32:38.353 回答