是否有一种方法可以使用apex检索记录类型的Salesforce选取列表值?

是否有一种方法可以使用apex检索记录类型的Salesforce选取列表值?,salesforce,apex,Salesforce,Apex,我需要收集关于每个记录类型可用的选择列表值的信息。我知道这可以通过使用describeLayout或readMetadata API实现。但是,当我试图为一个大型自定义对象收集这些信息时,麻烦就发生了。SalesForce API返回一个记录类型,其中包含所有可用的选取列表值 <recordTypeMappings> <name>Record1</name> <picklistsForRecordType> <

我需要收集关于每个记录类型可用的选择列表值的信息。我知道这可以通过使用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>

记录1
挑选名单1
...
挑选名单2
...
记录2
挑选名单1
...
挑选名单2
...
这意味着如果我有一个大对象(包括200个picklist和100个记录类型),我将得到200*100=20000个picklist记录。它使API响应非常大,高达80MB。这是非常低效的,如果选择列表的值对于所有记录类型都保持不变,那么它们仍然会包含在每个API响应中

其思想是获取唯一的picklist值集,然后只包含记录ID,这样就不会对每种记录类型重复相同的picklist

<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>

记录1,记录2
挑选名单1
…记录1和记录2的值相同。。。
挑选名单2
…记录1和记录2的值相同。。。
这将减少响应大小。在Apex有没有办法做到这一点?我在API中搜索,没有找到任何合适的。Apex似乎是一个更好的解决方案,因为所有的处理都将在Salesforce端进行


感谢您的帮助。

若要筛选重复项并仅获取唯一值,请尝试在中捕获拾取列表值的集合。例如,这里有一个函数,它获取字段列表(在本例中是一个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;

   }
//给定picklist字段列表,返回一组唯一的picklist值
设置getUniquePickListValues(列出pickListFields){
Set uniquePicklistValues=Set();
for(Schema.descripbeFieldResult选取列表:选取列表字段){
List pickListValues=pickList.getdescription().getPicklistValues();
for(Schema.PicklistEntry条目:pickListValues){
uniquePicklistValues.add(条目);
}
}
返回唯一的picklistvalues;
}
我知道使用嵌套循环效率很低,但我不知道是否有更好的方法将对象列表合并到一个集合中


希望这有帮助

如果要根据记录类型检索选择列表值,请在此处检查我的解决方案,


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

下面是如何解决性能和卷问题的

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

当我们通过describeSObject调用()接收到自定义对象描述时,我们会得到所有的picklist值和记录类型值。我们没有得到每种记录类型可用的特定选择列表值。为此,我们需要执行descripbelayout请求()。使用来自describeSObject的信息,我们可以尝试预测DescribeYout响应的大小

例如,如果我们有500个picklist值和20个记录类型,DescribeYout的总响应将有多达500*20=10000个picklist值(因为DescribeYout返回每个记录类型可用的所有picklist值)。然后我们需要估计XML响应的大小,因为SalesforceAPI的响应限制为5mb。在检查响应后,我发现为了匹配5mb限制,我们需要满足每个DescribeYout请求少于30000个选择列表值的要求

解决方案是按记录类型将这个大型调用分解为几个较小的调用,所以我们检索一些记录类型的所有picklist值,然后对其他记录类型重复

从SalesForce API检索70MB数据需要24个API请求,但由于响应大小的限制,一次API调用无法检索70MB数据