【Salesforce】動的なSOQLを発行する
Apexでレコードを取得する際、SOQLを使用することがほとんどだと思います。
List<Account> accountList;
// レコードを取得する
accountList = [select
Id,
Name
from
Account
where
CreatedDate = TODAY
limit 10];
しかし、利用する条件によってSOQLを動的に作成したいことがありますよね。
そんなとき、Databaseクラスのメソッドからクエリを投げることができます。
例えば、こんな感じに使ったりします。
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.