有没有办法使用 apex 检索记录类型的 Salesforce 选择列表值?



我需要收集有关每种记录类型可用的选项列表值的信息。我知道这可以使用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方面进行。

感谢您的帮助。

若要筛选出重复项并仅获取唯一值,请尝试在 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;
}

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

希望这有帮助。

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

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

以下是性能和音量问题的解决方式。

挑战在于收集具有大量记录类型和选择列表的大型自定义对象的所有记录类型的可用选项列表值。 首先,我没有找到任何直接在 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 个选项列表值的要求。

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

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

最新更新