Как использовать базу данных. Пакетное управление состоянием Apex в Salesforce

Опубликовано: 2023-11-21

Во-первых, мы должны понимать, что если мы хотим использовать Batch Apex, мы должны написать класс Apex, который реализует интерфейс базы данных, предоставляемый Salesforce. Пакетный, а затем вызвать класс программно. Чтобы отслеживать или останавливать выполнение пакетного задания Apex, в меню «Настройка» введите «Задания Apex» в поле «Быстрый поиск», затем выберите «Задания Apex».

В этой статье мы углубимся в мощные возможности базы данных. С сохранением состояния в пакетном Apex. Понимание базы данных. Функция отслеживания состояния необходима для поддержания состояния при выполнении пакетных заданий, позволяя разработчикам сохранять переменные экземпляра и создавать более сложные пакетные процессы с учетом состояния.

Синтаксис для пакета:

 глобальный класс BatchName реализует Database.Batchable{}

Методы пакетного класса:

 global (Database.QueryLocator | Iterable) start (Database.BatchableContext bc) {
 //Здесь мы добавим запрос и вернем результат для метода выполнения
}

глобальное недействительное выполнение (Database.BatchableContext BC, list<P>){
 //Здесь должна быть логика
}

глобальное недействительное завершение (Database.BatchableContext BC) {
 //после обработки всех пакетов будет вызван этот метод. Внутри него мы можем написать любой код. Например, если вы хотите отправить электронное письмо всем записям, которые создаются или обновляются в методе выполнения.
}

Читайте также: Как создать настраиваемый тип отчета в Salesforce?

Реализация интерфейса Database.Batchable

Пример:

 глобальный класс BatchAccountUpdate реализует Database.Batchable{
    Строковый запрос = 'Выберите имя из учетной записи WHERE Name! = null AND (Name = \'Virendra Company\' OR Name = \'Virendra Sharma\') ';
    global Database.QueryLocator start (Database.BatchableContext bc) {
        // собираем пакеты записей или объектов, которые нужно передать на выполнение
        вернуть Database.getQueryLocator(запрос);
    }
    
    global void выполнить (Database.BatchableContext bc, List Records) {
        // обрабатываем каждый пакет записей
        для (аккаунт учетной записи: записи) {
            Имя аккаунта = Имя аккаунта + 'Обновлено';
        }
        обновлять записи;
    }
    
    глобальное недействительное завершение (Database.BatchableContext bc) {
        // выполняем любые операции постобработки, вызываем пакетный класс.
        BatchUpdateAccountRelatedContacts b = новый BatchUpdateAccountRelatedContacts ();
        Database.executeBatch(б, 200);
    }    
}
база данных с состоянием

База данных.С состоянием

Следующий пример класса находит все записи учетной записи, переданные методом start(), с помощью QueryLocator, и обновляет связанные контакты с почтовым адресом их учетной записи. Наконец, он отправляет электронное письмо с результатами массового задания, и, поскольку мы используем Database.Stateful для отслеживания состояния, обновляется количество записей.

код состояния базы данных
код состояния базы данных

Пример:

нанять разработчиков отдела продаж

База данных.AllowsCallout

Database.AllowsCallout в пакетном режиме помогает интегрировать Salesforce с внешним сервером. Чтобы использовать выноску в пакетном Apex, мы должны использовать интерфейс Database.AllowsCallouts в определении класса пакета.

Синтаксис:

 глобальный класс SearchAndReplace реализует Database.Batchable, Database.AllowsCallouts{}

Пример:
Здесь я интегрирую объект Opportunity с Razorsync.com.
/*
Получите запрос на обслуживание от razorsync и передайте его в отдел продаж.
*/

 глобальный класс Batch_SR_RazorSyncAPI реализует Database.Batchable, Database.AllowsCallouts{
    глобальный запуск Database.QueryLocator (Database.BatchableContext BC) {
        Строковый запрос = '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\'';
        вернуть Database.getQueryLocator(запрос);
    }
   
    глобальное недействительное выполнение (Database.BatchableContext BC, область списка) {
        Строковый статус;
        для (Возможность s: объем){
            // получаем запрос на обслуживание
            System.debug(s.Id);
            Http http1 = новый Http();
            HttpRequest request1 = новый 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('Хост', 'ИмяДомена.0.razorsync.com');
            request1.setHeader('Content-Length', '0');
            request1.setHeader('Соединение', 'Keep-Alive');
            request1.setHeader('ИмяСервера', 'ИмяДоменСервера');
            request1.setHeader('Токен', 'XXXXXXXXXXXXXXXXXXXXXXXXX');
            
            HttpResponse ответ1 = http1.send(request1);
            
            если (response1.getStatusCode() == 200) {
                Положение дел;
                Анализатор JSONParser = JSON.createParser(response1.getBody());
                while(parser.nextToken() != null) {
                    if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) {
                        парсер.nextToken();
                        StatusId = parser.getText();
                    }
                }
                System.debug(StatusId);
                if(StatusId == String.valueOf(1) || Test.isRunningTest()){
                    s.Razorsync_Job_Status__c = 'Задание выполнено';
                    s.StageName = 'Закрытый выигран';
                }еще{
                    s.Razorsync_Job_Status__c = 'Работает';
                }
            }
        }
        область обновления;
    }
    глобальное недействительное завершение (Database.BatchableContext BC) {
    }
}

Читайте также: Преимущества облака Salesforce Commerce и способы вызова потоков из Apex в Salesforce

Заключение

Использование Database.Stateful в Batch Apex в Salesforce позволяет сохранять состояние при различных методах выполнения пакетного задания. Это крайне важно для сценариев, где требуется сложная обработка данных и состояние должно сохраняться между пакетными фрагментами.

Реализуя Database.Stateful , разработчики могут обеспечить согласованность данных и эффективно управлять большими наборами данных. Однако важно использовать эту функцию разумно, чтобы избежать чрезмерного потребления памяти и потенциальных проблем с производительностью.

Лучшие практики включают сохранение минимальных переменных состояния и сосредоточение внимания на важных данных, что делает Database.Stateful мощным инструментом для комплексной пакетной обработки, зависящей от состояния, в Salesforce.

Для дальнейшей помощи в проекте отдела продаж наймите нас в качестве консультанта по продажам и воспользуйтесь преимуществами.