2017-07-18 12 views
0

すべてのレコードタイプで使用可能なピックリスト値についての情報を収集する必要があります。これは、describeLayout APIまたはreadMetadata APIのいずれかを使用して実現できます。しかし、大きなカスタムオブジェクトのためにこの情報を収集しようとすると、問題が発生します。 SalesForce APIは、利用可能なすべての選択リスト値を含むレコードタイプを返します。頂点を使用してレコードタイプのSalesforceのピックリスト値を取得する方法はありますか?

<recordTypeMappings> 
    <name>Record1</name> 
    <picklistsForRecordType> 
     <picklistName>Picklist1</picklistName> 
     <picklistValues> 
      ... 
     </picklistValues> 
    </picklistsForRecordType> 
    <picklistsForRecordType> 
     <picklistName>Picklist2</picklistName> 
     <picklistValues> 
      ... 
     </picklistValues> 
    </picklistsForRecordType> 
</recordTypeMappings> 
<recordTypeMappings> 
    <name>Record2</name> 
    <picklistsForRecordType> 
     <picklistName>Picklist1</picklistName> 
     <picklistValues> 
      ... 
     </picklistValues> 
    </picklistsForRecordType> 
    <picklistsForRecordType> 
     <picklistName>Picklist2</picklistName> 
     <picklistValues> 
      ... 
     </picklistValues> 
    </picklistsForRecordType> 
</recordTypeMappings> 

それは私が(200の選択リストと100個のレコードタイプを含む)ラージオブジェクトを持っている場合、私は200 * 100 =2万ピックリストのレコードを取得することを意味します。これにより、API応答が最大80MBまで大きくなります。また、これは非常に非効率的です。ピックリストの値がすべてのレコードタイプで同じであれば、それらはそれぞれのAPIレスポンスに含まれます。

アイデアは、一意のピックリスト値セットを取得し、それらにレコードIDを含めることです。同じピックリストはすべてのレコードタイプと重複しません。

<recordTypeMappings> 
    <name>Record1, Record2</name> 
    <picklistsForRecordType> 
     <picklistName>Picklist1</picklistName> 
     <picklistValues> 
      ...Values which are the same for Record1 and Record2... 
     </picklistValues> 
    </picklistsForRecordType> 
    <picklistsForRecordType> 
     <picklistName>Picklist2</picklistName> 
     <picklistValues> 
      ...Values which are the same for Record1 and Record2... 
     </picklistValues> 
    </picklistsForRecordType> 
</recordTypeMappings> 

これにより応答サイズが小さくなります。 Apexでそれを行う方法はありますか?私はAPIで検索し、適切なものを見つけることができませんでした。すべての処理がSalesforce側で行われるため、Apexは優れたソリューションと思われます。

ありがとうございました。

答えて

0

重複を除外して一意の値のみを取得するには、a Setに選択リストのコレクションを取り込みます。たとえば、List of fields(この場合はpicklistフィールドのリスト)を受け取り、一意のpicklist値のセットを返す関数があります。

// Given a list of picklist fields, return a set of unique picklist values 
Set<Schema.PicklistEntry> getUniquePickListValues(List<Schema.DescribeFieldResult> pickListFields) { 

    Set<Schema.PicklistEntry> uniquePicklistValues = Set<Schema.PicklistEntry>(); 

    for(Schema.DescribeFieldResult pickList : pickListFields){ 

     List<Schema.PicklistEntry> pickListValues = pickList.getDescribe().getPicklistValues(); 

     for(Schema.PicklistEntry entry : pickListValues){ 

      uniquePicklistValues.add(entry); 

     } 

    } 

    return uniquePicklistValues; 

    } 

私は、ネストされたループを使用することは非効率的であることを知っているが、セットにオブジェクトのリストをマージするためのより良い方法があるかどうかはわかりません。

これが役に立ちます。あなたはレコードタイプに基づいて選択リスト値を取得したい場合は、ここに私の解決策を確認してください

関連する問題