在Apex触发期间连接不相关的对象

时间:2019-02-26 22:59:40

标签: triggers salesforce apex apex-code

我正在尝试创建一个执行以下操作的触发器:

  1. 创建帐户后,使用默认的RecordTypeId创建一个不相关的记录(称为“门户内容”记录),该记录具有相同的名称
  2. 获取新创建的“门户内容”记录的ID,并将其插入到最初创建的“帐户”上的查找字段中。
  3. 添加原始帐户的ID,并将其输入到新创建的“门户内容”记录的字段中

第1步和第2步在帖子Populate Lookup Field with Record Created From Trigger中进行了介绍。新问题是,在尝试{3}时,在Trigger.isAfter代码块中,a.Portal_Content_Record__r返回null,而不是insert p块中Trigger.isBefore之后填充的Id值。 / p>

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记录上为启动触发器的帐户的ID分配一个字段?
  2. 可以在此触发器内完成此操作,还是需要辅助“辅助”触发器?

1 个答案:

答案 0 :(得分:0)

我能够找到在同一触发器中回答此问题的方法。 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_Content_Record__c字段值相匹配的Portal_Contact__c记录进行查询。然后,它将获取找到的Portal_Content__c记录,并将原始帐户的ID分配给记录的School_SFDC_ID__c字段值。