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

У меня есть пользовательский объект. Существует комбинация полей, таких как месяц_c, проект_c, контакт_c и роль_c, которые определяют уникальность записи.

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

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

Спасибо

Пради


person Prady    schedule 10.11.2011    source источник


Ответы (3)


Хотя другие ответили на это лучшими решениями (как правило, решения без кода более гибки для конечных пользователей системы), ответ, чтобы остановить вставку конкретной записи, состоит в том, чтобы добавить ошибку в поле этой записи.

Например, если бы я вставлял учетные записи, у меня могло бы быть что-то вроде этого:

for(Account sAcct : trigger.new)
{
    if(sAcct.Name == 'DeniedAccount')
    {
        sAcct.Name.addError('This is a denied account.');
    }
}

Другой альтернативой является создание класса, расширяющего Exception, а затем создание нового экземпляра этого класса исключений. Это предотвратит обработку всех записей, переданных триггеру, в отличие от конкретных записей.

person Matt Lacey    schedule 22.11.2011

Несколько дней назад я нашел невероятно полезное и простое решение (в статье ForceTree.com), которое избавило меня от необходимости писать триггер. Он позволяет комбинировать поля для проверки уникальности с помощью правила рабочего процесса и настраиваемого поля.

Вот пошаговая инструкция: http://www.forcetree.com/2010/07/unique-field-combination-in-salesforce.html

person Matt K    schedule 10.11.2011

У меня похожая ситуация в Salesforce. Это обрабатывается путем создания поля, содержащего значение, состоящее из всех значений, необходимых для гарантии уникальности (в вашем случае, month_c, Project_c, contact_c и role_c). Затем вы устанавливаете флажок «Уникальный» для этого поля. Дубликаты теперь попадут в корзину.

В моем случае это новое поле заполняется (и передается в Salesforce) внешней программой. В вашем случае вам нужно будет заполнить значение в вашем триггере. Я думаю, что это более эффективно, чем выполнение запросов SOQL в триггере, но я не проводил никаких проверок, чтобы подтвердить это.

person Jagular    schedule 10.11.2011