【Salesforce】動的なSOQLを発行する

【Salesforce】動的なSOQLを発行する

Apexでレコードを取得する際、SOQLを使用することがほとんどだと思います。

List<Account> accountList;

// レコードを取得する
accountList = [select 
                   Id,
                   Name
               from
                   Account
               where
                   CreatedDate = TODAY
               limit 10];

しかし、利用する条件によってSOQLを動的に作成したいことがありますよね。

そんなとき、Databaseクラスのメソッドからクエリを投げることができます。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_database.htm

例えば、こんな感じに使ったりします。

List<Account> accountList;
String query;
String targetDate;

// 時間によって処理を分岐する
targetDate = 'TODAY';
// 月末の場合は先月分を取得
if(Date.today() == Date.today().addMonths(1).toStartOfMonth().addDays(-1)){ 

    targetDate = 'THIS_MONTH';
}

// クエリを作成する
query = '';
query += ' select ';
query += '     Id, ';
query += '     Name ';
query += ' from ';
query += '     Account ';
query += ' where ';
query += '     CreatedDate = :targetDate';

// レコードを取得する
accountList = Database.query(query);

普段はその日に作成された取引先を取得しますが、月末の場合はその月に作成された取引先を取得します。

もちろん、パラメータに変数も使用可能です。

静的なSOQLと似た書き方ですね。

List<Account> accountList;
String query;
Date targetDate;
Date startDate;
Date endDate;

// 本日の日付
targetDate = Date.today();
// 月初
startDate = Date.today().toStartOfMonth();
// 月末
endDate = Date.today().addMonths(1).toStartOfMonth().addDays(-1);

// クエリを作成する
query = '';
query += ' select ';
query += '     Id, ';
query += '     Name ';
query += ' from ';
query += '     Account ';
query += ' where ';

// 月末の場合は先月分を取得
if(targetDate == endDate){ 

    query += '     CreatedDate = :targetDate';

}else{

    query += '     CreatedDate >= :startDate';
    query += ' and ';
    query += '     CreatedDate <= :endDate';
} 

// レコードを取得する
accountList = Database.query(query);

便利なのですが、コンパイル時にはエラーが確認できないので注意が必要です。

結果はクエリを投げてからのお楽しみです。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です