Мне любопытно, каковы правила использования оператора обновления в триггере перед вставкой.

Приведенный ниже код вызывается во время триггера перед вставкой для задач. По сути, я говорю: «Эй, есть новая задача, связанная с этой возможностью. Давайте проверим, есть ли какие-либо другие открытые задачи, связанные с этим противником. Если они есть, давайте закроем их».

public with sharing class NextStepDueDateTask 
{

    public static void handleTrigger(List<Task> newTasks) {

        Set<Id> OppIds = new Set<Id>();

        for(Task t: newTasks)
        {   
            // Grab all tasks that are related to Opportunities and are Open
            String s1 = t.WhatId != null ? String.valueof(t.WhatId) : '';  
            if(s1.startsWith('006') && t.status == 'Open')
            {
                OppIds.add(oppId);
            }
        }

        List<Opportunity> Opps = [ SELECT id, (SELECT id, status from Tasks WHERE status = 'open' ) from Opportunity where id in :OppIds ];

        set<Task> tasksToUpdate = new List<Task>();

        for(Opportunity opp : Opps)
        {
            if(opp.Tasks != null)
            {
                for( Task t : opp.Tasks  )
                {
                    t.Status = 'Completed';
                    tasksToUpdate.add(t);
                }
            }
        }

        update tasksToUpdate;
    }
0
Matthew Metros 15 Авг 2019 в 22:13

1 ответ

Логика кросс-объектов определенно принадлежит последующему контексту. См. Триггеры< /сильный>:

Существует два типа триггеров:

  • Триггеры «До» используются для обновления или проверки значений записей перед их сохранением в базе данных.
  • Триггеры After используются для доступа к значениям полей, заданным системой (например, поле Id записи или поле LastModifiedDate), а также для воздействия на изменения в других записях, например для входа в таблицу аудита или запуска асинхронных события с очередью. Записи, запускающие триггер after, доступны только для чтения.

Опять таки,

После использования триггеров... для воздействия на изменения в других записях

Если вы хотите обновить одноуровневые записи, сделайте это с помощью триггера after. Если вы хотите просто обновить записи, которые ищут Opportunity, которые действительно принадлежат контексту before, но не должны вызывать какие-либо операторы DML и фактически даже не требуют запросов.

for (Task record : newTasks)
{
    if (record.WhatId != null && record.WhatId.getSObjectType() == Opportunity.sObjectType)
    {
        record.Status = 'Completed';
    }
}
2
Community 15 Июн 2020 в 11:11
Нит: record.WhatId.getSObjectType сб record.WhatId.getSObjectType()
 – 
cropredy
16 Авг 2019 в 01:04
И двойной == ой!
 – 
Adrian Larson
16 Авг 2019 в 01:13