Salesforce.com - недопустимое изменение количества позиции позиции - PullRequest
0 голосов
/ 08 октября 2011

Эта ошибка мучает меня уже две недели. Я новичок в Apex, так что это может быть легко.

У меня есть триггер на Обновление после возможности.

trigger triggerOpportunityCloseInstallDateChange on Opportunity (after update) 
{ 
    if(!Validator_cls.IsOpportunityScheduleUpdated())
    {
        Validator_cls.SetOpportunityScheduleUpdatedDone();
        OpportunitySchedule.BuildScheduleAndUpdateDates(trigger.new, true);
    }
}

У меня есть обертка, чтобы он вызывался только один раз за обновление.

Когда этот триггер срабатывает, предполагается обновить дату графика для отдельных позиций, что, в свою очередь, обновит расписание позиций.

public static void BuildScheduleAndUpdateDates(List<Opportunity> OpportunityList, Boolean DoUpdateItems) 
{
    system.debug('***********OpportunitySchedule             : BuildScheduleAndUpdateDates HIT');
    Map<String, Opportunity> OppMap =  new Map<String, Opportunity>();
    List<OpportunityLineItem> ItemsToUpdate = new List<OpportunityLineItem>(); 
    List<String> IdList = new List<String>();

    for (Integer i = 0; i < OpportunityList.size(); i++)
    {
        IdList.add(OpportunityList[i].Id);
        OppMap.put(OpportunityList[i].Id, OpportunityList[i]);
    }

    List<OpportunityLineItem> lineItems = [Select o.Id, (Select OpportunityLineItemId From OpportunityLineItemSchedules), o.Opportunity.Id, o.Systems_Add_On__c, o.ServiceDate, o.Product_Family__c, o.Schedule_Length__c , o.Monthly_Quantity__c, o.Monthly_Amount__c, o.Quantity
                                            From OpportunityLineItem o
                                            where o.Opportunity.Id in:IdList];

        for (OpportunityLineItem item : lineItems)
        {   
            Opportunity opp_new = OppMap.get(item.Opportunity.Id);

            Boolean hasSchedule = OpportunityProductLineItems.DoesLineItemHaveSchedule(item.Id);

            if (opp_new.Term_Conversion__c != null)
            {   
                item.ServiceDate = opp_new.CloseDate;
            }
            else
            {
                if(item.Product_Family__c == 'Systems')
                {
                    if(item.Systems_Add_On__c == true)
                    {
                        item.ServiceDate = opp_new.Install_Date__c;
                        system.debug('***********BuildScheduleAndUpdateDates     : Systems With Systems Add On ' + item.ServiceDate);
                    }
                    else
                    {
                        item.ServiceDate = opp_new.Install_Date__c.addDays(30); 
                        system.debug('***********BuildScheduleAndUpdateDates     : Systems With NO Systems Add On ' + item.ServiceDate);
                    }
                }
                else if(hasSchedule)
                {
                    item.ServiceDate = opp_new.Install_Date__c.addDays(30); 
                    system.debug('***********BuildScheduleAndUpdateDates     : Has Schedule ' + item.ServiceDate);
                }
                else
                {
                    item.ServiceDate = opp_new.Install_Date__c;
                    system.debug('***********BuildScheduleAndUpdateDates     : No Schedule ' + item.ServiceDate);
                }
            }

            //item.Quantity = 1;
            ItemsToUpdate.add(item);
            if(hasSchedule && !DoUpdateItems)
            {
                ProcessSchedule(item);
            }
        } 

    if(DoUpdateItems)
    {
        update ItemsToUpdate;
    }    
    upsert schedulesToUpsert;

}

Когда я обновляю возможность, я получаю эту ошибку:

Error: Invalid Data. 
Review all error messages below to correct your data.
Apex trigger triggerOpportunityCloseInstallDateChange caused an unexpected exception, contact your administrator: triggerOpportunityCloseInstallDateChange: execution of AfterUpdate caused by: System.DmlException: Update failed. First exception on row 0 with id 00kV0000002cHhTIAU; first error: FIELD_INTEGRITY_EXCEPTION, field integrity exception: unknown (invalid quantity change on opportunity line item): [unknown]: Class.OpportunitySchedule.BuildScheduleAndUpdateDates: line 68, column 1

Эта ошибка соответствует этой строке

update ItemsToUpdate;

Как вы можете видеть выше, я не изменяю количество в этой позиции. Я весьма озадачен. Если я закомментирую эту строку, все будет нормально (расписание составлено и обновлено).

Я даже ввел item.Quantity = 1;, чтобы посмотреть, смогу ли я установить количество вручную.

Что означает эта ошибка и как ее устранить?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2011

Попробуйте это:

OppMap.put(OpportunityList[i].Id, OpportunityList[i].clone(true, true));

Первое «true» в вызове clone сохраняет идентификаторы ваших объектов sObjects, а второе указывает клону выполнить глубокое копирование, устраняя проблему с помощью ссылки.

[Изменить]

Перечитав ваш пост я понял, что это может не решить вашу проблему - извините! Но трюк с глубоким клоном помогает справиться с этой проблемой. Удачи.

0 голосов
/ 14 октября 2011

Ошибка, которую вы получаете, обычно связана с какими-то специальными полями, которые Salesforce необходимо синхронизировать на серверной части. Например, эта ошибка возникнет, если вы добавите позицию с ценой, отличной от той, которая установлена ​​для возможности.

В этом случае это, вероятно, связано с тем, что какая-то внешняя сила изменяет количество, или, возможно, в записях графика, полагаясь на то, что количество отдельной позиции является конкретным значением.

Для внешней силы, изменяющей количество, я бы попытался поместить оператор отладки до и после вашего вызова на ProcessSchedule(item). Так как объекты SObject передаются в функции по ссылке , возможно, что эта функция изменяет item, даже если вы этого не понимаете.

Трудно сказать точно, в чем может быть проблема, не зная другого кода, но, надеюсь, это поможет вам в правильном направлении!

...