关于创建Expense Card关联Month_Expense_Application__c的技术求助
问题分析与修正方案
原代码存在的核心问题
- 单条SOQL查询无匹配记录时会直接抛出
QueryException,不会返回null,原代码里的if (MonthApplication != null)逻辑完全无效 - 关联
MonthExpenseApplication__c字段时绕了弯路:这个字段是外键,直接赋值已找到的Month_Expense_Application__c记录的Id即可,不需要额外查询ExpenseCard - else分支完全不符合业务逻辑:既没插入新建的
Month_Expense_Application__c记录,也没把它的Id关联到ExpenseCard上,导致创建ExpenseCard时必填外键字段为空 - 硬编码Contact的Id值,后续环境切换或数据变更时会直接报错,灵活性极差
修正后的代码
public static void createNewExpenseCard(Integer amount, Date createdDate, String description) { // 用列表接收查询结果,避免无匹配时抛出异常 List<Month_Expense_Application__c> monthAppList = [ SELECT Id FROM Month_Expense_Application__c WHERE MonthDate__c =: createdDate ]; Month_Expense_Application__c targetMonthApp; // 存在对应月份的费用申请 if (!monthAppList.isEmpty()) { targetMonthApp = monthAppList[0]; } else { // 不存在则新建并插入费用申请 targetMonthApp = new Month_Expense_Application__c( Balance__c = 1000, MonthDate__c = createdDate, Keeper__c = '0034x00001K7kGCAAZ' ); insert targetMonthApp; } // 创建ExpenseCard并关联目标月份申请 ExpenseCard__c newExpenseCard = new ExpenseCard__c( Amount__c = amount, CardDate__c = createdDate, Description__c = description, CardKeeper__c = '0034x00001K7kGCAAZ', MonthExpenseApplication__c = targetMonthApp.Id // 直接关联已找到/新建的月份申请Id ); insert newExpenseCard; }
关键优化点说明
- 用
List接收SOQL结果,通过isEmpty()判断是否存在记录,规避查询异常 - 统一处理已存在/新建的月份申请,最后一次性创建并插入ExpenseCard,逻辑更简洁
- 直接将月份申请的Id赋值给外键字段,符合Salesforce外键关联规则
- 建议把硬编码的Contact Id改成方法参数传入(比如新增
Id contactId参数),替换固定值,提升代码复用性
内容的提问来源于stack exchange,提问作者Jhony
相关产品推荐
相关产品推荐

