Como usar o banco de dados. Apex com estado em lote no Salesforce

Publicados: 2023-11-21

Primeiramente, devemos entender que se quisermos usar Batch Apex, devemos escrever uma classe Apex que implemente a interface Database fornecida pelo Salesforce. Batchable e, em seguida, invocar a classe programaticamente. Para monitorar ou interromper a execução do trabalho em lote do Apex, em Configuração, insira Trabalhos do Apex na caixa Busca rápida e selecione Trabalhos do Apex.

Neste artigo, nos aprofundamos nos recursos poderosos do banco de dados. Com estado no Apex em lote. Noções básicas sobre banco de dados. Stateful é essencial para manter o estado nas execuções de trabalhos em lote, permitindo que os desenvolvedores preservem variáveis ​​de instância e criem processos em lote mais sofisticados e com reconhecimento de estado.

Sintaxe para lote:

 a classe global BatchName implementa Database.Batchable{}

Métodos de classe em lote:

 global (Database.QueryLocator | Iterável) start (Database.BatchableContext bc) {
 //Aqui adicionaremos a consulta e retornaremos o resultado para executar o método
}

execução global void (Database.BatchableContext BC, lista<P>){
 //A lógica deve estar aqui
}

acabamento vazio global (Database.BatchableContext BC){
 //após o processamento de todos os lotes este método será chamado. Podemos escrever qualquer código dentro dele. Por exemplo, se quiser enviar email para todos os registros que são criados ou atualizados no método execute.
}

Leia também: Como criar um tipo de relatório personalizado no Salesforce?

Implementando a interface Database.Batchable

Exemplo:

 a classe global BatchAccountUpdate implementa Database.Batchable{
    String query = 'Selecione o nome da conta WHERE Nome! = null AND (Nome = \'Empresa Virendra\' OR Nome = \'Virendra Sharma\') ';
    início global de Database.QueryLocator (Database.BatchableContext bc) {
        // coleta os lotes de registros ou objetos a serem passados ​​para execução
        retornar Database.getQueryLocator(query);
    }
    
    global void execute (Database.BatchableContext bc, listar registros) {
        //processa cada lote de registros
        for (conta da conta: registros){
            acc.Name = acc.Name + 'Atualizado';
        }
        atualizar registros;
    }
    
    acabamento vazio global (Database.BatchableContext bc){
        // executa qualquer operação de pós-processamento, chamando a classe batch.
        BatchUpdateAccountRelatedContacts b = new BatchUpdateAccountRelatedContacts();
        Banco de dados.executeBatch(b, 200);
    }    
}
banco de dados com estado

Banco de dados.Stateful

A classe de exemplo a seguir localiza todos os registros de conta que são passados ​​pelo método start() usando um QueryLocator e atualiza os contatos associados com o endereço de correspondência de sua conta. Por fim, ele envia um email com os resultados do trabalho em massa e, como estamos usando Database.Stateful para rastrear o estado, a quantidade de registros atualizados.

código com estado do banco de dados
código com estado do banco de dados

Exemplo:

contratar desenvolvedores de força de vendas

Banco de dados.AllowsCallout

Database.AllowsCallout in Batch ajuda na integração do Salesforce com um servidor externo. Para usar um callout no Apex em lote, devemos usar uma interface Database.AllowsCallouts na definição de classe da classe em lote.

Sintaxe:

 a classe global SearchAndReplace implementa Database.Batchable, Database.AllowsCallouts{}

Exemplo:
Aqui, estou integrando o objeto Opportunity com Razorsync.com
/*
Obtenha a solicitação de serviço do razorsync e atualize-a na força de vendas
*/

 a classe global Batch_SR_RazorSyncAPI implementa Database.Batchable, Database.AllowsCallouts{
    início global de 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 != \'Trabalho concluído\' AND RazorSync_Status__c = \'Sucesso\'';
        retornar Database.getQueryLocator(query);
    }
   
    execução global void (Database.BatchableContext BC, escopo da lista){
        Status da sequência;
        for (Oportunidades: escopo){
            //obtém solicitação de serviço
            System.debug(s.Id);
            http http1 = novo http();
            solicitação HttpRequest1 = new HttpRequest();
            request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c);
            request1.setMethod('GET');
            request1.setHeader('Tipo de conteúdo', 'aplicativo/json');
            request1.setHeader('Host', 'DomainName.0.razorsync.com');
            request1.setHeader('Content-Length', '0');
            request1.setHeader('Conexão', 'Keep-Alive');
            request1.setHeader('NomeServidor', 'NomeServidorDomínio');
            request1.setHeader('Token', 'XXXXXXXXXXXXXXXXXXXXXXXX');
            
            HttpResponse resposta1 = http1.send(solicitação1);
            
            if(response1.getStatusCode() == 200) {
                Status;
                Analisador JSONParser = JSON.createParser(response1.getBody());
                while(parser.nextToken() != null) {
                    if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) {
                        analisador.nextToken();
                        StatusId = parser.getText();
                    }
                }
                System.debug(StatusId);
                if(StatusId == String.valueOf(1) || Test.isRunningTest()){
                    s.Razorsync_Job_Status__c = 'Trabalho concluído';
                    s.StageName = 'Fechado e ganho';
                }outro{
                    s.Razorsync_Job_Status__c = 'Trabalhando';
                }
            }
        }
        atualizar escopo;
    }
    acabamento vazio global (Database.BatchableContext BC){
    }
}

Leia também: Benefícios do Salesforce Commerce Cloud e como chamar fluxos do Apex no Salesforce

Conclusão

Usar Database.Stateful no Batch Apex no Salesforce permite preservar o estado em diferentes métodos de execução em um trabalho em lote. Isto é crucial para cenários em que é necessário processamento complexo de dados e o estado deve ser retido entre blocos de lote.

Ao implementar Database.Stateful , os desenvolvedores podem garantir a consistência dos dados e gerenciar grandes conjuntos de dados de maneira eficaz. No entanto, é importante usar esse recurso criteriosamente para evitar consumo excessivo de memória e possíveis problemas de desempenho.

As práticas recomendadas incluem manter as variáveis ​​de estado mínimas e focar em dados essenciais, tornando o Database.Stateful uma ferramenta poderosa para processamento em lote complexo e dependente de estado no Salesforce.

Para obter mais assistência com um projeto de força de vendas, contrate-nos como seu consultor de força de vendas e colha os benefícios.