LoginSignup
65

More than 1 year has passed since last update.

Apexでオブジェクトの定義情報を参照する ~Salesforce Schema.系 まとめ~

Last updated at Posted at 2017-03-13

たまに使うたびに調べ直してるのでメモ

オブジェクトの情報を取得したい

sObjectTypeの取得

オブジェクトを固定できるとき
sObjectType sObjType = Account.getSObjectType();
オブジェクトを固定でき無いとき
Map<String, sObjectType> sObjTypeMap = Schema.getGlobalDescribe().get(sObjectName);
レコードIDから
sObjectType sObjType = recordId.getSObjectType();

sObjectTypeの使い方

sObjectをnewする

オプションなし
sObject sObj = sObjType.newSObject();
IDあり
sObject sObj = sObjType.newSObject(sObjectID);
レコードタイプ指定
sObject sObj = sObjType.newSObject(sObjectType.getDescribe().getRecordTypeInfosByDeveloperName().get(recordTypeName), false);
//最終引数は、trueの場合、デフォルト値あり。

DescribeSObjectResultの取得

オブジェクトを固定できるとき
DescribeSObjectResult sObjectDescribe= Account.getSObjectType().getDescribe();
オブジェクトを固定でき無い時
DescribeSObjectResult sObjectDescribe= Schema.getGlobalDescribe().get(sObjectName).getDescribe();

DescribeSObjectResultの使い方

オブジェクトの情報を参照

レコードIDのプレフィックス
String objPref = sObjectDescribe.getKeyPrefix();
表示ラベル
String objLabel = sObjectDescribe.getLabel();
API参照名
String objName = sObjectDescribe.getName();

実行ユーザのオブジェクトへのアクセス権を確認

