2014-03-05 80 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