1

我想使用 salesforce apex 触发器设置查找字段,但我不断收到错误消息:

System.StringException: Invalid id:

我有一个名为Job__c. 它有一个自定义的帐户选择列表:Acct__c.

用户将填充Acct__cJohn Deer,触发器应添加John DeerAccount__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;

利用地图,不要在for循环中添加soql

于 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 回答