概要
Appexchange向けのアプリケーションでよくあるのですが、ユーザが選択した任意のオブジェクトのデータを抽出したい時に、どのように抽出すればいいのかをご紹介します。(初心者向け)
結論
まず、結論から言いますとDescribeSObjectResult や DescribeFieldResult Classを用いることで、対象オブジェクトや項目のスキーマ情報を取得してSOQLを動的に生成すればOKです。
DescribeFieldResult クラス リファレンス
DescribeSObjectResult クラス リファレンス
サンプルコード
以下のサンプルコードにおいて
Accountオブジェクトを対象に動的クエリを作成します。
String objectName = 'Account';
String selectString = 'Select ';
String fromString = ' From ' + objectName;
// 全オブジェクトのスキーマ情報を取得
// 再帰的にgetGlobalDescribeを呼ぶことがある場合は、処理負荷になることがありますので、
// 1度取得したスキーマ情報を共有するような実装をお勧めします
Map<String, Schema.SObjectType> gs = Schema.getGlobalDescribe();
// gs.get(objectName).getDescribe()でオブジェクトのスキーマ情報も取得できるので、
// アクセス権限の可否などのチェック処理をあらかじめ入れとくこともできます
Map<String, Schema.SObjectField> gf = gs.get(objectName).getDescribe().fields.getMap();
for(String k : gf.keySet()) {
// 項目のスキーマ情報を取得
Schema.DescribeFieldResult fr = gf.get(k).getDescribe();
// アクセスできる項目かつ、隠し項目ではない
if(fr.isAccessible() && !fr.isDeprecatedAndHidden()) {
// getNameメソッドで項目のAPI参照名を取得できるが、名前空間に属する項目の場合は「名前空間名__項目名__c」で取得されます
// 名前空間名を含んでほしくない場合は、getLocalNameメソッドを使用してください
selectString += String.valueOf(fr.getName()) + ',';
}
}
selectString = selectString.removeEnd(',');
// 必要であればlimit句を付けてください
String query = selectString + fromString;
system.debug(query);
// soqlの実行
List<Sobject> records = Database.query(query);
system.debug(records);