作成
Boolean canRead = sObjectDescribe.isCreateable();
参照
Boolean canRead = sObjectDescribe.isAccessible();
編集
Boolean canRead = sObjectDescribe.isUpdateable();
削除
Boolean canRead = sObjectDescribe.isDeletable();`

レコードタイプの情報を取得したい

RecordTypeInfoの取得

オブジェクトを固定できるとき
Map<Id, RecordTypeInfo> recTypeMap = Account.getSObjectType().getDescribe().getRecordTypeInfosById();//MapのキーはId
Map<String, RecordTypeInfo> recTypeMap = Account.getSObjectType().getDescribe().getRecordTypeInfosByName();//MapのキーはName(表示ラベル)
Map<String, RecordTypeInfo> recTypeMap = Account.getSObjectType().getDescribe().getRecordTypeInfosByDeveloperName();//MapのキーはDeveloperName(Api参照名)
オブジェクトを固定でき無い時
Map<Id, RecordTypeInfo> recTypeMap = Schema.getGlobalDescribe().get(sObjectName).getDescribe().getRecordTypeInfosById();//MapのキーはId
Map<String, RecordTypeInfo> recTypeMap = Schema.getGlobalDescribe().get(sObjectName).getDescribe().getRecordTypeInfosByName();//MapのキーはName(表示ラベル)
Map<String, RecordTypeInfo> recTypeMap = Schema.getGlobalDescribe().get(sObjectName).getDescribe().getRecordTypeInfosByDeveloperName();//MapのキーはDeveloperName(Api参照名)

RecordTypeInfoの使い方

レコードタイプ情報を参照

レコードタイプ名
String recTypeName = recTypeInfo.getName();
レコードタイプID
Id recTypeId = recTypeInfo.getRecordTypeId();
DeveloperName
Id recTypeId = recTypeInfo.getDeveloperName();
デフォルトレコードタイプか
Boolean isDefRecType = recTypeInfo.isDefaultRecordTypeMapping();
実行ユーザが使用可能か
Boolean isAvailable = recTypeInfo.isAvailable();

項目の情報を取得したい

DescribeFieldResultの取得

オブジェクト、項目とも固定できるとき
DescribeFieldResult field = Account.Name.getDescribe();
特定オブジェクトの全部の項目を取得したい場合。
Map<String, SObjectField> fields = Account.getSObjectType().getDescribe().fields.getMap();
for(SObjectField f : fields.values()) {
    DescribeFieldResult field  = f.getDescribe();
}
オブジェクトは固定できるが、項目は固定できないとき
DescribeFieldResult field = Account.getSObjectType().getDescribe().fields.getMap().get(fieldName).getDescribe();
オブジェクトも項目も固定できないとき
DescribeFieldResult field = Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().get(fieldName).getDescribe();

DescribeFieldResultの使い方

項目の情報を参照

表示ラベル
String fieldLabel = field.getLabel();
データ型
DisplayType dispType = field.getType();

補足:DisplayType※数式は、戻り値の型になる。

DisplayType 項目の型
String テキスト、自動採番
TextArea テキストエリア(ロング、リッチ含む)
Double 数値
Percent パーセント
Currency 通貨
Picklist 選択リスト
MultiPicklist 複数選択リスト
Date 日付
Time 時間
DateTime 日付/時間
Boolean チェックボックス
Phone 電話
Email メール
URL URL
Reference 参照関係、主従関係
ID ID
Combobox コンボボックス
address 住所
自動採番か
Boolean isAutoNumber = field.isAutoNumber();
数式か
Boolean isCalculated = field.isCalculated();
CascadeDeleteされるか(=主従か)
Boolean isCascadeDelete = field.isCascadeDelete();
親オブジェクトのsObjectType
SObjectType sobjType = field.getReferenceTo();
子リレーション名
String relationshipName = field.getRelationshipName();
文字数
Integer length = field.getLength();
桁数(全体)
Integer length = field.getPrecision();
桁数(小数点以下)
Integer length = field.getScale();
デフォルト値
Object defaultValue = field.getDefaultValue();
ヘルプテキスト
String helpText = field.getInlineHelpText();
nullが許可されているか(必須の逆)
Boolean isNilable = field.isNillable();
ユニークか
Boolean isUnique = field.isUnique();
外部IDか
Boolean isExternalID = field.isExternalID();

アクセス権を確認

参照
boolean isAccessible = field.isAccessible();
編集
boolean isUpdateable = field.isUpdateable();
作成
boolean isCreateable = field.isCreateable();

選択リスト値の情報を取得したい

PicklistEntryの取得

オブジェクト、項目とも固定できるとき
List<Schema.PicklistEntry> picklistEntries= Account.Type.getDescribe().getPicklistValues();
オブジェクトは固定できるが、項目は固定できないとき
List<Schema.PicklistEntry> picklistEntries = Account.getSObjectType().getDescribe().fields.getMap().get(fieldName).getDescribe().getPicklistValues();
オブジェクトも項目も固定できないとき
List<Schema.PicklistEntry> picklistEntries = Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().get(fieldName).getDescribe().getPicklistValues();

PicklistEntryの使い方

表示ラベル
String Label = picklistEntrie.getLabel();
API参照名
String Label = picklistEntrie.getValue();
デフォルト値かどうか
Boolean isDefaultValue= picklistEntrie.isDefaultValue()
有効or無効
Boolean isActive= picklistEntrie.isActive()://※レコードタイプが関係するかは未検証

Visualforceでの$ObjectType

似たようなものなのでついでに。

オブジェクト

オブジェクト情報

表示ラベル名
{!$ObjectType['Account'].Label}
API参照名
{!$ObjectType['Account'].Name}
プレフィックスコード
{!$ObjectType['Account'].keyPrefix}

アクセス権

作成
{!$ObjectType['Account'].createable}
参照
{!$ObjectType['Account'].accessible}
編集
{!$ObjectType['Account'].updateable}
削除
{!$ObjectType['Account'].deletable}

項目

項目情報

表示ラベル
{!$ObjectType['Account'].fields['Name'].Label}
API参照名
{!$ObjectType['Account'].fields['Name'].name}
空白にできるか(必須の逆)
{!$ObjectType['Account'].fields['Name'].nillable}

アクセス権

作成
{!$ObjectType['Account'].fields['Name'].createable}
参照
{!$ObjectType['Account'].fields['Name'].accessible}
編集
{!$ObjectType['Account'].fields['Name'].updateable}

使用例

IDからオブジェクト名取得

Id recId = 'XXXXXXXXXXXXXXXXXX';
String objName = recId.getSObjectType().getDescribe().getName();

keyPrefix(レコードIDの上3桁)からオブジェクト名取得

上3桁さえ正しければ良いみたい……

String keyPrefix = '001';
String objName = ID.valueOf(keyPrefix + '000000000000').getSObjectType().getDescribe().getName();

オブジェクト名とレコードタイプ名(Developer Name)から、レコードタイプのIDを取得

String sObjectName = 'Account';
String recordTypeDeveloperName = 'BusinessAccount'

ID recordTypeId =  Schema.getGlobalDescribe().get(sObjectName).getDescribe().getRecordTypeInfosByDeveloperName().get(recordTypeDeveloperName).getRecordTypeId()

SELECT * 的な

String sObjectName = 'Account';
String query = 'SELECT ';

for(String FieldName : Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().KeySet()){
    query += FieldName + ',';
}
query = query.removeEnd(',') + ' FROM ' + sObjectName;

List<sObject> records = Database.query(query);

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65