【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.