Loading
Aprimorar o Salesforce com código
Acessar registros de metadados personalizados programaticamente

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);
    }
}
 
Carregando
Salesforce Help | Article