Триггеры Salesforce Apex — как проверить, включено ли поле в триггер обновления?

Я был бы очень признателен, если бы кто-нибудь помог мне проверить, включено ли конкретное поле в вызов обновления внутри триггера обновления до/после. Большое спасибо.


person Mustafa Turab Ali    schedule 05.04.2011    source источник


Ответы (2)


Все поля всегда присутствуют в триггере, независимо от того, являются ли они грязными или нет. Чтобы убедиться, что конкретное поле было изменено, вы должны получить предыдущую версию строки, используя карту oldMap, которая является Map<ID, sObject>, и сравнить значения в старом и новый. Например

trigger CaseOnParticularFieldUpdate on Case (before update) {
    for (Case c: Trigger.new) {
        Case oldCase = Trigger.oldMap.get(c.ID);
        if (c.Field != oldCase.Field) {
            // field was updated, do some magic here
        }
    }
}
person mmix    schedule 05.04.2011
comment
спасибо, я знаю, как проверить, изменены ли данные поля. однако мой вопрос связан с этим сценарием. Список‹Учетная запись› aclist = [выберите идентификатор, имя, адрес электронной почты__c из учетной записи]; for(Account a : aclist) { a.email__c = a.name+'@gmail.com'; } обновить aclist; теперь, что произойдет, когда этот триггер запустится: триггер для учетной записи (до обновления) { for(Account a : trigger.new) { if(a.accountNumber==null) { a.accountnumber='NA'; } } } будут ли изменены поля accountnumber для обновляемых аккаунтов? - person Mustafa Turab Ali; 06.04.2011
comment
да. Как я уже сказал, триггер включает ВСЕ поля sObject. Это не похоже на расширение visualforce/apex, которое только предварительно загружает поля, на которые есть ссылки в VF. - person mmix; 06.04.2011

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

Надеюсь, это поможет вам.

person Promila    schedule 12.05.2014