在salesforce中以编程方式克隆机会及其订单项

时间:2012-02-15 06:42:33

标签: salesforce apex-code

我有一个场景,当合约结束日期是今天时,我需要克隆一个机会及其lineitems。 opp订单项包含名为Product_Family_ c的字段。我将不得不克隆那些其lineitems具有续订类型 _c的opp。 我被困在如何克隆oli项目并将新的oppty id分配给oli项目。

   todays=date.today();
    system.debug('todays'+todays);      
    for(opportunity o:[select Auto_Renew__c,Contract_lenght_in_months__c,Contract_End_Date__c,id from opportunity where Auto_Renew__c='Yes' and Contract_End_Date__c =:todays ])
    {
        SetOppId.add(o.id);
        MapOpp.put(o.id,o);
    }
    system.debug('SetOppId'+SetOppId);
    system.debug('MapOpp'+MapOpp);
    for(OpportunityLineItem oli:[select OpportunityId from OpportunityLineItem where Product_Family__c='Monthly' and OpportunityId in :SetOppId])
    {
        SetOppIdtoRenew.add(oli.OpportunityId);
        Mapoli.put(oli.id,oli);

    }
    system.debug('SetOppIdtoRenew'+SetOppIdtoRenew);
    for(id a:SetOppIdtoRenew)
    {
        //MapOpp.get(a).Contract_End_Date__c=MapOpp.get(a).Contract_End_Date__c.addDays(1);
        //MapOpp.get(a).Contract_End_Date__c=MapOpp.get(a).Contract_End_Date__c.addMonths(integer.valueof(MapOpp.get(a).Contract_lenght_in_months__c));
        Lstopp.add(new opportunity(name=MapOpp.get(a).name+' renewal '+string.valueof(date.today()),
                                 Contract_lenght_in_months__c=MapOpp.get(a).Contract_lenght_in_months__c,
                                 Contract_End_Date__c=MapOpp.get(a).Contract_End_Date__c.addMonths(integer.valueof(MapOpp.get(a).Contract_lenght_in_months__c))+1,
                                 StageName=MapOpp.get(a).StageName,
                                 CloseDate=MapOpp.get(a).CloseDate
                            //   ,<fieldname>=MapOpp.get(a).<fieldname>... for all the fields you ned to copy over
                                 ));

    }
    system.debug('Lstopp'+Lstopp);
    insert Lstopp;

1 个答案:

答案 0 :(得分:1)

你正在思考正确的方向。但是,在将OppID分配给行项目之前,必须插入商机。我想这会打破你的事务控制,但你总是可以使用数据库保存点来使整个操作成为原子。

例如:

    SavePoint sp = Database.setSavepoint();
    try {
        upsert newOpportunities;
        // now create line items and assign IDs
    }   
    catch (Exception ex) {
        Database.rollback(sp);      
        // cleanup
    }

为了将旧机会映射到新机会,您需要一个Map<ID, Opportunity>和一个List,并使用相同的新机会填充它们,以便能够以映射方式重用新ID(我使用伪代码,如果你无法解释它,让我知道)

foreach(oldopp) {
   newopp = clone oldopp;
   list.add(newopp);
   map.put(oldopp.id, newopp);
}
upsert list;
// now we have new oppids for cloned items, use them to map

foreach(oldlineitem) {
   newlineitem = clone oldlineitem;
   newlineitem.OpportunityId = map.get(oldlineitem.OpportunityId).Id;
   ...
}
upsert listofnewlineitems;

}