Un guide convivial pour les débutants / Blogs / Perficient

Imaginez que vous êtes un artisan qualifié travaillant dans un immense entrepôt. Chaque jour, votre tâche consiste à traiter des milliers d’éléments uniques et à vous assurer que chacun d’entre eux est correctement enregistré et stocké. Mais soyons réalistes : des erreurs peuvent arriver. Parfois, un article est mal étiqueté ou endommagé, et vous devez savoir lesquels réparer et lesquels ont réussi à le traverser en toute sécurité. Dans Salesforce, lorsque vous travaillez avec une classe batch qui traite des milliers, voire des millions d’enregistrements, Base de données.SaveResult agit en tant que votre fidèle superviseur, en gardant une trace des enregistrements réussis et de ceux qui ont échoué.
Plongeons dans le monde de Base de données.SaveResult dans des cours par lots avec un récit facile à suivre qui rendra ce sujet clair et intéressant, même pour les débutants.
Planter le décor : qu’est-ce que Database.SaveResult ?
Avant de nous lancer dans les classes par lots, comprenons d’abord ce que Base de données.SaveResult est. Chaque fois que vous effectuez des opérations DML (Data Manipulation Language) telles que l’insertion, la mise à jour ou la suppression, Salesforce vous donne des commentaires. Ce retour vous indique si l’opération a réussi ou si quelque chose s’est mal passé. Dans le cas de réussites partielles (lorsque certains enregistrements réussissent tandis que d’autres échouent), ce feedback se présente sous la forme d’un Base de données.SaveResult objet.
Considérez-le comme une feuille de résultats d’un examen. Pour chaque enregistrement, il vous indique :
- Qu’il ait réussi ou échoué.
- Si cela a échoué, quelle était l’erreur.
Voyons maintenant comment cela s’applique aux classes batch.
Notions de base sur les classes par lots
Une classe batch est comme un travailleur super efficace dans Salesforce. Lorsque vous avez un grand nombre d’enregistrements à traiter (des milliers, voire des millions), une classe batch divise le travail en morceaux plus petits et gérables appelés lots. Chaque lot est traité séparément, afin de garantir que le système ne soit pas submergé.
Voici un exemple simple pour dresser le tableau :
Supposons que votre entreprise vend des produits et que vous souhaitiez mettre à jour les niveaux de stock de 100 000 articles de votre inventaire. Au lieu d’essayer de les mettre à jour tous en même temps (et de risquer des erreurs ou des délais d’attente), vous utilisez une classe batch pour les traiter par lots de, disons, 200 enregistrements à la fois.
Le rôle de Database.SaveResult dans les classes batch
Dans une classe batch, vous effectuez souvent des opérations DML à l’intérieur du exécuter méthode. Mais que se passe-t-il si certains enregistrements ne parviennent pas à être sauvegardés ? C’est là Base de données.SaveResult entre en jeu. Il agit comme un journal de bord détaillé, vous montrant exactement quels enregistrements ont réussi et pourquoi les échecs se sont produits.
Voici comment cela fonctionne étape par étape :
- Effectuer une opération DML Utilisez des méthodes comme Base de données.insert(), Base de données.update()ou Base de données.delete(). Ces méthodes vous permettent de traiter des enregistrements en masse et de capturer le résultat à l’aide de Base de données.SaveResult.
- Capturez les résultats Le résultat de l’opération DML est stocké dans une liste de Base de données.SaveResult objets.
- Gérer les réussites et les échecs Parcourez les résultats pour identifier les enregistrements qui ont réussi et gérez les erreurs pour ceux qui ont échoué.
Exemple : une classe de lots simple
Voici un exemple pour montrer comment utiliser Base de données.SaveResult dans une classe batch :
public class UpdateAccountBatch implements Database.Batchable<SObject>, Database.Stateful { private List<Id> errorIds = new List<Id>(); public Database.QueryLocator start(Database.BatchableContext bc) { // Query for accounts to update return Database.getQueryLocator('SELECT Id, AnnualRevenue FROM Account'); } public void execute(Database.BatchableContext bc, List<Account> scope) { try { // Update accounts with new annual revenue for (Account acc : scope) { acc.AnnualRevenue = acc.AnnualRevenue != null ? acc.AnnualRevenue * 1.1 : 100000; } // Perform DML and capture results Database.SaveResult[] results = Database.update(scope, false); // Process results for (Integer i = 0; i < results.size(); i++) { if (!results[i].isSuccess()) { errorIds.add(scope[i].Id); // Store failed record Ids for (Database.Error err : results[i].getErrors()) { System.debug('Failed to update Account Id: ' + scope[i].Id + ' Error: ' + err.getMessage()); } } else { System.debug('Successfully updated Account Id: ' + scope[i].Id); } } } catch (Exception e) { System.debug('Unexpected error occurred: ' + e.getMessage()); } } public void finish(Database.BatchableContext bc) { if (!errorIds.isEmpty()) { String subject="Batch Job Completed with Errors"; String body = 'The batch job encountered errors while processing the following Account IDs:\n' + String.join(errorIds, ', '); // Send email notification Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); email.setToAddresses(new String[] { 'admin@example.com' }); email.setSubject(subject); email.setPlainTextBody(body); Messaging.sendEmail(new Messaging.SingleEmailMessage[] { email }); } System.debug('Batch job finished. Error IDs: ' + errorIds); } }
Partial Success Handling:
- The
Database.update(scope, false)
La méthode permet un succès partiel, ce qui signifie que le système essaiera de sauvegarder autant d’enregistrements que possible même si certains échouent. - Les résultats sont stockés dans une liste de Base de données.SaveResult objets.
- The
Journalisation des erreurs:
- Pour chaque enregistrement échoué, l’erreur est récupérée à l’aide du
getErrors()
méthode de Enregistrer le résultat. Cela permet d’identifier et de résoudre les problèmes sans retraiter tous les enregistrements.
- Pour chaque enregistrement échoué, l’erreur est récupérée à l’aide du
Évolutivité:
- La division du travail en lots plus petits permet à la classe de lots de traiter efficacement tout en restant dans les limites du gouverneur.
Pourquoi utiliser Database.SaveResult ?
Vous vous demandez peut-être pourquoi ne pas simplement utiliser des opérations DML standard telles que insert
ou update
sans se soucier de Enregistrer le résultat? La réponse réside dans la fiabilité et la flexibilité :
- Suivi des erreurs: Avec Base de données.SaveResultvous pouvez suivre exactement quels enregistrements ont échoué et pourquoi.
- Succès partiel: les opérations DML standard échouent entièrement si un enregistrement présente un problème. En utilisant des méthodes comme
Database.update()
avec Enregistrer le résultatvous pouvez enregistrer les enregistrements valides tout en enregistrant les erreurs pour les enregistrements non valides. - Expérience utilisateur: Imaginez exécuter un travail par lots sur 10 000 enregistrements. Si ne serait-ce qu’un seul enregistrement échoue et que vous utilisez du DML standard, l’ensemble de l’opération est annulé. Avec Enregistrer le résultatvous évitez ce problème.
Questions et réponses courantes
1. Que se passe-t-il si je ne gère pas les erreurs SaveResult ?
Des erreurs se produiront toujours, mais vous n’aurez aucune visibilité sur ce qui a échoué ni pourquoi. Cela peut rendre le débogage très difficile.
2. Puis-je réessayer automatiquement les enregistrements ayant échoué ?
Oui, vous pouvez capturer les enregistrements ayant échoué et les réexécuter dans une autre tâche par lots ou après avoir résolu les problèmes.
3. Database.SaveResult est-il limité aux classes batch ?
Non, il peut être utilisé dans n’importe quel contexte Apex où des opérations DML sont effectuées.
Conclusion
Base de données.SaveResult est un outil puissant pour gérer les opérations DML en masse dans Salesforce, en particulier dans les classes par lots. En comprenant comment l’utiliser efficacement, vous pouvez garantir un traitement des données fiable, évolutif et convivial.
Considérez-le comme votre feuille d’évaluation des performances enregistrement par enregistrement. Grâce à lui, vous ne saurez jamais ce qui n’a pas fonctionné (ou bien) dans vos tâches par lots. Commencez à expérimenter dès aujourd’hui et libérez le véritable potentiel de votre traitement de données Salesforce !
Source link