Salesforceは、いわゆるセットアップと非設定オブジェクトにオブジェクトを分類します。 Contactは非セットアップオブジェクトですが、Userはセットアップオブジェクトです。 Salesforceは、両方の種類のオブジェクトを同じコンテキストで操作できないようにDML操作を制限します。
この問題の回避策は、documentの末尾に記載されているように、@ futureメソッドと競合するオブジェクトのDMLコードと前の回答を配置することです。
私の場合、別の@futureメソッドを呼び出すUpdateトリガーがあり、Salesforceは別の@futureメソッドから@futureメソッドを呼び出すことができないため、@futureメソッドを使用しても機能しませんでした。
私はUserオブジェクトのいくつかのケースで動作する別の回避策を考え出しました。
APIバージョン15.0より、Salesforceは実際には、非設定オブジェクトの更新を使用して同じコンテキストでUserオブジェクトのカスタムフィールドを更新することができます。したがって、ユーザーの標準フィールドを更新する必要がある場合は、Userオブジェクトで 'before update'トリガーを持つカスタムプロキシフィールドを使用できます。
あなたは、ユーザーののisActiveフィールドを変更するには、ユーザーにカスタムIsActiveProxyフィールドを追加し、それをトリガーに、あなたの更新を実行する必要がある場合:
trigger UpdateContactTrigger on Contact (after update) {
User u = [SELECT Id, IsActive FROM User WHERE IsActive = true];
u.IsActiveProxy__c = false;
update u;
}
は、ユーザーの「更新前の」トリガーを作成していますプロキシフィールドの値を標準フィールドにコピーします。
trigger BeforeUpdateUserTrigger on User (before update) {
for(User user : trigger.new) {
if(user.IsActive != user.IsActiveProxy__c) {
user.IsActive = user.IsActiveProxy__c;
}
}
}
これだけです!それは私のために働いた。
はい私はこの方法を試しましたが、 '@future'メソッドを呼び出し、別の '@future'メソッドから '@future'メソッドを呼び出すトリガがユーザーにあるため、私のためには機能しませんSalesforce。私は問題を解決する別の回避策を見つけました。後で回答として投稿します。返信ありがとう! –