You need to enable JavaScript to run this app. APEX触发器按Vehicle_Type__c动态SOQL创建List集合的实现及报错解决
优惠活动
大模型
产品
解决方案
定价
更多

APEX触发器按Vehicle_Type__c动态SOQL创建List集合的实现及报错解决

报错根源

这个问题由APEX的变量作用域规则直接导致:

  • 你在if、else两个独立代码块内部分别声明了PulledOpportunities变量,两个变量的有效访问范围仅局限于各自所在的块内
  • 分支代码执行完成后,块内声明的局部变量就会被销毁,后续在块外调用PulledOpportunities.size()时,自然会提示该变量不存在。

代码调整方案

按照作用域规则调整结构,把PulledOpportunities的声明提前到if判断的外层,两个分支内只对这个已声明的变量做赋值操作即可,修正后的参考代码:

// 提前声明集合变量,让后续所有分支、块外逻辑都能正常访问
List<Opportunity> PulledOpportunities;
if ( l.Vehicle_Type__c != 'Truck' ) {
    PulledOpportunities = [
        SELECT Id, Name 
        FROM Opportunity 
        WHERE StageName = 'Active' 
          AND Med_Expiration__c >= System.TODAY() 
          AND Opp_Record_Type_ID__c = 'ABC' 
          AND WareHouse__c IN :WarehouseList
    ];
} else {
    PulledOpportunities = [
        SELECT Id, Name 
        FROM Opportunity 
        WHERE StageName = 'Active' 
          AND Opp_Record_Type_ID__c = 'ABC' 
          AND WareHouse__c IN :WarehouseList
    ];
}
Integer FoundOpportunities = PulledOpportunities.size();

语法细节校正:

  • SOQL中的固定字面量不需要用绑定语法(冒号)拼接,直接写条件值即可,原写法StageName =: 'Active'属于冗余写法
  • 集合类型的绑定语法需要将冒号写在变量名之前,正确格式为WareHouse__c IN :WarehouseList

触发器场景优化提醒

如果上述逻辑是写在遍历触发记录的循环内,哪怕修复了作用域问题,也会因为在循环中执行SOQL触发Salesforce governor limit 报错。建议将SOQL查询逻辑移到循环外,先收集所有触发记录的Vehicle_Type__c取值动态拼接查询条件,一次性完成Opportunity查询后,再做后续业务逻辑处理。


内容的提问来源于stack exchange,提问作者user3299199

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 20:06:08