Salesforce 是否有办法将保存结果(对于插入DML操作)链接回sObjects? 背景

Salesforce 是否有办法将保存结果(对于插入DML操作)链接回sObjects? 背景,salesforce,apex-code,Salesforce,Apex Code,我有一个需要插入的对象列表,但我必须首先检查插入是否成功。因此,在执行insert和检查保存结果(对于insert语句)之前,我将设置一个数据库保存点。因为,我不想处理是否发生任何错误,如果插入结果中有任何错误,数据库将回滚到保存点 问题与疑问 我需要收集每个保存(插入)结果的错误,并将每个错误与导致错误的特定sObject记录相关联。根据文档,包含错误列表、插入记录的Salesforce ID(如果成功)和成功指示器(布尔值) 如何将保存结果与插入的原始sObject记录关联? 代码/示例 这

我有一个需要插入的对象列表,但我必须首先检查插入是否成功。因此,在执行insert和检查保存结果(对于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
}
映射sObjectsToInsert;//此变量先前在代码中设置
列出插入结果;
映射错误消息=新映射();
System.SavePoint sp=Database.setSavepoint();
//如果存在错误,则第二个参数必须为false才能获取所有错误
//(允许部分成功)
InsertResults=Database.insert(sObjectsToInsert.values(),false);
for(整数i=0;i0)
{
数据库回滚(sp);
//在ErrorMessages映射中记录所有错误
}

您的评论说,
SaveResult
列表不一定是有序的,但我相信它是有序的。我已经使用这种技术多年了,从来没有出现过问题

我也这么认为(+1),但我遇到了一个无法解释的问题,无法匹配它们,我相当确定它们不匹配。收集错误后,我尝试插入本应成功的记录,但当我尝试插入本应成功的记录时,我得到的错误与之前捕获的错误相同。在这个特殊的例子中,我有6条记录要插入,3条成功,3条错误。我尝试插入将成功的3,并收到之前出错的3上记录的相同错误。我想它们的顺序可能是正确的,但我不知道如何解释我看到的。如果我插入映射值(
Database.insert(sObjectsToInsert.values(),false);
),会不会导致值不匹配?是的。。地图不能保证秩序。