Я новичок в триггерах, и я попытался создать триггер, чтобы предотвратить удаление учетной записи, если:

  1. строковое поле Ninja_store_ID НЕ пустое
  2. логическое поле (флажок) не отмечено (False)

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

Поэтому, если строковое поле пусто, разрешить удаление ИЛИ, если логическое поле равно TRUE, разрешить удаление

Вот демонстрационный триггер:

trigger Demo on account(before delete){ 
     for(Account acc: Trigger.old){ 
         if(Acc.deleted__c != true && Acc.Ninja_Store_Id__c != '' ){ 
             acc.AddError('not able to delete'); 
        } 
    } 
}
0
David Cheng 5 Июл 2021 в 19:39
Привет, не могли бы вы изменить цикл if следующим образом, а затем проверить, получаете ли вы тот же результат. Также проверьте значение флажка по умолчанию, если он установлен или не отмечен. if( !Acc.deleted__c && !String.isBlank(Acc.Ninja_Store_Id__c)) { acc.AddError('не удалось удалить'); }
 – 
Kalpana
5 Июл 2021 в 14:47

1 ответ

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

Прямо сейчас ваш код говорит: «предотвратить удаление (путем добавления ошибки), когда delete__c имеет значение false, а Ninja_Store_Id__c не является пустой строкой».

Пустая строка — это не то же самое, что пустая. Salesforce не сохраняет полностью пустые строки '' в записях SObject (за исключением того, что вместо этого преобразует значение в null. null != '').

Salesforce предоставляет нам String.isBlank() и String.isNotBlank() для обработки таких ситуаций.

Кроме того, <boolean value> == true можно сократить до простого <boolean value>. Точно так же <boolean value> != true можно сократить до !<boolean value>.

Итак, учитывая то, что вы нам рассказали, ваше заявление if должно быть
if(!acc.deleted__c && String.isNotBlank(acc.Ninja_Store_Id__c))

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

  • удалено__с == правда
    • тогда первое условие ложно. false && something = false, поэтому нам не нужно оценивать другое условие
    • не вводите блок if.
    • Удаление разрешено
  • delete__c == false, Магазин ниндзя пуст.
    • мы удовлетворяем первому условию
    • Магазин Ninja пуст, поэтому второе условие приводит к ошибке
    • true && false = false, поэтому мы не входим в блок if
    • Удаление разрешено
  • delete__c == false, магазин ниндзя имеет значение
    • Оба условия выполнены, и мы входим в блок if
    • Удаление не разрешено
1
Derek F 5 Июл 2021 в 15:05
Большое спасибо, кажется, работает отлично, чтобы запустить этот триггер в производство, мне нужно 75% тестового покрытия, что посоветуете?
 – 
Shadi Rabie
5 Июл 2021 в 15:20
Вопросы о написании тестов здесь достаточно распространены, поэтому мы создали несколько вопросов и ответов под тегом canonical-qa. Они расскажут об основах и укажут вам на некоторые хорошие ресурсы (например, предварительные модули по модульному тестированию). Кроме того, если ваша проблема была решена, вы должны принять ответ, который вы считаете наиболее правильным (или помог вам больше всего). Это дает как вам, так и отвечающему очки репутации, а также сигнализирует сообществу, что ваша проблема решена.
 – 
Derek F
5 Июл 2021 в 15:33
Я пытаюсь :) это мой первый пост здесь, спасибо за подсказку и совет! Очень признателен
 – 
Shadi Rabie
5 Июл 2021 в 15:40