首页 文章

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

提问于
浏览
2

新的顶点并且有关于编写触发器的问题 . 本质上,我正在尝试创建一个触发器,在更新另一个字段时更新给定字段(在创建/插入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 回答

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

相关问题