在 Apex 触发器期间连接不相关的对象
Connecting Unrelated Objects during Apex Trigger
我正在尝试创建一个执行以下操作的触发器:
- 创建帐户后,创建一个具有相同名称的不相关记录(称为 "Portal Content" 记录),假定默认 RecordTypeId
- 获取新创建的 "Portal Content" 记录的 ID,并将其插入到最初创建的帐户的查找字段中
- 添加原Account的ID,并将其输入到新创建的"Portal Content"记录的字段中
第 1 步和第 2 步已在 post 中解决。新问题是,当尝试第 3 项时,在 Trigger.isAfter
代码块中,a.Portal_Content_Record__r
returns 为 null 而不是在 Trigger.isBefore
中 insert p
之后填充的 Id 值]块。
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;
}
}
}
}
我的问题分为两部分:
- 如何在新插入的 Portal_Content__c 记录上分配一个字段,其中包含启动触发器的帐户 ID?
- 可以在此触发器内完成,还是需要辅助 "helper" 触发器?
我找到了在同一个触发器中解决这个问题的方法。 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
字段值。
我正在尝试创建一个执行以下操作的触发器:
- 创建帐户后,创建一个具有相同名称的不相关记录(称为 "Portal Content" 记录),假定默认 RecordTypeId
- 获取新创建的 "Portal Content" 记录的 ID,并将其插入到最初创建的帐户的查找字段中
- 添加原Account的ID,并将其输入到新创建的"Portal Content"记录的字段中
第 1 步和第 2 步已在 post Trigger.isAfter
代码块中,a.Portal_Content_Record__r
returns 为 null 而不是在 Trigger.isBefore
中 insert p
之后填充的 Id 值]块。
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;
}
}
}
}
我的问题分为两部分:
- 如何在新插入的 Portal_Content__c 记录上分配一个字段,其中包含启动触发器的帐户 ID?
- 可以在此触发器内完成,还是需要辅助 "helper" 触发器?
我找到了在同一个触发器中解决这个问题的方法。 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
字段值。