有没有办法将保存结果(对于插入DML操作)链接回sObjects?

Mat*_*t K 2 salesforce apex-code

背景

我有一个我需要插入的sObject列表,但我必须首先检查插入是否成功.因此,我在执行插入和检查保存结果(对于insert语句)之前设置了数据库保存点.因为,如果发生任何错误,我不想处理,如果插入结果中有任何错误,数据库将回滚到保存点.

问题和问题

我需要为每个保存(插入)结果收集错误,并将每个错误与导致错误的特定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
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*oss 5

你的评论说SaveResult列表不保证是有序的,但我相信它是.我已经使用这种技术多年了,从来没有遇到过问题.