Salesforce Trigger:更新字段从自定义对象触发

时间:2014-03-05 22:03:10

标签: triggers salesforce custom-object

apex的新手,并对编写触发器有疑问。本质上,我正在尝试创建一个触发器,在更新另一个字段时更新给定字段(在创建/插入Salesforce之后)。

更具体地说,当更新自定义帐户查找字段(查找值是自定义对象记录)时,它应该使用与自定义对象记录不同的值更新另一个字段。

即。当我将高中名称更新为榆树高中时,它还将更新与该高中相关的成绩。

以下是我到目前为止创建的代码:

trigger UpdateYield on Account (before update) {
Set<String> HS = new Set<String>();
for (Account hsName : Trigger.new) {
    if (hsName.High_School_LU__c != null) {
        HS.add(hsName.High_School_LU__c);
}

List<High_School__c> y = [SELECT Name, Yield__c FROM High_School__c WHERE Name IN :HS];

Map<String, High_School__c> yLU = new Map<String, High_School__c>();
for (High_School__c h : y) {            
    yLU.put(h.Name, h);    
}

for (Account YieldU : Trigger.new) {
    if (YieldU.High_School_LU__c != null) {
        High_School__c a = yLU.get(YieldU.Name);
        if (a != null) {
            YieldU.Yield__c = a.Yield__c;
        }
    }        
}
}
}

但是,当我更新字段时,它仍然无法正常工作。

非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这里的问题是查找字段的值实际上不是字符串(如UI中所示)而是ID,因此当您执行SOQL查询时,您将ID与Name字段进行比较并且没有结果

如果您将代码更改为以下内容,则应获得预期的结果。

还应该通知这个简单的用例也可以使用简单的工作流字段更新而不是触发器来完成。

trigger UpdateYield on Account (before update) 
{
    Set<Id> HS = new Set<Id>();

    for (Account hsName : Trigger.new)
    {
        if (hsName.High_School_LU__c != null)
        {
            HS.add(hsName.High_School_LU__c);
        }
    }

    Map<Id, High_School__c> y = [SELECT Name, Yield__c FROM High_School__c WHERE Id IN :HS];

    for (Account YieldU : Trigger.new)
    {
        High_School__c a = y.get(YieldU.High_School_LU__c);
         if (a != null) 
         {
               YieldU.Yield__c = a.Yield__c;
         }
     }        
 }