You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于创建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;
}

关键优化点说明

  1. 用List接收SOQL结果,通过isEmpty()判断是否存在记录,规避查询异常
  2. 统一处理已存在/新建的月份申请,最后一次性创建并插入ExpenseCard,逻辑更简洁
  3. 直接将月份申请的Id赋值给外键字段,符合Salesforce外键关联规则
  4. 建议把硬编码的Contact Id改成方法参数传入(比如新增Id contactId参数),替换固定值,提升代码复用性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:05:40