Come utilizzare il database. Stateful in batch Apex in Salesforce

Pubblicato: 2023-11-21

Innanzitutto dobbiamo capire che se vogliamo utilizzare Batch Apex, dobbiamo scrivere una classe Apex che implementi l'interfaccia Database fornita da Salesforce. Batchable e quindi richiamare la classe a livello di codice. Per monitorare o interrompere l'esecuzione del lavoro Apex batch, da Imposta immettere Lavori Apex nella casella Ricerca veloce, quindi selezionare Lavori Apex.

In questo articolo, approfondiamo le potenti funzionalità di Database. Con stato in batch Apex. Comprendere il database. Lo stato è essenziale per mantenere lo stato durante le esecuzioni di processi batch, consentendo agli sviluppatori di preservare le variabili dell'istanza e realizzare processi batch più sofisticati e consapevoli dello stato.

Sintassi per batch:

 la classe globale BatchName implementa Database.Batchable{}

Metodi di classe batch:

 globale (Database.QueryLocator | Iterable) inizio (Database.BatchableContext bc) {
 //Qui aggiungeremo la query e restituiremo il risultato per eseguire il metodo
}

esecuzione del vuoto globale (Database.BatchableContext BC, elenco<P>){
 //La logica deve essere qui
}

finitura del vuoto globale (Database.BatchableContext BC){
 //dopo l'elaborazione di tutti i batch verrà chiamato questo metodo. Possiamo scrivere qualsiasi codice al suo interno. Ad esempio se si desidera inviare e-mail a tutti i record creati o aggiornati nel metodo di esecuzione.
}

Leggi anche: Come creare un tipo di rapporto personalizzato in Salesforce?

Implementazione dell'interfaccia Database.Batchable

Esempio:

 la classe globale BatchAccountUpdate implementa Database.Batchable{
    String query = 'Seleziona nome dall'account WHERE Nome! = null AND (Nome = \'Azienda Virendra\' O Nome = \'Virendra Sharma\') ';
    inizio globale Database.QueryLocator (Database.BatchableContext bc) {
        // raccoglie i batch di record o oggetti da passare per l'esecuzione
        restituisce Database.getQueryLocator(query);
    }
    
    esecuzione void globale (Database.BatchableContext bc, Elenco record) {
        // elabora ogni batch di record
        per (Account account: record){
            acc.Name = acc.Name + 'Aggiornato';
        }
        aggiornare i record;
    }
    
    finitura del vuoto globale (Database.BatchableContext bc){
        // esegue qualsiasi operazione di post-elaborazione, chiamando la classe batch.
        BatchUpdateAccountRelatedContacts b = nuovo BatchUpdateAccountRelatedContacts();
        Database.executeBatch(b, 200);
    }    
}
database con stato

Database.Stateful

La seguente classe di esempio trova tutti i record dell'account passati dal metodo start() utilizzando un QueryLocator e aggiorna i contatti associati con l'indirizzo postale del relativo account. Infine, invia un'e-mail con i risultati del lavoro in blocco e, poiché utilizziamo Database.Stateful per tenere traccia dello stato, il numero di record aggiornati.

codice con stato del database
codice con stato del database

Esempio:

assumere sviluppatori della forza vendita

Database.AllowsCallout

Database.AllowsCallout in Batch aiuta a integrare Salesforce con un server esterno. Per utilizzare un callout nel batch Apex, dobbiamo utilizzare un'interfaccia Database.AllowsCallouts nella definizione della classe batch.

Sintassi:

 la classe globale SearchAndReplace implementa Database.Batchable, Database.AllowsCallouts{}

Esempio:
Qui sto integrando l'oggetto Opportunity con Razorsync.com
/*
Ricevi una richiesta di servizio da razorsync e aggiornala nella forza vendita
*/

 la classe globale Batch_SR_RazorSyncAPI implementa Database.Batchable, Database.AllowsCallouts{
    inizio globale Database.QueryLocator (Database.BatchableContext BC){
        String query = 'SELECT Id, Razorsync_Service_Request_Id__c FROM Opportunity WHERE Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'Job Done\' AND RazorSync_Status__c = \'Success\'';
        restituisce Database.getQueryLocator(query);
    }
   
    esecuzione void globale (Database.BatchableContext BC, ambito Elenco){
        Stato della stringa;
        per (Opportunità: ambito){
            //ottieni ServiceRequest
            System.debug(s.Id);
            Http http1 = nuovo Http();
            Richiesta HttpRequest1 = nuova HttpRequest();
            request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c);
            request1.setMethod('GET');
            request1.setHeader('Tipo di contenuto', 'application/json');
            request1.setHeader('Host', 'NomeDominio.0.razorsync.com');
            request1.setHeader('Lunghezza contenuto', '0');
            request1.setHeader('Connessione', 'Keep-Alive');
            request1.setHeader('NomeServer', 'NomeServerDominio');
            request1.setHeader('Token', 'XXXXXXXXXXXXXXXXXXXXXXX');
            
            HttpResponse risposta1 = http1.send(richiesta1);
            
            if(risposta1.getStatusCode() == 200) {
                Stato;
                Analizzatore 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 = 'Lavoro completato';
                    s.StageName = 'Chiuso Vinto';
                }altro{
                    s.Razorsync_Job_Status__c = 'Lavoro';
                }
            }
        }
        ambito dell'aggiornamento;
    }
    finitura del vuoto globale (Database.BatchableContext BC){
    }
}

Leggi anche: Vantaggi di Salesforce Commerce Cloud e come chiamare i flussi da Apex in Salesforce

Conclusione

Utilizzo di Database.Stateful in Batch Apex all'interno di Salesforce consente di preservare lo stato tra diversi metodi di esecuzione in un processo batch. Ciò è fondamentale per gli scenari in cui è richiesta un'elaborazione dati complessa e lo stato deve essere mantenuto tra blocchi batch.

Implementando Database.Stateful , gli sviluppatori possono garantire la coerenza dei dati e gestire in modo efficace set di dati di grandi dimensioni. Tuttavia, è importante utilizzare questa funzionalità con giudizio per evitare un consumo eccessivo di memoria e potenziali problemi di prestazioni.

Le migliori pratiche includono il mantenimento di variabili di stato minime e la concentrazione sui dati essenziali, rendendo così Database.Stateful uno strumento potente per l'elaborazione batch complessa e dipendente dallo stato in Salesforce.

Per ulteriore assistenza con un progetto di forza vendita, assumici come consulente della forza vendita e raccogli i vantaggi.