1

最初のApex更新トリガーを作成しようとしていますが、カスタムルックアップフィールドの値を設定しようとしているため、少し苦労しています。

と呼ばれるオブジェクトとDeployment__cマスターと詳細の関係にあるマスターであると呼ばれるオブジェクトがありますService__c(名前は簡略化されています!)

このService__cフィールドはOwner、マスター/詳細関係の子/詳細であるため、Salesforceにはありません。したがって、このオブジェクトで呼び出される疑似所有者フィールドを作成しました。これは、 SalesforceでオブジェクトをOwner__c検索するルックアップフィールドです。User

トリガーの目的は、の値がまだ設定されていない場合Service__c.Owner__cは、の所有者であるユーザーの値に設定することです。Deployment__cOwner__cService__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;
        }
    }
}

ただし、このトリガーを保存しようとするとエラーが発生します。

エラー:コンパイルエラー:5行目13列目のSObjectASE_Deployment__cの無効なフィールド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__cしてみてくださいOwnerld

于 2013-02-19T16:32:38.353 に答える