Cómo utilizar la base de datos. Con estado en Apex por lotes en Salesforce
Publicado: 2023-11-21En primer lugar, debemos comprender que si queremos utilizar Batch Apex, debemos escribir una clase Apex que implemente la interfaz de base de datos proporcionada por Salesforce. Batchable y luego invocar la clase mediante programación. Para monitorear o detener la ejecución del trabajo de Apex por lotes, desde Configuración, ingrese Trabajos de Apex en el cuadro Búsqueda rápida y luego seleccione Trabajos de Apex.
En este artículo, profundizamos en las potentes funciones de la base de datos. Con estado en Batch Apex. Comprensión de la base de datos. Stateful es esencial para mantener el estado en las ejecuciones de trabajos por lotes, lo que permite a los desarrolladores preservar las variables de instancia y realizar procesos por lotes más sofisticados y con reconocimiento del estado.
Sintaxis para lotes:
la clase global BatchName implementa Database.Batchable{}
Métodos de clase por lotes:
global (Database.QueryLocator | Iterable) inicio (Database.BatchableContext bc) { //Aquí agregaremos la consulta y devolveremos el resultado para ejecutar el método } ejecución de anulación global (Database.BatchableContext BC, lista<P>){ //La lógica debe estar aquí } acabado de vacío global (Database.BatchableContext BC) { //después del procesamiento de todos los lotes se llamará a este método. Podemos escribir cualquier código dentro de él. Como si quisiera enviar un correo electrónico a todos los registros que se crean o actualizan en el método de ejecución. }
Lea también: ¿Cómo crear un tipo de informe personalizado en Salesforce?
Implementación de la base de datos.Interfaz por lotes
Ejemplo:
La clase global BatchAccountUpdate implementa Database.Batchable{ Consulta de cadena = 'Seleccione nombre de la cuenta ¡DONDE Nombre! = null AND (Nombre = \'Virendra Company\' O Nombre = \'Virendra Sharma\') '; inicio global de Database.QueryLocator (Database.BatchableContext bc) { // recopila los lotes de registros u objetos que se pasarán para ejecutar devolver Database.getQueryLocator(consulta); } ejecución de vacío global (Database.BatchableContext bc, registros de lista) { // procesa cada lote de registros para (Cuenta de cuenta: registros){ acc.Name = acc.Name + 'Actualizado'; } actualizar registros; } acabado vacío global (Database.BatchableContext bc){ // ejecuta cualquier operación de posprocesamiento, llamando a la clase por lotes. BatchUpdateAccountRelatedContacts b = nuevo BatchUpdateAccountRelatedContacts(); Base de datos.executeBatch(b, 200); } }
Base de datos.Con estado
La siguiente clase de ejemplo encuentra todos los registros de cuenta que se pasan mediante el método start() utilizando un QueryLocator y actualiza los contactos asociados con la dirección postal de su cuenta. Finalmente, envía un correo electrónico con los resultados del trabajo masivo y, dado que estamos usando Database.Stateful para rastrear el estado, la cantidad de registros actualizados.
Ejemplo:
Base de datos.AllowsCallout
Database.AllowsCallout in Batch ayuda a integrar Salesforce con un servidor externo. Para usar una llamada en Apex por lotes, debemos usar una interfaz Database.AllowsCallouts en la definición de clase de clase por lotes.
Sintaxis:
la clase global SearchAndReplace implementa Database.Batchable, Database.AllowsCallouts{}
Ejemplo:
Aquí, estoy integrando el objeto Oportunidad con Razorsync.com
/*
Obtenga una solicitud de servicio de razorsync y actualícela en Salesforce
*/
la clase global Batch_SR_RazorSyncAPI implementa Database.Batchable, Database.AllowsCallouts{ inicio global de Database.QueryLocator (Database.BatchableContext BC) { Consulta de cadena = 'SELECT Id, Razorsync_Service_Request_Id__c FROM Oportunidad DONDE Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'Trabajo realizado\' AND RazorSync_Status__c = \'Éxito\''; devolver Database.getQueryLocator(consulta); } ejecución de anulación global (Database.BatchableContext BC, alcance de lista) { Estado de cadena; para (Oportunidad s: alcance){ //obtener solicitud de servicio System.debug(s.Id); Http http1 = nuevo Http(); Solicitud HttpRequest1 = nueva HttpRequest(); request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c); request1.setMethod('OBTENER'); request1.setHeader('Tipo de contenido', 'aplicación/json'); request1.setHeader('Host', 'DomainName.0.razorsync.com'); request1.setHeader('Contenido-Longitud', '0'); request1.setHeader('Conexión', 'Keep-Alive'); request1.setHeader('NombreServidor', 'NombreServidorDominio'); request1.setHeader('Token', 'XXXXXXXXXXXXXXXXXXXXXXXX'); HttpResponse respuesta1 = http1.send(solicitud1); si(respuesta1.getStatusCode() == 200) { Estado; Analizador JSONParser = JSON.createParser(response1.getBody()); mientras (parser.nextToken()! = nulo) { if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) { analizador.nextToken(); StatusId = analizador.getText(); } } System.debug(EstadoId); if(StatusId == String.valueOf(1) || Test.isRunningTest()){ s.Razorsync_Job_Status__c = 'Trabajo realizado'; s.StageName = 'Cerrado Ganado'; }demás{ s.Razorsync_Job_Status__c = 'Trabajando'; } } } alcance de la actualización; } acabado de vacío global (Database.BatchableContext BC) { } }
Lea también: Beneficios de Salesforce Commerce Cloud y cómo llamar flujos desde Apex en Salesforce
Conclusión
El uso de Database.Stateful en Batch Apex dentro de Salesforce permite preservar el estado en diferentes métodos de ejecución en un trabajo por lotes. Esto es crucial para escenarios en los que se requiere un procesamiento de datos complejo y el estado debe conservarse entre fragmentos de lotes.
Al implementar Database.Stateful , los desarrolladores pueden garantizar la coherencia de los datos y gestionar grandes conjuntos de datos de forma eficaz. Sin embargo, es importante utilizar esta función con prudencia para evitar un consumo excesivo de memoria y posibles problemas de rendimiento.
Las mejores prácticas incluyen mantener las variables de estado al mínimo y centrarse en los datos esenciales, lo que convierte a Database.Stateful en una poderosa herramienta para el procesamiento por lotes complejo y dependiente del estado en Salesforce.
Para obtener más ayuda con un proyecto de Salesforce, contrátenos como su consultor de Salesforce y obtenga los beneficios.