So verwenden Sie die Datenbank. Zustandsbehaftet im Batch-Apex in Salesforce

Veröffentlicht: 2023-11-21

Zunächst müssen wir verstehen, dass wir, wenn wir Batch Apex verwenden möchten, eine Apex-Klasse schreiben müssen, die die von Salesforce bereitgestellte Schnittstellendatenbank implementiert. Batchfähig und rufen Sie die Klasse dann programmgesteuert auf. Um die Ausführung des Batch-Apex-Jobs zu überwachen oder zu stoppen, geben Sie unter „Setup“ im Feld „Schnellsuche“ den Text „Apex-Jobs“ ein und wählen Sie dann „Apex-Jobs“ aus.

In diesem Artikel befassen wir uns mit den leistungsstarken Funktionen von Database. Zustandsbehaftet in Batch Apex. Datenbank verstehen. Stateful ist für die Aufrechterhaltung des Status über die Ausführung von Batch-Jobs hinweg von entscheidender Bedeutung und ermöglicht es Entwicklern, Instanzvariablen beizubehalten und ausgefeiltere, zustandsbewusste Batch-Prozesse durchzuführen.

Syntax für Batch:

 Die globale Klasse BatchName implementiert Database.Batchable{}

Methoden der Batch-Klasse:

 global (Database.QueryLocator | Iterable) start (Database.BatchableContext bc) {
 //Hier fügen wir die Abfrage hinzu und geben das Ergebnis an die Ausführungsmethode zurück
}

global voidexecute (Database.BatchableContext BC, list<P>){
 //Logik muss hier sein
}

globales Void-Finish (Database.BatchableContext BC){
 //nach der Verarbeitung aller Batches wird diese Methode aufgerufen. Wir können jeden beliebigen Code darin schreiben. Zum Beispiel, wenn Sie eine E-Mail an alle Datensätze senden möchten, die in der Ausführungsmethode erstellt oder aktualisiert werden.
}

Lesen Sie auch: Wie erstelle ich einen benutzerdefinierten Berichtstyp in Salesforce?

Implementierung der Database.Batchable-Schnittstelle

Beispiel:

 Die globale Klasse BatchAccountUpdate implementiert Database.Batchable{
    String query = 'Wählen Sie den Namen aus dem Konto WHERE Name aus! = null AND (Name = \'Virendra Company\' OR Name = \'Virendra Sharma\') ';
    globaler Database.QueryLocator start (Database.BatchableContext bc) {
        // Sammeln Sie die Stapel von Datensätzen oder Objekten, die zur Ausführung übergeben werden sollen
        return Database.getQueryLocator(query);
    }
    
    global voidexecute (Database.BatchableContext bc, Datensätze auflisten) {
        // Jeden Datensatzstapel verarbeiten
        für (Kontokonto: Datensätze){
            acc.Name = acc.Name + 'Aktualisiert';
        }
        Datensätze aktualisieren;
    }
    
    globales Void-Finish (Database.BatchableContext bc){
        // Führen Sie alle Nachbearbeitungsvorgänge aus und rufen Sie die Batch-Klasse auf.
        BatchUpdateAccountRelatedContacts b = new BatchUpdateAccountRelatedContacts();
        Database.executeBatch(b, 200);
    }    
}
Datenbank zustandsbehaftet

Datenbank.Stateful

Die folgende Beispielklasse findet alle Kontodatensätze, die von der start()-Methode mithilfe eines QueryLocator übergeben werden, und aktualisiert die zugehörigen Kontakte mit der Postanschrift ihres Kontos. Schließlich wird eine E-Mail mit den Ergebnissen des Massenauftrags und, da wir Database.Stateful zum Verfolgen des Status verwenden, der Anzahl der aktualisierten Datensätze gesendet.

Zustandsbehafteter Datenbankcode
Zustandsbehafteter Datenbankcode

Beispiel:

Stellen Sie Salesforce-Entwickler ein

Database.AllowsCallout

Database.AllowsCallout in Batch hilft bei der Integration von Salesforce mit einem externen Server. Um ein Callout in Batch-Apex zu verwenden, müssen wir eine Schnittstelle Database.AllowsCallouts in der Klassendefinition der Batch-Klasse verwenden.

Syntax:

 Die globale Klasse SearchAndReplace implementiert Database.Batchable, Database.AllowsCallouts{}

Beispiel:
Hier integriere ich das Opportunity-Objekt mit Razorsync.com
/*
Erhalten Sie eine Serviceanfrage von Razorsync und aktualisieren Sie sie in Salesforce
*/

 Die globale Klasse Batch_SR_RazorSyncAPI implementiert Database.Batchable, Database.AllowsCallouts{
    globaler Database.QueryLocator-Start (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\'';
        return Database.getQueryLocator(query);
    }
   
    globale void-Ausführung (Database.BatchableContext BC, Listenbereich){
        String-Status;
        for (Opportunity s: Umfang){
            //ServiceRequest abrufen
            System.debug(s.Id);
            Http http1 = new 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('Host', 'DomainName.0.razorsync.com');
            request1.setHeader('Content-Length', '0');
            request1.setHeader('Connection', 'Keep-Alive');
            request1.setHeader('ServerName', 'DomainServerName');
            request1.setHeader('Token', 'XXXXXXXXXXXXXXXXXXXXXXX');
            
            HttpResponse Antwort1 = http1.send(request1);
            
            if(response1.getStatusCode() == 200) {
                Status;
                JSONParser parser = 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 = 'Auftrag erledigt';
                    s.StageName = 'Geschlossen und gewonnen';
                }anders{
                    s.Razorsync_Job_Status__c = 'Arbeitet';
                }
            }
        }
        Aktualisierungsumfang;
    }
    globales Void-Finish (Database.BatchableContext BC){
    }
}

Lesen Sie auch: Vorteile der Salesforce Commerce Cloud und So rufen Sie Flows von Apex in Salesforce auf

Abschluss

Die Verwendung von Database.Stateful in Batch Apex in Salesforce ermöglicht die Beibehaltung des Status über verschiedene Ausführungsmethoden in einem Batch-Job hinweg. Dies ist von entscheidender Bedeutung für Szenarien, in denen eine komplexe Datenverarbeitung erforderlich ist und der Status zwischen Batch-Blöcken beibehalten werden muss.

Durch die Implementierung von Database.Stateful können Entwickler die Datenkonsistenz sicherstellen und große Datenmengen effektiv verwalten. Es ist jedoch wichtig, diese Funktion mit Bedacht zu nutzen, um übermäßigen Speicherverbrauch und mögliche Leistungsprobleme zu vermeiden.

Zu den Best Practices gehört die Minimierung von Zustandsvariablen und die Konzentration auf wesentliche Daten, was Database.Stateful zu einem leistungsstarken Tool für die komplexe, zustandsabhängige Stapelverarbeitung in Salesforce macht.

Wenn Sie weitere Unterstützung bei einem Salesforce-Projekt benötigen, engagieren Sie uns als Ihren Salesforce-Berater und profitieren Sie von den Vorteilen.