You need to sign in to do that
Don't have an account?
FMKT
特定の項目の値が変更されたときのみ動作するトリガについて
所有者が変更されたときのみ動作するトリガを書きましたが、うまく動いてくれません。
trigger AccountTrigger on Account (before update) {
if (Trigger.isUpdate) {
List<Account> oldAcc = [Select Id, OwnerId from Account where Id IN : Trigger.old];
List<Account> newAcc = [Select Id, OwnerId from Account where Id IN : Trigger.new];
system.debug('◆◆◆oldAcc◆◆◆' + oldAcc);
system.debug('◆◆◆newAcc◆◆◆' + newAcc);
if(oldAcc[0].OwnerId != newAcc[0].OwnerId){
//更新する処理
}
}
}
これを実行してデバッグログを見ると、
[56]|Aggregations:0|select Id, OwnerId from Account where Id IN :tmpVar1
[56]|Rows:1
[57]|Aggregations:0|select Id, OwnerId from Account where Id IN :tmpVar1
[57]|Rows:1
[58]|DEBUG|◆◆◆oldAcc◆◆◆(Account:{OwnerId=005************IAK, Id=a22************IAQ})
[59]|DEBUG|◆◆◆newAcc◆◆◆(Account:{OwnerId=005************IAK, Id=a22************IAQ})
となっており、oldとnewを分けずにどちらもTrigger.newのOwnerIdを取得しているようです。
このため、毎回 oldAcc[0].OwnerId == newAcc[0].OwnerId となってしまい、
更新する処理が動いてくれません。
この問題を回避する方法を教えていただけないでしょうか。
よろしくお願いいたします。
trigger AccountTrigger on Account (before update) {
if (Trigger.isUpdate) {
List<Account> oldAcc = [Select Id, OwnerId from Account where Id IN : Trigger.old];
List<Account> newAcc = [Select Id, OwnerId from Account where Id IN : Trigger.new];
system.debug('◆◆◆oldAcc◆◆◆' + oldAcc);
system.debug('◆◆◆newAcc◆◆◆' + newAcc);
if(oldAcc[0].OwnerId != newAcc[0].OwnerId){
//更新する処理
}
}
}
これを実行してデバッグログを見ると、
[56]|Aggregations:0|select Id, OwnerId from Account where Id IN :tmpVar1
[56]|Rows:1
[57]|Aggregations:0|select Id, OwnerId from Account where Id IN :tmpVar1
[57]|Rows:1
[58]|DEBUG|◆◆◆oldAcc◆◆◆(Account:{OwnerId=005************IAK, Id=a22************IAQ})
[59]|DEBUG|◆◆◆newAcc◆◆◆(Account:{OwnerId=005************IAK, Id=a22************IAQ})
となっており、oldとnewを分けずにどちらもTrigger.newのOwnerIdを取得しているようです。
このため、毎回 oldAcc[0].OwnerId == newAcc[0].OwnerId となってしまい、
更新する処理が動いてくれません。
この問題を回避する方法を教えていただけないでしょうか。
よろしくお願いいたします。
SOQLで取得してしまうと、当然ながら同じ値になってしまいます。
SOQLで取得している2行を削除すれば、想定通りに動くと思われます。
All Answers
下から4行目
誤)となっており、oldとnewを分けずにどちらもTrigger.newのOwnerIdを取得しているようです。
正)となっており、oldとnewを分けずにどちらもTrigger.oldのOwnerIdを取得しているようです。
List<Account> oldAcc = [Select Id, OwnerId from Account where Id IN : Trigger.old];
List<Account> newAcc = [Select Id, OwnerId from Account where Id IN : Trigger.new];
とも、Trigger.newの値を取得するようになりました。
うまくいきません・・・
SOQLで取得してしまうと、当然ながら同じ値になってしまいます。
SOQLで取得している2行を削除すれば、想定通りに動くと思われます。
下記のようにfor文二重にすればうまくいきました。
if(oldAcc[0].OwnerId != newAcc[0].OwnerId){
はどのように書けばよいのでしょうか?
でうまくいきました。
どうもありがとうございました。