Help us understand the problem. What is going on with this article?

Salesforce Schema.系 まとめ

More than 1 year has passed since last update.

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

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

sObjectTypeの取得

オブジェクト指定して
sObjectType sObjType = Account.getSObjectType();
オブジェクト名を使って
String sObjectName = 'Account';
Map<String, sObjectType> sObjTypeMap = Schema.getGlobalDescribe();
sObjectType sObjType = sObjTypeMap.get(sObjectName);
レコードIDから
Id recId = 'XXXXXXXXXXXXXXXXXX';
sObjectType sObjType = recId.getSObjectType();
sObjectクラスから
sObjectType sObjType = Account.getSObjectType();

sObjectTypeの使い方

sObjectをnewする

オプションなし
sObject sObj = sObjType.newSObject();
IDあり
sObject sObj = sObjType.newSObject(sObjectID);
レコードタイプ指定&デフォルト値なし
Id recTypDevName = 'hogehoge';`
sObject sObj = sObjType.newSObject(sObjectType.getDescribe().getRecordTypeInfosByDeveloperName().get('hogehoge'), false);
レコードタイプをIDで指定&デフォルト値あり
Id recTypDevName = 'hogehoge';`
sObject sObj = sObjType.newSObject(sObjectType.getDescribe().getRecordTypeInfosByDeveloperName().get('hogehoge'), false);

DescribeSObjectResultの取得

DescribeSObjectResult sObjectDescribe= sObjectType.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の取得

IDから
Map<Id, RecordTypeInfo> recTypeMap = sObjectDescribe.getRecordTypeInfosById();
名前から
Map<Id, RecordTypeInfo> recTypeMap = sObjectDescribe.getRecordTypeInfosByName();
DeveloperNameから
Map<Id, RecordTypeInfo> recTypeMap = sObjectDescribe.getRecordTypeInfosByDeveloperName();

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 = sObjectDescribe.fields.getMap();
DescribeFieldResult field = fields.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()
選択リスト値
List<Schema.PicklistEntry> picklistEntries = field.getPicklistValues()
ヘルプテキスト
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();

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);
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした