У меня есть дочерний объект оплаты счета (gii__ARInvoicePayment__c), связанный с родительским объектом счета (gii__OrderInvoice__c).

Я создал триггер для дочернего элемента, который обновляет дату платежа в счете-фактуре при отправке полной оплаты.

В родительском элементе есть поле формулы статуса, которое обновляется до «ОПЛАЧЕНО», когда баланс в счете равен нулю. Баланс определяется полем валюты под названием «Итог счета» — сводной суммой поля «Платеж» в дочерних записях (gii__ARInvoicePayment__c). Он не обновляется до «PAID» до тех пор, пока запись gii__ARInvoicePayment__c не будет сохранена, поэтому я думаю, что это заставляет мой триггер не обновлять поле даты платежа в родительском объекте. Есть ли у кого-нибудь предложения о том, как я могу это сделать? Спасибо!

trigger Update_Payment_Date on gii__ARInvoicePayment__c (after insert, after update) {
    List<gii__OrderInvoice__c>lstInvoiceToUpdate = new List<gii__OrderInvoice__c>();
    Map<Id,gii__OrderInvoice__c>invoiceMP;

    for(gii__ARInvoicePayment__c pmt:trigger.new)
    {
        if (pmt.gii__PaymentDate__c != null && pmt.Invoice_Status__c == 'PAID')
        {
            lstInvoiceToUpdate.add(new gii__OrderInvoice__c(Id = pmt.gii__Invoice__c, Paid_Date__c = pmt.gii__PaymentDate__c, gii__PaymentDate__c = pmt.gii__PaymentDate__c));
        }
    }
    update lstInvoiceToUpdate;
}
0
ad_rey 9 Июл 2019 в 23:03
1
Я думаю, было бы более ясно, какова ваша иерархия объектов, если бы вы использовали имена объектов (т.е. Родитель = gii__OrderInvoice__c, Ребенок = gii__ARInvoicePayment__c). Тоже не понятно в чем у вас проблема. Что значит "не работает"? Как это должно работать, и чем это отличается от того, что вы наблюдаете? Вы получаете сообщения об ошибках? Я думаю, нам понадобится эта информация и дополнительная информация о потоке данных/событий, чтобы иметь возможность делать какие-либо предложения. Вы должны отредактировать свой вопрос, чтобы включить эти данные.
 – 
Derek F
9 Июл 2019 в 19:00
Спасибо за ваш отзыв. Я обновил свой пост.
 – 
ad_rey
9 Июл 2019 в 19:11
1
Я все еще думаю, что вам следует расширить порядок событий здесь. Я думаю, вы подразумевали, что Invoice_Status__c является полем формулы, но было бы хорошо, если бы вы явно подтвердили это. Учитывая эту информацию, ответы на следующие вопросы должны помочь вам получить ответ: как ARInvoicePayment оказывается с нулевым балансом (делает ли это человек вручную? правило рабочего процесса? Process Builder? Apex? что-то еще?)? Кто или что устанавливает gii__Payment_Date__c? Может ли быть несколько gii_ARInvoicePayment__c на gii__OrderInvoice__c или есть какое-то бизнес-правило, которое требует, чтобы это было 1: 1?
 – 
Derek F
9 Июл 2019 в 19:21

1 ответ

Судя по вашему описанию модели данных, это порядок выполнения.

Ваш триггер дочернего объекта срабатывает на шаге 7 процесса сохранения дочерних объектов.

Выполняет все после триггеров.

В этот момент поля сводной сводки на родительском объекте еще не обновлены, поскольку это изменение не вступит в силу до шага 16:

Если запись содержит поле сводной сводки или является частью рабочего процесса с несколькими объектами, выполняет вычисления и обновляет поле сводной сводки в родительской записи. Родительская запись проходит процедуру сохранения.

На шаге 16 мы возвращаемся к триггерам обновления родительского объекта, если обновляется сводное поле сводки, но триггеры вашего дочернего объекта уже слишком поздно реагируют на обновление — они уже запущены и уже видели данные на родитель, который до обновления сводных сводных полей.

Решение: перенести эту логику в триггер родительского объекта. Похоже, что вам нужно сделать, когда баланс станет равным нулю, запросить платежи, связанные со счетом-фактурой, и заполнить поля даты платежа последней датой платежа (или просто сегодняшней датой, если это соответствует вашим требованиям).

2
David Reed 9 Июл 2019 в 23:54