function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
FMKTFMKT 

特定の項目の値が変更されたときのみ動作するトリガについて

所有者が変更されたときのみ動作するトリガを書きましたが、うまく動いてくれません。

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 となってしまい、
更新する処理が動いてくれません。

この問題を回避する方法を教えていただけないでしょうか。
よろしくお願いいたします。

 
Best Answer chosen by FMKT
ikouikou
oldは更新前のListで、newは所有者変更された後のListなので、SOQLでListを取得する必要はありません。
SOQLで取得してしまうと、当然ながら同じ値になってしまいます。

SOQLで取得している2行を削除すれば、想定通りに動くと思われます。

All Answers

FMKTFMKT
訂正があります。
下から4行目
誤)となっており、oldとnewを分けずにどちらもTrigger.newのOwnerIdを取得しているようです。
正)となっており、oldとnewを分けずにどちらもTrigger.oldのOwnerIdを取得しているようです。
FMKTFMKT
after update に変えたところ、
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の値を取得するようになりました。
うまくいきません・・・
ikouikou
oldは更新前のListで、newは所有者変更された後のListなので、SOQLでListを取得する必要はありません。
SOQLで取得してしまうと、当然ながら同じ値になってしまいます。

SOQLで取得している2行を削除すれば、想定通りに動くと思われます。
This was selected as the best answer
FMKTFMKT
自己解決しました。
下記のようにfor文二重にすればうまくいきました。
for(Account a:Trigger.old){
				for(Account b:Trigger.new){
		        	system.debug('◆◆◆oldAcc.OwnerId◆◆◆' + a.OwnerId);
		        	system.debug('◆◆◆newAcc.OwnerId◆◆◆' + b.OwnerId);
					if(a.OwnerId != b.OwnerId){
                                        //更新する処理
					}
				}
FMKTFMKT
ikouさん、ありがとうございます。SOQLの2行を削除した場合、
 if(oldAcc[0].OwnerId != newAcc[0].OwnerId){
はどのように書けばよいのでしょうか?
FMKTFMKT
if(Trigger.Old[0].OwnerId != Trigger.New[0].OwnerId){
でうまくいきました。
どうもありがとうございました。
FMKTFMKT
for文も必要ないですね。