如何在可批处理的 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__c
、Level_2__c
和 Level_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 切换到使用数据加载器。
这是我当前的 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__c
、Level_2__c
和 Level_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 切换到使用数据加载器。