Comment utiliser la base de données. Avec état dans Batch Apex dans Salesforce

Publié: 2023-11-21

Tout d'abord, nous devons comprendre que si nous voulons utiliser Batch Apex, nous devons écrire une classe Apex qui implémente la base de données d'interface fournie par Salesforce. Batchable, puis invoquez la classe par programme. Pour surveiller ou arrêter l'exécution de la tâche Apex par lots, dans Configuration, saisissez Tâches Apex dans la case Recherche rapide, puis sélectionnez Tâches Apex.

Dans cet article, nous explorons les puissantes fonctionnalités de Database. Avec état dans Batch Apex. Comprendre la base de données. Stateful est essentiel pour maintenir l'état lors des exécutions de tâches par lots, permettant aux développeurs de conserver les variables d'instance et de créer des processus par lots plus sophistiqués et sensibles à l'état.

Syntaxe pour Batch :

 la classe globale BatchName implémente Database.Batchable{}

Méthodes de classe par lots :

 global (Database.QueryLocator | Itérable) start (Database.BatchableContext bc) {
 //Ici, nous allons ajouter la requête et renvoyer le résultat pour exécuter la méthode
}

exécution globale void (Database.BatchableContext BC, list<P>){
 //La logique doit être ici
}

finition du vide global (Database.BatchableContext BC){
 //après le traitement de tous les lots, cette méthode sera appelée. Nous pouvons y écrire n’importe quel code. Comme si vous souhaitez envoyer un e-mail à tous les enregistrements créés ou mis à jour dans la méthode d'exécution.
}

Lisez également : Comment créer un type de rapport personnalisé dans Salesforce ?

Implémentation de l'interface Database.Batchable

Exemple:

 la classe globale BatchAccountUpdate implémente Database.Batchable{
    Requête de chaîne = 'Sélectionnez le nom du compte OÙ Nom ! = null AND (Nom = \'Société Virendra\' OU Nom = \'Virendra Sharma\') ';
    démarrage global de Database.QueryLocator (Database.BatchableContext bc) {
        // collecte les lots d'enregistrements ou d'objets à passer à exécuter
        return Database.getQueryLocator(query);
    }
    
    global void exécuter (Database.BatchableContext bc, Lister les enregistrements) {
        // traite chaque lot d'enregistrements
        pour (Compte acc : enregistrements){
            acc.Name = acc.Name + 'Mise à jour';
        }
        mettre à jour les dossiers ;
    }
    
    finition globale du vide (Database.BatchableContext bc){
        // exécute toutes les opérations de post-traitement, appelant la classe batch.
        BatchUpdateAccountRelatedContacts b = new BatchUpdateAccountRelatedContacts();
        Base de données.executeBatch(b, 200);
    }    
}
base de données avec état

Base de données.Stateful

L'exemple de classe suivant recherche tous les enregistrements de compte transmis par la méthode start() à l'aide d'un QueryLocator et met à jour les contacts associés avec l'adresse postale de leur compte. Enfin, il envoie un e-mail avec les résultats du travail groupé et, puisque nous utilisons Database.Stateful pour suivre l'état, le nombre d'enregistrements mis à jour.

code avec état de la base de données
code avec état de la base de données

Exemple:

embaucher des développeurs Salesforce

Base de données.AllowsCallout

Database.AllowsCallout in Batch aide à intégrer Salesforce à un serveur externe. Pour utiliser une légende en batch Apex, nous devons utiliser une interface Database.AllowsCallouts dans la définition de classe de la classe batch.

Syntaxe:

 la classe globale SearchAndReplace implémente Database.Batchable, Database.AllowsCallouts{}

Exemple:
Ici, j'intègre l'objet Opportunity avec Razorsync.com
/*
Obtenez la demande de service de Razorsync et mettez-la à jour dans la force de vente
*/

 la classe globale Batch_SR_RazorSyncAPI implémente Database.Batchable, Database.AllowsCallouts{
    Démarrage global de Database.QueryLocator (Database.BatchableContext BC){
        Requête de chaîne = 'SELECT Id, Razorsync_Service_Request_Id__c FROM Opportunity WHERE Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'Travail terminé\' ET RazorSync_Status__c = \'Success\'';
        return Database.getQueryLocator(query);
    }
   
    exécution globale void (Database.BatchableContext BC, portée de la liste){
        Statut de la chaîne ;
        pour (Opportunités : portée){
            //obtenir une demande de service
            System.debug(s.Id);
            Http http1 = nouveau Http();
            HttpRequest request1 = new HttpRequest();
            request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c);
            request1.setMethod('GET');
            request1.setHeader('Content-Type', 'application/json');
            request1.setHeader('Hôte', 'DomainName.0.razorsync.com');
            request1.setHeader('Content-Length', '0');
            request1.setHeader('Connexion', 'Keep-Alive');
            request1.setHeader('NomServeur', 'NomServeurDomain');
            request1.setHeader('Jeton', 'XXXXXXXXXXXXXXXXXXXXXXX');
            
            HttpResponse réponse1 = http1.send(request1);
            
            si(response1.getStatusCode() == 200) {
                Statut;
                Analyseur JSONParser = JSON.createParser(response1.getBody());
                while(parser.nextToken() != null) {
                    if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) {
                        parser.nextToken();
                        StatusId = parser.getText();
                    }
                }
                System.debug(StatusId);
                if(StatusId == String.valueOf(1) || Test.isRunningTest()){
                    s.Razorsync_Job_Status__c = 'Travail terminé';
                    s.StageName = 'Fermé gagné';
                }autre{
                    s.Razorsync_Job_Status__c = 'Travail';
                }
            }
        }
        portée de la mise à jour ;
    }
    finition du vide global (Database.BatchableContext BC){
    }
}

Lisez également : Avantages de Salesforce Commerce Cloud et comment appeler des flux depuis Apex dans Salesforce

Conclusion

L'utilisation de Database.Stateful dans Batch Apex dans Salesforce permet de préserver l'état des différentes méthodes d'exécution dans une tâche par lots. Ceci est crucial pour les scénarios dans lesquels un traitement de données complexe est requis et où l’état doit être conservé entre les morceaux de lots.

En implémentant Database.Stateful , les développeurs peuvent garantir la cohérence des données et gérer efficacement de grands ensembles de données. Cependant, il est important d'utiliser cette fonctionnalité judicieusement pour éviter une consommation excessive de mémoire et d'éventuels problèmes de performances.

Les meilleures pratiques incluent le maintien des variables d'état au minimum et la concentration sur les données essentielles, faisant ainsi de Database.Stateful un outil puissant pour le traitement par lots complexe et dépendant de l'état dans Salesforce.

Pour une assistance supplémentaire sur un projet Salesforce, engagez-nous en tant que consultant Salesforce et profitez-en.