背景
我有一个需要插入的 sObject 列表,但我必须先检查插入是否成功。所以,我在执行插入和检查保存结果(对于插入语句)之前设置了一个数据库保存点。因为,我不想处理是否发生任何错误,如果插入结果有任何错误,则数据库会回滚到保存点。
问题与疑问
我需要为每个保存(插入)结果收集错误,并将每个错误与导致错误的特定 sObject 记录相关联。根据文档保存结果包含错误列表、插入记录的 Salesforce ID(如果成功)和成功指示符(布尔值)。
如何将保存结果与插入的原始 sObject 记录相关联?
代码/示例
这是我放在一起的一个示例来演示该概念。这个例子是有缺陷的,因为InsertResults
并不总是匹配sObjectsToInsert
. 这不完全是我在自定义类中使用的代码,但它使用相同的逻辑。
Map<Id,sObject> sObjectsToInsert; // this variable is set previously in the code
List<Database.SaveResult> InsertResults;
Map<String,sObject> ErrorMessages = new Map<String,sObject>();
System.SavePoint sp = Database.setSavepoint();
// 2nd parameter must be false to get all errors, if there are errors
// (allow partial successes)
InsertResults = Database.insert(sObjectsToInsert.values(), false);
for(Integer i=0; i < InsertResults.size(); i++)
{
// This method does not guarantee the save result (ir) matches the sObject
// I need to make sure the insert result matches
Database.SaveResult ir = InsertResults[i];
sObject s = sObjectsToInsert.values()[i];
String em = null; // error message
Integer e = 0; // errors
if(!ir.isSuccess())
{
system.debug('Not Successful');
e++;
for(Database.Error dbe : ir.getErrors()) { em += dbe.getMessage()+' '; }
ErrorMessages.put(em, s);
}
}
if(e > 0)
{
database.rollback(sp);
// log all errors in the ErrorMessages Map
}