如何查询字段集中的字段

时间:2017-10-03 06:45:22

标签: salesforce apex-code apex soql

我正在尝试在我的查询中获取字段集上的字段,原因是我们正在使用托管包,如果字段集为空,最终可以在无限循环中结束,我们的组织中有数百个字段集如果我们一眼就能知道哪一个没有正确创建或者有空字段,那将非常有用,从之前的帖子我能够得到以下工具API查询,为每个字段集提供了大量信息,但是我不知道我知道如何在该查询中合并该字段集中的字段,任何帮助都将非常有用

SELECT EntityDefinitionId, EntityDefinition.Namespaceprefix, EntityDefinition.DeveloperName, 
    Id, DeveloperName, Description, CreatedDate, CreatedBy.Name
FROM FieldSet where EntityDefinition.DeveloperName='Loan' and developername like 'UI_R1%'
ORDER BY EntityDefinitionId, Id

1 个答案:

答案 0 :(得分:0)

我认为用普通的SOQL或工具API查询FieldSetMember表是不可能的。您可以实现Metadata API来获取类似于它们存储在Eclipse中的sObject定义。

enter image description here

我认为他们没有构建API访问权限,因为它不需要太多。在Apex中,如果您按照fieldsets tutorial进行“描述”调用,则很容易获得此数据。因此,除了元数据API,这将为您提供

的选项
  • 构建一个REST资源,你可以调用它类似于Tooling API查询,传递给你感兴趣的对象,并用fieldsets回复
  • 构建一个类似的东西的VF页面(甚至可能没有任何Apex要求) - 你仍然需要一个有效的会话ID来将这样的页面内容提取到Excel,所以它与REST url没有什么不同。

那么,你觉得要做一些编码吗? 以下是如何将Apex作为REST服务公开的基本示例。称之为:https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_rest_code_sample_basic.htm

至于实际逻辑 - 在ExecuteAnonymous中试验一下以了解事物?

// Pull it from GET request parameters?
List<String> types = new List<String>{'Account','Equipment__c'};

// if empty - describe it all (can be an expensive operation!)
// you'll get hundreds of objects back, might want to filter it down a bit by namespace?
if(types == null || types.isEmpty()){
    types = new List<String>(Schema.getGlobalDescribe().keyset());
}

// sObject => Fieldset Name => fields
Map<String, Map<String, List<String>>> abomination = new Map<String, Map<String, List<String>>>();

for(Schema.DescribeSobjectResult dsr : Schema.describeSObjects(types)){
    Map<String, List<String>> temp = new Map<String, List<String>>();
    Map<String, Schema.FieldSet> fieldsets =  dsr.fieldSets.getMap();
    for(String fieldsetName : fieldsets.keyset()){
        List<String> fields = new List<String>();
        for(Schema.FieldSetMember f : fieldsets.get(fieldsetName).getFields()){
            fields.add(f.getFieldPath());
        }
        temp.put(fieldsetName, fields);
    }
    abomination.put(dsr.getName(), temp);
}

System.debug(JSON.serializePretty(abomination));