カスタムメタデータレコードをプログラムでアクセス
SOQL を使用して、カスタムメタデータ型にアクセスしたり、これらのデータ型のレコードの API 名を取得したりします。
必要なエディション
| 使用可能なインターフェース: Salesforce Classic および Lightning Experience |
使用可能なエディション: Enterprise Edition、Performance Edition、Unlimited Edition、および Developer Edition インストール済みパッケージからカスタムメタデータ型レコードを作成、編集、削除できるエディション: Group Edition および Professional Edition |
| 必要なユーザー権限 | |
|---|---|
| カスタムメタデータ型を作成または編集する | 「Apex 開発」 |
メタデータが登録者によって制御され、コードの名前空間内から参照可能な場合、Apex コードでカスタムメタデータレコードの作成、参照、更新ができます (ただし削除は不可)。パートナー API またはエンタープライズ API では、カスタムメタデータに対して DML 操作を実行できません。パッケージ化されていないメタデータでは、開発者によって制御されたアクセスと登録者によって制御されたアクセスの動作は同じです。登録者によって制御されたアクセスのように動作します。カスタムメタデータ型__mdt sObject についての詳細は『Salesforce のオブジェクトリファレンス』の「カスタムメタデータ型__mdt」を参照してください。開発者が制御する組織および登録者が制御する組織でのパッケージアクセスについての詳細は、「Trust, but Verify: Apex Metadata API and Security (信頼、ただし検証: Apex メタデータ API およびセキュリティ)」を参照してください。
次の例では、各自の名前空間にあるカスタムメタデータ型 MyCustomMetadataType__mdt の Apex 変数 custMeta を宣言します。
MyCustomMetadataType__mdt custMeta;各自の名前空間ではなく、their_ns 名前空間にあるカスタムメタデータ型 TheirCustomMetadataType__mdt の custMeta 変数を宣言します。
their_ns__TheirCustomMetadataType__mdt custMeta;次の例は、Threat_Tier_Mapping カスタムメタデータ型のすべてのレコードの標準項目およびカスタム項目を返し、その項目の一部にアクセスする単純なクエリです。
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);
}SOQL よりも Schema.SObjectDescribeResult に近いエンティティを提供するには、vacations__ThreatTierMappingDescribeResult__mdt から照会される情報を Apex クラス vacations.ThreatTierMappingDescribeResult でカプセル化します。続いて、次のようなメソッドを使用して vacations.Vacations クラスを作成します。
vacations.ThreatTierMappingDescribeResult describeThreatTierMappings(String qualifiedApiName) {
Threat_Tier_Mapping__mdt threatMapping = [SELECT <fields> FROM Threat_Tier_Mapping__mdt WHERE QualifiedApiName = :qualifiedApiName];
return new ThreatTierMappingDescribeResult(<fieldValues>);
}
前述の例では、<fields> は describe に追加する項目を参照し、<fieldValues> はそれらの項目の値を参照します。
次の例では、別のカスタムメタデータ型 Team_Building_to_SFA_Field_Mapping__mdt を参照するメタデータリレーションを使用して単純な右外部結合を実行します。
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);次の例は、EntityDefinition から開始される左外部結合を示します。このクエリでは、Team_Building_to_SFA_Field_Mapping__mdt で Team_Building_Object__c というリレーション項目を使用します。このリレーション項目の子リレーション名は 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);
}
}
