Adsenseコード

2017-11-30

【Apex】レコードやレコードIdからオブジェクトのAPI名を取得する方法


レコードからオブジェクト名を取得する


Apex開発において、あるレコードのオブジェクトの
API名を取得したいときの方法です。

sObject 型のレコードで getSObjectType() のメソッドを
呼んであげると取得できます。

また、この getSObjectType メソッドの戻り値は
Schema 名前空間の sObjectType クラスですので、

String として処理するには、
String.valueOf( sObjectType クラス )
を利用する必要があります。

Account acc = new account(name = 'testAccount', description = 'testDescription');
String objApi = String.valueOf( acc.getSObjectType() );
System.debug( '###: ' + objApi );
System.assertEquals( 'Account', objApi );
Schema.sObjectType expected = Schema.Account.getSObjectType();
System.assertEquals( objApi, expected );

※ sObject.getSObjectType().getDescribe().getName();
でもできます。むしろ、こちらの方が正しいですね。
この場合、戻り値はStringになります。



参考


sObject クラス
SObjectType クラス



レコードIdからオブジェクトのAPI名とプレフィックス名を取得する


さらに、レコードのSalesforceIdのみをキーにしてオブジェクトのAPI名と KeyPrefix を取得する方法です。

まず、必要な知識です。
オブジェクト名と KeyPrefix の取得方法を以下に示します。

Account acc = new account(name = 'testAcme', description = 'testAcme Account');
insert acc;

Schema.SObjectType accSot = acc.getSObjectType();
DescribeSObjectResult dsor = accSot.getDescribe();
String objName = dsor.getName(); // オブジェクト名
String prefix = dsor.getKeyPrefix(); // プレフィックスコード
System.assertEquals( 'Account', objName );
System.assertEquals( '001', prefix );



また、組織内の全てのオブジェクトの SObjectType の取得方法は以下になります。

Map<String, Schema.SObjectType> globalDescribe = Schema.getGlobalDescribe();



あとはレコードIdの先頭3文字をキーにして、
組織内のオブジェクトのプレフィックスと
一致するものを探せば、
その名前がレコードのオブジェクト名となります。

// globalDescribe
public Map<String, Schema.SObjectType> globalDescribe {
get{
if(globalDescribe == null){
globalDescribe = Schema.getGlobalDescribe();
}
return globalDescribe;
}
set;
}
// レコードIdから、オブジェクト名を取得する
public String getObjectNameByRelationFiledId(String objectId){
String objName;
String headFiled = objectId.substring(0, 3); //先頭から3文字
for (Schema.SObjectType globalSOType : globalDescribe.values()) {

String prefix = globalSOType.getDescribe().getKeyPrefix();
if( headFiled == prefix){
objName = globalSOType.getDescribe().getName();
break;
}
}
return objName;
}



参考

【salesforce】IDからオブジェクト名を取得するゼイ。
SObjectType クラス
DescribeSObjectResult クラス



別解 レコードIdからオブジェクトのAPI名を取得する


実はIdクラスにも SObjectType を取得するメソッドが
用意されているので、API名とプレフィックス名の取得は
以下の方法でも可能です。

// レコードIdから、オブジェクト名を取得する
public String getObjectNameByRelationFiledId( Id id ){
return id.getSObjectType().getDescribe().getName();
}



参考
Id クラス



0 件のコメント:

コメントを投稿