1

Salesforce Apex トリガーを使用してルックアップ フィールドを設定したいのですが、エラーが発生し続けます。

System.StringException: Invalid id:

というカスタム オブジェクトがありますJob__c。アカウントのカスタム選択リストがあります: Acct__c.

ユーザーは として入力Acct__cし、トリガーはルックアップ フィールド John Deerに追加John Deerする必要があります。Account__c

トリガーは次のとおりです。

trigger UpdateAccounts on Job__c (before insert) {
    for (Job__c obj: trigger.new){
        obj.Account__c = obj.Acct__c;           //Exception is thrown here
}

スローされた例外:

System.StringException: Invalid id:

私は何か違うことを試しました:

List <Job__c> opListInsert = new List<Job__c>();
List <Job__c> opListUpdate = new List<Job__c>();
if(trigger.isInsert){
    for(Job__c op:trigger.New){
        if(op.Acct__c != Null){
            op.Account__c = op.Acct__c;
            opListInsert.add(op);
        }
    }
}
else if(trigger.isUpdate){
    for(Job__c op:trigger.New){
        if(op.Acct__c != Null && op.Acct__c !=trigger.oldMap.get(op.id).Acct__c){
            op.Account__c = op.Acct__c;
            opListUpdate.add(op);
        }    
    }
}

そのコードはスローします:

Error:Apex trigger UpdateAccounts caused an unexpected exception, contact your 
administrator: UpdateAccounts: execution of BeforeUpdate caused by: 
System.StringException: Invalid id: 

無効な ID であると表示されるのは、何が間違っているのでしょうか?

4

2 に答える 2

1

Account__cはルックアップ フィールドであるため、文字列 (選択リスト フィールド) を割り当てることはできません。代わりに、アカウント ID を割り当てる必要があります。

選択リスト フィールドで取引先名を使用している理由はわかりませんが、引き続き使用したい場合は、取引先名が一意であるという簡単な解決策があります。

ID のクエリで選択されたアカウントの ID を取得します。次のようになります。

list<account> acclist = [select id from account where name In yourNameList];

そして、トリガー参照でID

obj.account__c = accList[0].id;

マップを利用し、soql の内部 for ループを追加しないでください

于 2013-05-23T01:26:07.493 に答える
0

リンク先のオブジェクトの ID をフィールドに設定する必要があります。

Salesforce のブラウザ ページには便利な便利なツールがあり、ルックアップ フィールドに不完全な情報を入力すると、自動的に入力されます。これは、値が apex ステートメントを使用して手動で割り当てられた場合には発生しません。値は、ルックアップがリンクするように設定されたオブジェクトの有効な既存の ID にのみ設定できます。

このコードは、ID与えられnameたものを取得し、あなたが望むことを行います:

trigger UpdateAcct on Job__c (before insert, before update) {

    List<String> Accounts = new List<String>(); 
    for (Job__c obj: trigger.new){
        Accounts.add(obj.Acct__c);
    }

    list<Account> acctlist = [select Name from account where Name in :Accounts];

    if (acctlist.size() > 0 ){

        for (Integer i = 0; i < Trigger.new.size(); i++)
        {

            if (Trigger.new[i].Acct__c != null)  
            {
                Trigger.new[i].Account__c = acctlist[i].ID; 
            }   
            else
            {
                Trigger.new[i].Account__c = null;
            }
        }

    }
}
于 2015-01-13T21:09:51.520 に答える