【问题标题】:Insert CSV using Apex Batch Class Salesforce for OpportunityLineItem使用 Apex 批处理类 Salesforce 为 OpportunityLineItem 插入 CSV
【发布时间】:2016-01-22 07:03:40
【问题描述】:

我想在我的机会标题记录中添加一个名为“插入产品”的按钮。这会将机会 ID 发送到具有选择文件按钮和插入按钮的 visualforce 页面,该按钮将循环通过 CSV 并将记录插入相关机会。

这适用于非技术用户,因此不能使用数据加载器。

我使用标准 apex 类实现了这项工作,但是当我加载超过 1,000 条记录时达到了限制(这会定期发生)。

我需要将其转换为批处理,但不确定如何执行此操作。

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

我找到了这个链接,但我不知道如何将其转化为我的要求:http://developer.financialforce.com/customizations/importing-large-csv-files-via-batch-apex/

这是我为标准 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);
        }
  }
}

【问题讨论】:

    标签: salesforce visualforce apex


    【解决方案1】:

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

    它应该使您的代码更加理智。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多