Подключение несвязанных объектов во время запуска Apex - PullRequest
0 голосов
/ 27 февраля 2019

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

  1. После создания учетной записи создайте несвязанную запись (называемую записью «Содержимое портала») с тем же именем,предполагая, что по умолчанию RecordTypeId
  2. взять идентификатор только что созданной записи "Содержимое портала" и вставить ее в поле поиска в первоначально созданной учетной записи
  3. Добавить идентификатор исходной учетной записи ивведите его в поле только что созданной записи «Содержимое портала»

Шаги 1 и 2 были рассмотрены в сообщении Заполнить поле поиска с записью, созданной из триггера .Новая проблема заключается в том, что при попытке использования элемента 3 в блоке кода Trigger.isAfter a.Portal_Content_Record__r возвращает значение NULL, а не значение Id, заполненное после insert p в блоке Trigger.isBefore.

trigger newAccountCreated on Account (before insert, after insert) {

    List<Account> alist = Trigger.New;

    if(Trigger.isBefore){

        for(Account a : alist) {

            if (a.RecordTypeId == '012i0000001Iy1H') {
                Portal_Content__c p = new Portal_Content__c(
                    Name=a.Name,
                    RecordTypeId='012i0000001J1zZ'
                );
                insert p;

                a.Portal_Content_Record__c = p.Id;
                system.debug('Made it to insert p. P = ' + p.Id +'. a.Portal_Content_Record__c = ' + a.Portal_Content_Record__c);                
            }
        }
    }

    if (Trigger.isAfter) {
        for(Account a : alist){
            system.debug('a.Id = ' + a.Id + ', p = ' +a.Portal_Content_Record__r);
            String p = a.Portal_Content_Record__c;
            for(Portal_Content__c port : [SELECT ID FROM Portal_Content__c WHERE Id = :p]){
                port.School_SFDC_ID__c = a.Id;
                update port;
            }
        }
    }
}

Мой вопрос состоит из двух частей:

  1. Как назначить поле во вновь вставленной записи Portal_Content__c с идентификатором учетной записи, которая запустила триггер?
  2. Можно ли это сделать в этомтриггер или нужен вспомогательный «вспомогательный» триггер?

1 Ответ

0 голосов
/ 27 февраля 2019

Мне удалось найти способ ответить на этот вопрос в том же триггере.Кодовый блок Trigger.isAfter && Trigger.isInsert - это то, что решило мою проблему.

trigger newAccountCreated on Account (before insert, after insert, after delete) {

    List<Account> alist = Trigger.New;
    List<Account> oldlist = Trigger.old;

    if(Trigger.isBefore){

        for(Account a : alist) {

            if (a.RecordTypeId == '012i0000001Iy1H') {
                Portal_Content__c p = new Portal_Content__c(
                    Name=a.Name,
                    RecordTypeId='012i0000001J1zZ'
                );
                insert p;

                a.Portal_Content_Record__c = p.Id;
            }
        }
    }
    else if (Trigger.isAfter && Trigger.isDelete){
        for(Account a : oldlist){
            for(Portal_Content__c p : [SELECT ID FROM Portal_Content__c WHERE ID = :a.Portal_Content_Record__c]){
                delete p;
            }
        }

    }

    if (Trigger.isAfter && Trigger.isInsert){
        for(Account a : alist){

            List<Portal_Content__c> plist = [SELECT ID FROM Portal_Content__c WHERE Id = :a.Portal_Content_Record__c];

            for(Portal_Content__c p : plist){
                p.School_SFDC_ID__c = a.Id;
                update p;
            }

        }
    }

}

Этот блок кода выполняет запрос к записям Portal_Contact__c, которые соответствуют значению поля Portal_Content_Record__c записи учетной записи, которое назначено в первом блоке кода.Затем он берет найденные записи Portal_Content__c и назначает исходный идентификатор учетной записи для значения поля School_SFDC_ID__c записи.

...