2017-02-23 11 views
0

私は、次のバッチを実行していると私は、forループの内側にクエリを作っていますが、ここでのクエリです:Salesforceのバッチ知事リミット

lgm=[select Group.Name, group.type,group.id, group.ownerID from GroupMember where UserOrGroupId =: u.id]; 

バッチは組織内のすべてのユーザーにループしている、となりますそのアクセス権セット、彼が割り当てられている公開グループとキュー、そのユーザーの名前とIDを入力し、ConsolidatedUserというカスタムオブジェクトにそれらの情報を入力します。

まだ大量のバッチを実行していませんガバナーの限度額に達していて、あなたの意見が欲しいと思っていたら、バッチが正常に動作するようになりました。 バッチ内のトランザクションごとにいくつのsoqlクエリが許可されているかを尋ねることができます。これにより、矛盾がないことを確認できます。 ここは私のコードです。ありがとうございます。

global class TDTRMIS_GetUserDetails implements Database.Batchable<sObject>, Database.Stateful { 

global string UserPermissionSets=''; 
global string UserGroups=''; 
global string UserQueues=''; 
global integer i; 

    global Database.QueryLocator start(Database.BatchableContext bc) { 
     return Database.getQueryLocator(
      'SELECT Id, name, (select PermissionSet.Name, AssigneeId FROM PermissionSetAssignments) from user' 
     ); 
    } 

    global void execute(Database.BatchableContext bc, List<User> scope){ 
     // process each batch of records 

       // process each batch of records 

     List<ConsolidatedUser__c> lcu = new List<ConsolidatedUser__c>(); 
     list<GroupMember> lgm= new list<GroupMember>(); 
     for (User u : scope) 
     { 


      ConsolidatedUser__c cu= new ConsolidatedUser__c(); 
      lgm=[select Group.Name, group.type,group.id, group.ownerID from GroupMember where UserOrGroupId =: u.id]; 


      for(PermissionSetAssignment ps : u.PermissionSetAssignments) 
       { 
       UserPermissionSets=UserPermissionSets+ps.PermissionSet.name+'|';   
       } 


      for(GroupMember gm : lgm) 
      { 

       if(gm.group.type=='Regular') 
       { 
       UserGroups=UserGroups+gm.group.Name+'|'; 
       } 

       else if(gm.group.type=='Queue') 
       { 
       UserQueues=UserQueues+gm.group.Name+'|'; 
       } 

      } 


      cu.PermSet__c=UserPermissionSets ; 
      cu.PublicGroupList__c=UserGroups; 
      cu.QueueGroupList__c= UserQueues; 
      cu.User_Lookup__c=u.id;  
      cu.name=u.name; 
      lcu.add(cu); 
     } 

    try{ 
    upsert lcu; 
    } 

    catch(exception e) 
    { 
    system.debug(e); 
    } 

    } 

    global void finish(Database.BatchableContext bc){ 

    //to be added later 

    }  

} 
+0

答えは見つかりましたか? –

答えて

0

これはSOQLのガバナ制限を知るために必要なすべてを説明しています

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm

基本的には、トランザクションあたりのSOQLのガバナ制限がそれを置くために良いアイデアことはない100

ですループ内でSOQLクエリを実行します。

https://developer.salesforce.com/page/Apex_Code_Best_Practices

+0

ご回答いただきありがとうございます.SOQLクエリには2種類の制限があります。 100と200のクエリでは、どのバッチがこのバッチの制限になるか尋ねることができます。ありがとうございました – Sam

+0

@ arun-kumarが彼の答えで言及したように、200はバッチ処理の限界です。 – Steve

1

Apexの一括処理が非同期Apexは考えられているので、「発行SOQLクエリの総数は、」あなたの場合には限界がこの制限は、バッチの一つ実行するためである200 次のようになります。代替案については、以下を参照してください。

あなたのユーザーのループからSOQLを削除することをお勧めします。 List forユーザ内のリスト内のユーザIDを収集し、ユーザIDリストを使用してGroupMemberリストを取得する単一のSOQLクエリを作成します。

関連リンクは次のとおりです。https://help.salesforce.com/articleView?id=000176644&language=en_US&type=1