在salesforce中以编程方式克隆商机及其行项目

在salesforce中以编程方式克隆商机及其行项目,salesforce,apex-code,Salesforce,Apex Code,我有一个场景,当合同结束日期为今天时,我需要克隆opportunity及其行项目。opp行项目具有名为Product_Family_c的字段。我只需要克隆那些行项目每月更新类型为c的opp。 我被困在如何克隆oli项目并将新的oppty ID分配给oli项目上 todays=date.today(); system.debug('todays'+todays); for(opportunity o:[select Auto_Renew__c,Contract_l

我有一个场景,当合同结束日期为今天时,我需要克隆opportunity及其行项目。opp行项目具有名为Product_Family_c的字段。我只需要克隆那些行项目每月更新类型为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;
todays=date.today();
系统调试(“今天”+今天);
对于(opportunity o:[选择Auto_Renew______c,合同长度_in_months____c,合同结束_日期__c,来自opportunity的id,其中Auto_Renew_c='Yes'和合同结束_日期__c=:todays])
{
SetOppId.add(o.id);
MapOpp.put(o.id,o);
}
系统调试('SetOppId'+SetOppId);
系统调试('MapOpp'+MapOpp);
对于(OpportunityLineItem oli:[从OpportunityLineItem中选择OpportunityId,其中Product\u Family\u c='Monthly'和OpportunityId位于:SetOppId])
{
SetOppIdtoRenew.add(oli.OpportunityId);
Mapoli.put(oli.id,oli);
}
系统调试('SetOppIdtoRenew'+SetOppIdtoRenew);
对于(id a:SetOppIdtoRenew)
{
//MapOpp.get(a).合同结束日期=MapOpp.get(a).合同结束日期添加天数(1);
//MapOpp.get(a).Contract_End_Date_uuc=MapOpp.get(a).Contract_End_Date_uc.addMonths(整型.valueof(MapOpp.get(a).Contract_length_in_months_uc));
Lstopp.add(新opportunity(name=MapOpp.get(a).name+'renewal'+string.valueof(date.today()),
合同期限(月)c=MapOpp.get(a)。合同期限(月)c,
合同结束日期=MapOpp.get(a)。合同结束日期添加月数(整数值(MapOpp.get(a)。合同长度以月数为单位)+1,
StageName=MapOpp.get(a).StageName,
CloseDate=MapOpp.get(a).CloseDate
//,=MapOpp.get(a)…对于所有需要复制的字段
));
}
系统调试('lstop'+lstop);
插入Lstopp;

您的思路是正确的。但是,在将OppID分配给行项目之前,必须插入opportunity。我想这会破坏事务控制,但您可以始终使用数据库保存点使整个操作原子化

例如:

    SavePoint sp = Database.setSavepoint();
    try {
        upsert newOpportunities;
        // now create line items and assign IDs
    }   
    catch (Exception ex) {
        Database.rollback(sp);      
        // cleanup
    }
为了将旧的机会映射到新的机会,您需要一个
map
和一个列表,并用相同的新机会填充它们,以便能够以映射方式重用新ID(我使用了伪代码,如果您在解释它时遇到困难,请告诉我)


}

你的思路是正确的。但是,在将OppID分配给行项目之前,必须插入opportunity。我想这会破坏事务控制,但您可以始终使用数据库保存点使整个操作原子化

例如:

    SavePoint sp = Database.setSavepoint();
    try {
        upsert newOpportunities;
        // now create line items and assign IDs
    }   
    catch (Exception ex) {
        Database.rollback(sp);      
        // cleanup
    }
为了将旧的机会映射到新的机会,您需要一个
map
和一个列表,并用相同的新机会填充它们,以便能够以映射方式重用新ID(我使用了伪代码,如果您在解释它时遇到困难,请告诉我)


}

mmix,我被困在了可以插入Opportunity的位置,但不确定如何将新opp映射到克隆的oppline项目。一个添加到列表中的singlee对象实例,映射仍然是同一个对象。我会更新答案哦gr8!!。。这是有道理的:)mmix,我被困在了可以插入Opportunity的位置,但不确定如何将新的opp映射到克隆的oppline项目。一个singlee对象实例添加到列表中,而映射仍然是同一个对象。我会更新答案哦gr8!!。。这是有道理的:)