たまに使うたびに調べ直してるのでメモ
オブジェクトの情報を取得したい
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 | 電話 |
メール | |
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);