Acessar registros de metadados personalizados programaticamente
Use SOQL para acessar os tipos de metadados personalizados e para recuperar os nomes de API dos registros nesses tipos.
Edições obrigatórias
| Disponível em: Salesforce Classic e Lightning Experience |
Disponível em: Edições Enterprise, Performance, Unlimited e Developer Você pode criar, editar e excluir registros de tipo de metadados personalizados de pacotes instalados em: Group e Professional Editions |
| Permissões necessárias ao usuário | |
|---|---|
| Para criar ou editar tipos de metadados personalizados: | Criar Apex |
O Apex code pode criar, ler e atualizar (mas não excluir) registros de metadados personalizados, desde que os metadados sejam controlados pelo assinante e possam ser vistos no namespace do código. Não é possível realizar operações DML em metadados personalizados nas APIs Partner ou Enterprise. Com os metadados não empacotados, tanto o acesso controlado por desenvolvedor quanto o acesso controlado por assinante se comportam da mesma forma: como o acesso controlado pelo assinante. Para obter informações sobre o sObject Custom Metadata Type__mdt, consulte Custom Metadata Type__mdt na Referência de objetos para Salesforce. Consulte Confiar, mas verificar: API de metadados e segurança do Apex para saber mais sobre o acesso a pacotes em organizações controladas por desenvolvedor e controladas por assinante.
O exemplo a seguir declara a variável do Apex custMeta do tipo de metadados personalizado MyCustomMetadataType__mdt, que está no seu namespace.
MyCustomMetadataType__mdt custMeta;Declare a variável custMeta do tipo de metadados personalizado TheirCustomMetadataType__mdt, que não está no seu namespace, mas está no namespace their_ns.
their_ns__TheirCustomMetadataType__mdt custMeta;O exemplo a seguir é uma consulta simples que retorna campos padrão e personalizados de todos os registros do tipo de metadados personalizado Threat_Tier_Mapping e acessa alguns de seus campos.
Threat_Tier_Mapping__mdt[] threatMappings = [SELECT MasterLabel, QualifiedApiName, Field_Mapping__c ,Minimum_Support_Level__c FROM Threat_Tier_Mapping__mdt];
for (Threat_Tier_Mapping__mdt threatMapping : threatMappings) {
System.debug(threatMapping.MasterLabel + ‘: ‘ +
threatMapping.Field_Mapping__c + ‘ from ‘ +
threatMapping.Team_Building_to_SFA_Field_Mapping__c + ‘ to ‘
threatMapping.Minimum_Support_Level__c);
}Para fornecer uma entidade que se parece mais com Schema.SObjectDescribeResult do que SOQL, faça a classe do Apex vacations.ThreatTierMappingDescribeResult encapsular as informações consultadas de vacations__ThreatTierMappingDescribeResult__mdt. Em seguida, crie vacations.Vacations de classe com métodos como:
vacations.ThreatTierMappingDescribeResult describeThreatTierMappings(String qualifiedApiName) {
Threat_Tier_Mapping__mdt threatMapping = [SELECT <fields> FROM Threat_Tier_Mapping__mdt WHERE QualifiedApiName = :qualifiedApiName];
return new ThreatTierMappingDescribeResult(<fieldValues>);
}
No exemplo anterior, <fields> se refere aos campos que você quer incluir em describe, e <fieldValues> se refere aos valores desses campos.
O próximo exemplo usa um relacionamento de metadados que faz referência a outro tipo de metadados personalizado, Team_Building_to_SFA_Field_Mapping__mdt, para fazer uma simples junção externa à direita.
ThreatTierMapping threatMapping =
[SELECT MasterLabel, Team_Building_to_SFA_Field_Mapping__r.MasterLabel FROM Threat_Tier_Mapping__mdt WHERE QualifiedApiName=‘Easy_Vacations’];
System.debug(threatMapping.MasterLabel + ‘ is part of ‘ + Team_Building_to_SFA_Field_Mapping__r.MasterLabel);O exemplo a seguir mostra uma junção externa à esquerda começando em EntityDefinition. Essa consulta usa um campo de relacionamento chamado Team_Building_Object__c em Team_Building_to_SFA_Field_Mapping__mdt. O nome do relacionamento inferior deste campo de relacionamento é Field_Mappings_From.
for (EntityDefinition entity : allObjects) {
System.debug(‘Processing mappings for: ‘ + entity.QualifiedApiName);
for (Team_Building_to_SFA_Field_Mapping__mdt fieldMapping : entity.FieldMappingsFrom__r) {
System.debug(‘ Field ‘ + fieldMapping.Team_Building_Field__c +
‘ has mapping ‘ + fieldMapping.QualifiedApiName);
}
}