Triggers 如何通过Salesforce触发器设置查找字段

Triggers 如何通过Salesforce触发器设置查找字段,triggers,salesforce,visualforce,Triggers,Salesforce,Visualforce,我想使用salesforce apex触发器设置一个查找字段,但我一直收到一个错误: 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.

我想使用salesforce apex触发器设置一个查找字段,但我一直收到一个错误:

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);
        }    
    }
}
我有一个名为
Job\uu c
的自定义对象。它有一个帐户的自定义选择列表:
Acct\uu\c

用户将
Acct\uu c
填充为
John Deer
,触发器应将
John Deer
添加到
Account\uu 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:
我尝试了不同的方法:

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

我做错了什么,它告诉我它是一个无效的ID?

Account\uuu c
是一个查找字段,您不能为它分配字符串(picklist字段)。相反,您必须为其分配一个帐户id

我不知道为什么要在picklist字段中使用帐户名,但是如果您想继续这样做,那么有一个简单的解决方案,即帐户名是唯一的

获取id查询中所选帐户的id,如下所示:

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

使用映射,不要添加soql的内部for循环

Account\uu c
是一个查找字段,不能为其分配字符串(picklist字段)。相反,您必须为其分配一个帐户id

我不知道为什么要在picklist字段中使用帐户名,但是如果您想继续这样做,那么有一个简单的解决方案,即帐户名是唯一的

获取id查询中所选帐户的id,如下所示:

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

使用映射,不要添加soql的内部for循环

您必须使用要链接的对象的ID设置字段。

salesforce浏览器页面有一个方便的工具,可以让您在查找字段中输入不完整的信息,并自动填充。如果使用apex语句手动指定值,则不会发生这种情况。只能将该值设置为查找设置为链接到的对象的有效现有ID

此代码将获取给定的
名称
ID
,并执行您想要的操作:

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

    }
}
trigger UpdateAct on Job_u_u_uC(插入前,更新前){
列表帐户=新列表();
对于(作业对象:触发器。新建){
账户。添加(对象账户);
}
list acctlist=[从帐户中选择名称,其中名称位于:帐户];
如果(acctlist.size()>0){
for(整数i=0;i
您必须使用要链接的对象的ID设置字段。

salesforce浏览器页面有一个方便的工具,可以让您在查找字段中输入不完整的信息,并自动填充。如果使用apex语句手动指定值,则不会发生这种情况。只能将该值设置为查找设置为链接到的对象的有效现有ID

此代码将获取给定的
名称
ID
,并执行您想要的操作:

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

    }
}
trigger UpdateAct on Job_u_u_uC(插入前,更新前){
列表帐户=新列表();
对于(作业对象:触发器。新建){
账户。添加(对象账户);
}
list acctlist=[从帐户中选择名称,其中名称位于:帐户];
如果(acctlist.size()>0){
for(整数i=0;i
谢谢。它用于外部VF页面,用户可以在其中选择帐户。否则,用户需要直接向account字段输入数据,但我们不希望他们查看所有帐户(因为不希望将帐户查找直接放在VF页面上)。不干净,我知道。有什么建议吗?谢谢。它用于外部VF页面,用户可以在其中选择帐户。否则,用户需要直接向account字段输入数据,但我们不希望他们查看所有帐户(因为不希望将帐户查找直接放在VF页面上)。不干净,我知道。有什么建议吗?