概要
不特定多数のオブジェクトを対象としたアプリケーションを開発する際に、すべてのオブジェクトにName項目があると思って、ソースコードにNameをベタ書きするとNGです。残念ながらすべてのオブジェクトにName項目はないです!
なので、DescribeからName項目ないオブジェクトリストを作成して、それと突き合わせることが安全策です
Name項目がない代表的なオブジェクト
契約やケースといったよく使うオブジェクトにもName項目はないんです
オブジェクト名 | |
---|---|
契約 | Contract |
ケース | Case |
ソリューション | Solution |
ToDo | Task |
行動 | Event |
アイデア | Idea |
確認方法
DescribeからName項目の有無を確認する
※下記のサンプルコードでクエリ可能か、アクセス可能かなどの条件を追加していますが、必要に応じて変更して実行してください
Map<String, Schema.SObjectType> gs = Schema.getGlobalDescribe();
for(String objectName : gs.keySet()) {
Schema.DescribeSObjectResult schemaSobj = gs.get(objectName).getDescribe();
if(schemaSobj.isQueryable() &&
schemaSobj.isAccessible() &&
schemaSobj.isUpdateable() &&
(schemaSobj.isSearchable() || schemaSobj.isCustom()) &&
!schemaSobj.isDeprecatedAndHidden() &&
!schemaSobj.isCustomSetting()) {
Map<String, Schema.SObjectField> gf = gs.get(objectName).getDescribe().fields.getMap();
if(!gf.containsKey('Name')) {
// Name項目を待たないオブジェクト名が表示されます
system.debug(objectName);
}
}
}