2016-01-22 25 views
0

我想将一个按钮添加到名为“插入产品”的机会标题记录中。这会将机会ID发送到一个visualforce页面,该页面将有一个选择文件按钮和一个插入按钮,该按钮将循环显示CSV并将记录插入相关机会。使用Apex批次类Salesforce for OpportunityLineItem插入CSV

这是非技术用户使用数据加载器不是一个选项。

我得到了这个使用标准apex类的工作,但是当我加载超过1,000条记录(这将定期发生)时达到了极限。

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

任何一个能够指向正确的方向?我知道一批应该有一个开始,执行和完成。但是我不知道我应该在哪里拆分csv以及在哪里读取和加载?

我发现这个链接,我可以不知道如何翻译成我的要求:http://developer.financialforce.com/customizations/importing-large-csv-files-via-batch-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); 
     } 
    } 
} 

回答

0

我能感觉到的第一个问题是插入DML语句是在FOR循环中。你可以把新的“oLiObj”放到FOR循环开始之前声明的List中,然后尝试在FOR循环之后插入列表吗?

它应该为您的代码带来更多的理智。