【问题标题】:Apex Trigger to Update Contact from Custom ObjectApex 触发器从自定义对象更新联系人
【发布时间】:2012-08-12 22:51:08
【问题描述】:

长话短说,我需要更新标准联系人中的自定义字段,该字段在更新不同的、不相关的自定义对象后触发。我试图编写一个触发器,将字段值从我的自定义对象传递给联系人,但我不断收到各种错误 - 其中最近的一个让我感到难过。最终目标是从Passing_Field__c 更新Passing__c

我在for(Contact C: 行收到unexpected Token: "(" 错误。从字面上看,它是如此简单,我无法弄清楚。

下面是我的代码。我已经简化了命名约定以尝试使其更具相关性。任何帮助表示赞赏。我对 Apex 和 Triggers 还很陌生,我已经在这方面工作了几个小时,希望一些建议可以让我回到“本垒板”。

trigger ContactUpdater on Custom_Object_Name__c (after update) {

     List<Contact> updatedContacts = new List<Contact>();
     Set<Id> ObjectIds = new Set<Id>();
     Set<String> ObjectCont = new Set<String>();
     Set<Boolean> ObjectActive = new Set<Boolean>();
     Set<String> ObjectPass = new Set<String>(); 

     for(Custom_Object_Name__c p : trigger.new)
        {
            If(p.Active__c == true){ 
              ObjectIds.add(p.Id);
              ObjectCont.add(p.Contact__c);
              ObjectActive.add(p.Active__c);
              ObjectPass.add(p.Passing_Field__c);
              }

        try{ for(Contact c : [SELECT Id, Passing__c FROM Contact WHERE (AccountId IN (Select Account__c from  Custom_Object_Name__c )) AND ObjectActive = true])
              {
                 set(c.Passing__c = p.Passing_Field__c);
                 c.FieldToUpdate = c.Passing__c;
                 updatedContacts.add(c);
              }
             update updatedContacts; 

           }

            catch(exception e){
               throw e;
              }
        }
}

注意:Active__c 是一个复选框。 Passing__c 和 Passing_Field__c 都是文本框。

【问题讨论】:

    标签: triggers salesforce apex-code


    【解决方案1】:

    我认为问题出在您的 SOQL 查询的 WHERE 子句中:

    WHERE (AccountId = (Select Account__c from Custom_Object_Name__c ))
    

    Salesforce 希望您将 AccountId 与某种 Id 进行比较,而不是某个子查询的结果。您可能想尝试以下方法:

    WHERE (AccountId in (Select Account__c from  Custom_Object_Name__c))
    

    【讨论】:

    • 我已经更新了上面的代码以反映我当前的版本。代替“=”的“IN”运算符修复了该错误,但似乎我有一个更基本的错误。它没有将 `p.Passing_Field__c' 识别为变量,这让我相信我没有正确引用 Custom_Object_Name__c。据我所知,联系人“选择”是可以的,但如果没有正确调用自定义对象,这一切都没有。有任何想法吗?我会尝试修改我的设置方式。
    • 语法缩进有点通过我,但您的 p 变量仅在 for 循环的上下文中有效。在 for 循环之外, p 变量不在范围内,因此这可能是您收到错误的原因。
    • 有趣。我更改了 {} 括号以将 TRY 包含在 for(Custom_Object_Name__c p : trigger.new) 中。但是,我已将 ObjectPass 声明为字符串,并将 Passing_Field__c 添加到字符串中。当我到达set(c.Passing__c = p.Passing_Field__c); 时,我收到“从 SET 到 String 的非法赋值”。似乎您不能像我正在尝试做的那样,只用字段值覆盖字符串的值。有没有更好的方法在不使用字符串的情况下将Passing_Field__c 带入触发器?
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多