2014-03-05 75 views
2

apex的新功能并且有关写入触发器的问题。本质上,我试图创建一个触发器,在更新另一个字段时(在创建/插入到Salesforce中创建记录之后)更新给定字段。Salesforce触发器:自定义对象的更新字段触发器

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

即当我将高中名称更新为Elm高中时,它也将更新与该高中相关的收益率。

下面是我创建至今代码:然而

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

它节省了,但它仍然没有当我更新的领域工作。

任何帮助将不胜感激。提前致谢。

回答

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

感谢您的回应!您是正确的,现场更新的工作流程规则更容易,更简单。我会投票给你,但是Stack Exchange不会让我知道,直到我的声望至少达到15,所以认为这是一个大拇指。 – user3385592

+0

@ user3385592您应该能够将我的答案标记为“接受”的答案,这给了我们两个声望。很高兴我能帮上忙。 –

+0

宾果。再次感谢。 – user3385592