【问题标题】:Is there a way to retrieve Salesforce picklist values for record types using apex?有没有办法使用 apex 检索记录类型的 Salesforce 选项列表值?
【发布时间】:2017-07-18 20:22:35
【问题描述】:

我需要收集有关每种记录类型可用的选项列表值的信息。我知道这可以使用 describeLayout 或 readMetadata API 来实现。但是,当我尝试为大型自定义对象收集此信息时,麻烦就来了。 SalesForce API 返回一个包含所有可用选项列表值的记录类型。

<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=20,000 个选项列表记录。它使 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 中搜索并找不到任何合适的东西。 Apex 似乎是一个更好的解决方案,因为所有处理都将在 Salesforce 端进行。

感谢您的帮助。

【问题讨论】:

    标签: salesforce apex


    【解决方案1】:

    要过滤掉重复项并仅获取唯一值,请尝试在 a Set 中捕获选项列表值的集合。例如,这里有一个函数,它接受一个字段列表(在这种情况下,它是一个选项列表字段列表)并返回一组唯一选项列表值。

    // 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;
    
       }
    

    我知道使用嵌套循环效率低下,但我不知道是否有更好的方法将对象列表合并到一个集合中。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果您想根据记录类型检索选项列表值,请在此处查看我的解决方案, https://salesforce.stackexchange.com/questions/103837/how-do-i-get-the-intersection-of-recordtype-and-picklist-values-inside-apex/202519#202519

      它使用 REST API 调用,但响应类似于 getdescribe 结果加上记录类型信息。

      【讨论】:

        【解决方案3】:

        这是解决性能和容量问题的方法。

        挑战在于为具有大量记录类型和选项列表的大型自定义对象的所有记录类型收集可用选项列表值。 首先,我没有直接在 Apex 中找到任何方法,我使用了 API 调用。

        当我们通过 describeSObject 调用 (https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_describesobject.htm) 收到自定义对象描述时,我们会获取所有选项列表值和记录类型值。我们没有得到每个记录类型可用的特定选项列表值。为此,我们需要执行 describeLayout 请求(https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_describelayout.htm)。使用来自 describeSObject 的信息,我们可以尝试预测 describeLayout 响应的大小。

        例如,如果我们有 500 个选项列表值和 20 种记录类型,则 describeLayout 的总响应将具有多达 500*20=10,000 个选项列表值(因为 describeLayout 返回可用于每种记录类型的所有选项列表值)。然后我们需要估计 XML 响应的大小,因为 Salesforce API 的响应限制为 5mb。检查响应后,我发现要匹配 5mb 限制,我们需要满足每个 describeLayout 请求少于 30,000 个选项列表值的要求。

        解决方案是将这个大型调用按记录类型分解为几个较小的记录类型,因此我们检索一些记录类型的所有选项列表值,然后为其他记录类型重复。

        最多需要 24 个 API 请求才能从 SalesForce API 检索 70MB 的数据,由于响应大小限制,这通过一次 API 调用是不可能的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-24
          • 2020-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-16
          • 1970-01-01
          • 2015-10-06
          相关资源
          最近更新 更多