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
相关产品推荐
相关产品推荐

