2

Background

I have a list of sObjects I need to insert, but I must first check if the insert will be successful. So, I'm setting a database save point before performing the insert and checking the save results (for the insert statement). Because, I don't want to process if any errors occurred, if there were any errors in the insert results, the database is rolled back to the save point.

Problem & Question

I need to collect the errors for each save (insert) result and associate each error to the specific sObject record that caused the error. According to the documentation Save results contain a list of errors, the Salesforce ID of the record inserted (if successful), and a success indicator (boolean).

How do I associate the Save Result to the original sObject record inserted?

Code/Example

Here's an example I put together that demonstrates the concept. The example is flawed, in that the InsertResults don't always match the sObjectsToInsert. It's not exactly the code I'm using in my custom class, but it uses the same logic.

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
}
4

1 に答える 1

5

あなたのコメントは、SaveResultリストが正しいとは限らないと言っていますが、私はそうだと思います。私はこのテクニックを何年も使用していて、問題が発生したことはありません。

于 2012-06-06T14:23:42.347 に答える