Предотвращение дублирования записей в пользовательском объекте

#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 в триггере, но я не проводил никакой проверки, чтобы подтвердить это.