mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-07-30 03:09:50 +08:00
126 lines
4.9 KiB
OpenEdge ABL
126 lines
4.9 KiB
OpenEdge ABL
/**
|
|
* @description Batch Apex class for {describe the batch operation}.
|
|
* Processes {SObject} records in configurable batch sizes.
|
|
* Implements Database.Stateful to track cumulative results across chunks.
|
|
* @author Generated by Apex Class Writer Skill
|
|
*
|
|
* @example
|
|
* // Execute with default batch size
|
|
* Database.executeBatch(new {ClassName}());
|
|
*
|
|
* // Execute with custom batch size
|
|
* Database.executeBatch(new {ClassName}(), 100);
|
|
*/
|
|
public with sharing class {ClassName} implements Database.Batchable<SObject>, Database.Stateful {
|
|
|
|
// ─── Constants ───────────────────────────────────────────────────────
|
|
private static final Integer DEFAULT_BATCH_SIZE = 200;
|
|
|
|
// ─── Stateful Tracking ───────────────────────────────────────────────
|
|
private Integer totalProcessed = 0;
|
|
private Integer totalErrors = 0;
|
|
private List<String> errorMessages = new List<String>();
|
|
|
|
// ─── Constructor ─────────────────────────────────────────────────────
|
|
|
|
/**
|
|
* @description Default constructor
|
|
*/
|
|
public {ClassName}() {
|
|
// Default configuration
|
|
}
|
|
|
|
// ─── Batchable Interface ─────────────────────────────────────────────
|
|
|
|
/**
|
|
* @description Defines the scope of records to process.
|
|
* Uses Database.QueryLocator for efficient large-dataset processing.
|
|
* @param bc The batch context
|
|
* @return QueryLocator for the records to process
|
|
*/
|
|
public Database.QueryLocator start(Database.BatchableContext bc) {
|
|
return Database.getQueryLocator([
|
|
SELECT Id, Name
|
|
// TODO: Add fields needed for processing
|
|
FROM {SObject}
|
|
// TODO: Add WHERE clause to scope the records
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @description Processes each batch of records.
|
|
* Uses Database.update with allOrNone=false for partial success handling.
|
|
* @param bc The batch context
|
|
* @param scope List of {SObject} records in the current batch
|
|
*/
|
|
public void execute(Database.BatchableContext bc, List<{SObject}> scope) {
|
|
List<{SObject}> recordsToUpdate = new List<{SObject}>();
|
|
|
|
for ({SObject} record : scope) {
|
|
// TODO: Apply business logic to each record
|
|
recordsToUpdate.add(record);
|
|
}
|
|
|
|
if (!recordsToUpdate.isEmpty()) {
|
|
List<Database.SaveResult> results = Database.update(recordsToUpdate, false);
|
|
processResults(results);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @description Performs post-processing after all batches complete.
|
|
* Logs a summary of the batch execution.
|
|
* @param bc The batch context
|
|
*/
|
|
public void finish(Database.BatchableContext bc) {
|
|
String summary = String.format(
|
|
'{0} completed. Processed: {1}, Errors: {2}',
|
|
new List<Object>{
|
|
{ClassName}.class.getName(),
|
|
totalProcessed,
|
|
totalErrors
|
|
}
|
|
);
|
|
|
|
System.debug(LoggingLevel.INFO, summary);
|
|
|
|
if (!errorMessages.isEmpty()) {
|
|
System.debug(LoggingLevel.ERROR, 'Error details: ' + String.join(errorMessages, '\n'));
|
|
}
|
|
|
|
// TODO: Send completion notification email or post to chatter if needed
|
|
}
|
|
|
|
// ─── Private Helpers ─────────────────────────────────────────────────
|
|
|
|
/**
|
|
* @description Processes Database.SaveResult list, tracking successes and failures
|
|
* @param results List of SaveResult from a DML operation
|
|
*/
|
|
private void processResults(List<Database.SaveResult> results) {
|
|
for (Database.SaveResult result : results) {
|
|
if (result.isSuccess()) {
|
|
totalProcessed++;
|
|
} else {
|
|
totalErrors++;
|
|
for (Database.Error err : result.getErrors()) {
|
|
errorMessages.add(
|
|
'Record ' + result.getId() + ': ' +
|
|
err.getStatusCode() + ' - ' + err.getMessage()
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ─── Static Helpers ──────────────────────────────────────────────────
|
|
|
|
/**
|
|
* @description Convenience method to execute with default batch size
|
|
* @return The batch job Id
|
|
*/
|
|
public static Id run() {
|
|
return Database.executeBatch(new {ClassName}(), DEFAULT_BATCH_SIZE);
|
|
}
|
|
}
|