2012-02-15 3 views
1

契約の終了日が今日である場合、チャンスとそのラインアイテムを複製する必要があるシナリオがあります。相手の項目にProduct_Family_ というフィールドがあります。私は、ラインアイテムが更新タイプ_cを月ごとに持つ仲間のみをクローンしなければならないでしょう。 私はどのようにoliアイテムをクローンして、新しいアイテムIDをoliアイテムに割り当てることができません。salesforceで案件とそのラインアイテムを計画的に複製

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

あなたは正しい方向を考えていました。ただし、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>とリストを必要とし、マッピング方法で、新しいIDを再利用することができEBに同じ新しい機会を埋めます

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; 

}

+0

MMIX(私はあなたがトラブルそれを解釈を持っている場合、私に知らせて、擬似コードを使用)、私は、私は機会を挿入することができ時点で立ち往生しましたがありませんクローンされた相手のアイテムと新しいOPをどのようにマッピングできるか確かめてください – Prady

+0

リストとマップの両方に追加された単一のオブジェクトインスタンスは、依然として同じオブジェクトです。私は答えを – mmix

+0

ああgr8を更新します!! ..それは意味をなさない:) – Prady

関連する問題