LoginSignup
5

More than 5 years have passed since last update.

Salesforceで任意のオブジェクトと項目を動的クエリでデータ取得する

Last updated at Posted at 2017-02-22

概要

 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);

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5