I want to turn my trigger code into a batch Apex, however, i am encountering a number of problems with it. Posting both the original and the batch codes. Please can anyone suggest what changes to add to execute it. I am writing a batch code for the first time in Salesforce. It would be a great help.
Original Trigger Code: The trigger is on the Sales_Order__c custom object, and i am upserting a lookup field Order_History__c which is a link to OrderHistory (API name - Order_History__c) object. ID_Opp_Product_18__c, Sales_Order__c (referencing field in OpportunityLineItem), and Order_History__c are present as Custom Fields and Relationship in OpportunityLineItem.
trigger OrderHistory on Sales_Order__c (after insert)
{
Map<String, ID> salesOrderMap = new Map<String, ID>();
for (Sales_Order__c so : Trigger.new)
{
String s2 = String.valueOf(so.Name);
String s1 = s2.mid(2,8);
if (s1 != null)
{
salesOrderMap.put(s1, so.Id);
}
}
List <OpportunityLineItem> oppLineItems = [select Sales_Order__c, OpportunityId, ID_Opp_Product_18__c from OpportunityLineItem where Sales_Order__c In :salesOrderMap.keyset()];
for(OpportunityLineItem oli : oppLineItems)
{
ID salesOrderId = salesOrderMap.get(oli.Sales_Order__c);
oli.Order_History__c = salesOrderId;
}
upsert oppLineItems;
}
Batch class code:
global class OrderHistoryBatch implements Database.Batchable<sObject>
{
String query;
String email;
global Database.QueryLocator start(Database.BatchableContext BC)
{
query = 'select Sales_Order__c, OpportunityId, ID_Opp_Product_18__c from OpportunityLineItem where Sales_Order__C In:salesOrderMap.keyset()';
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC, List<OrderHistory> scope)
{
Map<String, ID> SalesOrderMap = new Map<String, Id>();
for(sObject s3: scope)
{
String s2=String.valueOf(s3.Name);
String s1=s2.mid(2,8);
if(s1!=null)
{
salesOrderMap.put(s1,s3.Id);
}
}
List<OpportunityLineItem> OppLineItems = new List<OpportunityLineItem>();
for(sObject s4 : scope)
{
ID salesOrderId=salesOrderMap.get(s4.Sales_Order__c);
s4.Order_History__c=salesOrderId;
}
upsert OppLineItems;
}
global void finish(Database.BatchableContext BC)
{
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setToAddresses(new String[]{email});
mail.setReplyTo('[email protected]');
mail.setSenderDisplayName('Batch Processing Completed');
mail.setPlainTextBody('Batch Process has completed');
Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail});
}
}
Please help. Thanks in advance.