如何在可批处理的 Salesforce 顶点代码中报告记录,以便报告 Level2 或 Level3 为 NULL 的位置

How To Report Records in Batchable Salesforce apex code such that it should report where the Level2 or Level3 are NULL

这是我当前的 Batchable apex 代码,目前这个批处理作业将数据从新的自定义对象 ERT_Case_Type__c 复制到旧的自定义对象 Case_Type__c

但问题是当 Level2 或 Level3 不存在时,此作业无法复制。我的意思是说 Level2 或 Level3 是 NULL

我如何确保可批处理的 Salesforce 顶点代码报告未被复制的记录,因为案例类型中需要一组匹配的 L1、L2 和 L3。

            global class ertcopybatch3pm implements Database.Batchable<sObject> {
              
                global Database.QueryLocator start(Database.BatchableContext BC) {
                    // collect the batches of records or objects to be passed to execute
                    
                    String query = 'select Case__c, Level_1__c, Level_2__c,Level_3__c  FROM ERT_Case_Type__c';
                    System.debug('ERT Case No is =====>' +query);
                    return Database.getQueryLocator(query);
                }
                
                global void execute(Database.BatchableContext BC, List<ERT_Case_Type__c> exeList) {
                   
                    // process each batch of records
            List<Case_Type__c> listCTD = new List<Case_Type__c>();
                    System.debug('ERT Case No is =====>' +exeList);
                    for(ERT_Case_Type__c exe : exeList)
                    {        
                         listCTD.add(new Case_Type__c(Case__c=exe.Case__c,Level_1__c=exe.Level_1__c,Level_2__c=exe.Level_2__c,Level_3__c=exe.Level_3__c));
                       // System.debug('ERT Case No is =====>' +Case__c);
                    }
                    try {
                      System.debug('ERT Case No is =====>' +listCTD);
                        insert listCTD;
                    
                    } catch(Exception e) {
                        System.debug(e);
                    }
                    
                }   
                
                global void finish(Database.BatchableContext BC) {
                  // execute any post-processing operations
              }
            }

提前致谢, 卡罗琳

目前还不太清楚您遇到问题的原因,或者问题是什么。没有以字段 Level_1__cLevel_2__cLevel_3__c 的值为条件的逻辑,也不存在任何这些字段上的 NullPointerException 的可能性。

如果 Case_Type__c 对象上的字段是必需的,或者如果 Case_Type__c 对象上有触发器或声明性自动化期望它们是非 null,您可能在那里产生错误。你确实有一个被吞噬的异常:

} catch(Exception e) {
    System.debug(e);
}

您应该删除它,因为它隐藏了在 insert 上发生的任何实际错误。这可能会引导您找到真正的潜在问题。

另外请注意,您确实不需要 Batch Apex 来执行此操作。使用任何 Salesforce 数据加载器提取一个对象,然后将数据加载到另一个对象,您可以更轻松地完成它。

Batch Apex 本身不会报告失败的记录,尤其是当您明确抑制异常时。为此,您需要使用 partial-success 方法(例如 Database.insert())来插入记录、遍历结果并将有关任何故障的信息保存到数据库(可能在原始源记录上)。代码会复杂得多,但我真的认为您不需要这样做。您需要找到并修复可能在插入时发生的问题,and/or 切换到使用数据加载器。