使用Apex批处理类Salesforce为OpportunityLineItem插入CSV

使用Apex批处理类Salesforce为OpportunityLineItem插入CSV,salesforce,visualforce,apex,Salesforce,Visualforce,Apex,我想在我的opportunity header记录中添加一个名为Insert Products的按钮。这将把opportunity ID发送到visualforce页面,该页面将有一个选择文件按钮和一个插入按钮,该按钮将循环通过CSV并将记录插入到相关opportunity 这是为非技术用户提供的,因此不能选择使用数据加载器 我使用标准的apex类实现了这一点,但是当我加载超过1000条记录时(这是经常发生的)达到了一个极限 我需要将其转换为一个批处理过程,但我不知道如何做到这一点 有人能给我指

我想在我的opportunity header记录中添加一个名为Insert Products的按钮。这将把opportunity ID发送到visualforce页面,该页面将有一个选择文件按钮和一个插入按钮,该按钮将循环通过CSV并将记录插入到相关opportunity

这是为非技术用户提供的,因此不能选择使用数据加载器

我使用标准的apex类实现了这一点,但是当我加载超过1000条记录时(这是经常发生的)达到了一个极限

我需要将其转换为一个批处理过程,但我不知道如何做到这一点

有人能给我指出正确的方向吗?我理解批处理应该有开始、执行和结束。但是,我不确定应该将csv拆分到哪里,以及在哪里读取和加载

我发现了这个链接,但我无法将其转化为我的需求:

下面是我为标准apex类编写的代码,它可以正常工作

public class importOppLinesController {
public List<OpportunityLineItem> oLiObj {get;set;}
public String recOppId {
        get;
        // *** setter is NOT being called ***
        set {
            recOppId = value;
            System.debug('value: '+value);
        }
    }
public Blob csvFileBody{get;set;}
public string csvAsString{get;set;}
public String[] csvFileLines{get;set;}

public List<OpportunityLineItem> oppLine{get;set;}
  public importOppLinesController(){
    csvFileLines = new String[]{};
    oppLine = New List<OpportunityLineItem>();
  }
  public void importCSVFile(){

       PricebookEntry pbeId;
       String unitPrice = '';

       try{
           csvAsString = csvFileBody.toString();
           csvFileLines = csvAsString.split('\n');

           for(Integer i=1;i<csvFileLines.size();i++){
               OpportunityLineItem oLiObj = new OpportunityLineItem() ;
               string[] csvRecordData = csvFileLines[i].split(',');

               String pbeCode = csvRecordData[0];
                pbeId = [SELECT Id FROM PricebookEntry WHERE ProductCode = :pbeCode AND Pricebook2Id = 'xxxx HardCodedValue xxxx'][0];                  

                oLiObj.PricebookEntryId = pbeId.Id;

               oLiObj.Quantity = Decimal.valueOf(csvRecordData[1]) ;
               unitPrice = String.valueOf(csvRecordData[2]);
               oLiObj.UnitPrice =  Decimal.valueOf(unitPrice);

               oLiObj.OpportunityId = 'recOppId';;
               insert (oLiObj);
           }
        }
        catch (Exception e)
        {

             ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, e + ' - ' + unitPrice);

            ApexPages.addMessage(errorMessage);
        }
  }
}
公共类导入TopplinesController{
公共列表oLiObj{get;set;}
公共字符串recOppId{
得到;
//***未调用setter***
设置{
recOppId=值;
System.debug('值:'+值);
}
}
公共Blob csvFileBody{get;set;}
公共字符串csvAsString{get;set;}
公共字符串[]csvFileLines{get;set;}
公共列表行{get;set;}
公共导入TopplinesController(){
csvFileLines=新字符串[]{};
oppLine=新列表();
}
public void导入文件(){
PricebookEntry pbeId;
字符串单价=“”;
试一试{
csvAsString=csvFileBody.toString();
csvFileLines=csvAsString.split('\n');

for(Integer i=1;i我能感觉到的第一个问题是insert DML语句在for循环中。能否将新的“oLiObj”放入在for循环开始之前声明的列表中,然后尝试在for循环之后插入该列表

它应该会让你的代码更加健全