#salesforce #apex-code
#salesforce #apex-code
Вопрос:
У меня есть пользовательский объект. Существует комбинация полей, таких как month_c, Project_c, contact_c и role_c, которые определяют запись как уникальную.
Я могу написать триггер перед вставкой, чтобы проверить, есть ли какие-либо записи с такой же комбинацией, которые уже существуют. Вопрос, который я хотел задать, был
как я могу остановить вставку? как только я обнаружу, что запись уже есть, ее просто не следует вставлять. ему не нужно выдавать / показывать ошибку.
Спасибо
Пради
Ответ №1:
Хотя другие ответили на этот вопрос лучшими решениями (обычно решения без кода более гибкие для конечных пользователей системы), чтобы остановить вставку конкретной записи, нужно добавить ошибку в поле этой записи.
Например, если бы я вставлял учетные записи, у меня могло бы получиться что-то вроде этого:
for(Account sAcct : trigger.new)
{
if(sAcct.Name == 'DeniedAccount')
{
sAcct.Name.addError('This is a denied account.');
}
}
Другой альтернативой является создание расширяемого класса Exception
, а затем создание нового экземпляра этого класса исключений, это предотвратит обработку всех записей, переданных триггеру, в отличие от конкретных записей.
Ответ №2:
Несколько дней назад я нашел невероятно полезное и простое решение (вForceTree.com статья), которая избавила меня от необходимости писать триггер. Это позволяет объединять поля для проверки уникальности с помощью правила рабочего процесса и пользовательского поля.
Вот пошаговый обзор: http://www.forcetree.com/2010/07/unique-field-combination-in-salesforce.html
Ответ №3:
У меня похожая ситуация в Salesforce. Это обрабатывается путем создания поля, содержащего значение, состоящее из всех значений, необходимых для гарантии уникальности (в вашем случае month_c, Project_c, contact_c и role_c ). Затем вы устанавливаете флажок «Уникальный» для этого поля. Дубликаты теперь будут попадать в корзину.
В моем случае это новое поле заполняется (и загружается в систему Salesforce) внешней программой. В вашем случае вам нужно будет ввести значение в свой триггер. Я думаю, что это более эффективно, чем выполнение запросов SOQL в триггере, но я не проводил никакой проверки, чтобы подтвердить это.