2016-01-22 1 views
0

Я хочу добавить кнопку в мою запись заголовка возможности, которая называется Insert Products. Это отправит идентификатор возможности на страницу visualforce, в которой будет кнопка выбора файла и кнопка вставки, которая будет проходить через CSV и вставить записи в соответствующую возможность.Вставить CSV, используя пакет Apex Batch Class Salesforce для OpportunityLineItem

Это для нетехнических пользователей, поэтому использование загрузчика данных не является вариантом.

Я получил эту работу с использованием стандартного класса apex, но попал в лимит, когда загрузил более 1000 записей (что бы происходило регулярно).

Мне нужно преобразовать это в пакетный процесс, однако я не уверен, как это сделать.

Любой, кто может указать мне в правильном направлении? Я понимаю, что партия должна начинать, выполнять и заканчивать. Однако я не уверен, где я должен разделить 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, а затем попробуйте вставить список после цикла FOR?

Это должно привести к некоторому здравому смыслу в вашем коде.

Смежные вопросы