【Apex】取引開始をまとめて行う方法
Apexを使用して、リードから取引先責任者への移行(取引開始)をまとめて行うクラスのサンプルを作ってみました。
ただfor文の中でSOQL使用していたりするので、ガバナ制限には気を付けなければいけません。そこは注意してください。
// 取引開始メソッド public void Convert(){ // リード状況の「取引開始済み」に該当する値を取得(MasterLabel) LeadStatus convertStatus = [SELECT Id, MasterLabel FROM LeadStatus WHERE IsConverted = true LIMIT 1 ]; // 取引開始していないリードを取得 Lead[] leads = [SELECT Id FROM Lead WHERE Status != :convertStatus.MasterLabel ]; // 取得したリードの数だけ取引開始を行う for(Lead lead : leads){ Database.LeadConvert lc = new Database.LeadConvert(); //取引開始済みリードオブジェクトをNew Account account = [SELECT Id FROM Account WHERE Name = :lead.Company LIMIT 1 ]; try{ lc.setLeadId(lead.Id); lc.setConvertedStatus(convertStatus.MasterLabel); // 取引先に同じ会社名がある場合は既存のレコードを使用 // 新しい取引先は作らない if(account != null){ lc.setAccountId(account.Id); } lc.setDoNotCreateOpportunity(True); // 商談オブジェクトを作成しない Database.LeadConvertResult lcr = Database.convertLead(lc); // 取引開始 }catch(DmlException e){ System.debug('エラー:' + e); } } }
参考
Web To リード(ケース)でレコードタイプを指定する
Web To リード(ケース)で生成したフォームからレコードタイプも同時に指定したいな、と思って調べたのでメモ。
Web to リード(ケース)で生成したHTMLに下記のコードを入れてやると指定できます。
フォームの生成方法は過去記事を参照。特にSandBox環境の人は読んでおいてください。
Value値にはレコードタイプのIDを入力。
<input type="hidden" id="recordType" name="recordType" value="***************">
レコードタイプのID
レコードタイプのIDを知る方法を書いていきます。 とはいってもApexでどうこうする必要もなく、簡単にわかります。
まず下記のページに移動します。
- 標準オブジェクト
設定 > カスタマイズ > 任意のオブジェクト(キャンペーン等) >レコードタイプ
- カスタムオブジェクト
設定 > 作成 > オブジェクト >レコードタイプ
IDを知りたいレコードタイプをクリックして、個別ページに遷移。
そのページのURLにid=***************
という形式で、15桁の英数字が並んでいる部分があります。それがIDです。(オブジェクトのレコード等と一緒ですね)
これを先ほどのコードに代入すれば、送信時にレコードタイプが入ります。
サンプルコード
最後にサンプルコードを書きます。
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"> <form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST"> <input type=hidden name="oid" value="xxxxxxxxxxxxxxx"> <!-- 送信後に遷移するページ --> <input type=hidden name="retURL" value="http://www.yahoo.co.jp/"> <!-- レコードタイプのIDを指定 --> <input type="hidden" id="recordType" name="recordType" value="***************"> <label for="name">名前</label> <input id="name" maxlength="80" name="name" size="20" type="text" /> <br> <input type="submit" name="submit"> </form>
参考
データ型「複数選択リスト」をWeb To リード(ケース)のフォームでチェックボックス表示
Salesforceにおいて、オブジェクトの項目タイプに複数選択リスト
というのがありますが、これをHTML上でチェックボックスで表現したい場合のメモ。
事前準備
Web ToリードのHTML生成方法は過去記事をチェックしてください。
複数選択リスト
Web To リードでHTMLを生成すると下記の様になります。
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"> <form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST"> <input type=hidden name="oid" value="xxxxxxxxxxxxxxx"> <input type=hidden name="retURL" value="http://"> <p> <label for="yyyyyyyyyyyyyyy">希望曜日:</label> <select id="yyyyyyyyyyyyyyy" multiple="multiple" name="yyyyyyyyyyyyyyy" title="2_参加可能曜日・時間"> <option value="月曜">月曜</option> <option value="火曜">火曜</option> <option value="水曜">水曜</option> <option value="木曜">木曜</option> <option value="金曜">金曜</option> <option value="土曜">土曜</option> <option value="日曜">日曜</option> </select> </p> <p> <input type="submit" name="submit"> </p> </form>
見た目はこんな感じ。いけてないですね。
チェックボックス
先ほどのコードを下記の様に変更していきます。
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"> <form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST"> <input type=hidden name="oid" value="xxxxxxxxxxxxxxx"> <input type=hidden name="retURL" value="http://"> 希望曜日: <p> <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="月曜">月曜 <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="火曜">火曜 <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="水曜">水曜 <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="水曜">木曜 <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="木曜">金曜 <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="金曜">土曜 <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="土曜">日曜 </p> <p> <input type="submit" name="submit"> </p> </form>
するとチェックボックスに変わっています。すっきりしましたね。
データもちゃんと反映されると思います。
まとめ
Salesforceの話というよりは、ほぼHTMLの話のような気もしますが、気にしない気にしない。
参考
リストビューに「レコードを複数選択して削除するボタン」を追加する
はじめに
Salesforceのリストビュー画面で、選択した複数のレコードを削除するボタンのサンプルを書きます。
標準だと一つづつレコードを消していくか全部消すしかないので、これがあると便利です。
オブジェクトの種類でアクセスする場所が違うので気を付けてください。
- 標準オブジェクトの場合
設定 > カスタマイズ > 任意のオブジェクト(キャンペーン等) > ボタン、リンク、およびアクション > 新規ボタンまたはリンク
- カスタムオブジェクトの場合
設定 > 作成 > オブジェクト > 任意のオブジェクト > ボタン、リンク、およびアクション > 新規ボタンまたはリンク
カスタムボタン作成
それぞれの種類に適した場所にアクセス後、下記の設定を行います。
表示の種類 => リストボタン 動作 => JavaScriptを実行 内容のソース => OnClick JavaScript
そしてテキストフィールドに下記のサンプルコードを記入してください。
3行目の対象オブジェクトは状況に応じて 変更してください。
{!REQUIRESCRIPT("/soap/ajax/9.0/connection.js")} // 対象のオブジェクトを指定する var records = {!GETRECORDIDS( $ObjectType.Hogehoge__c )}; if (records[0] == null) { alert("削除対象にチェックがついていません。"); } else if(confirm(records.length + "個のレコードを削除しますがよろしいですか?")){ sforce.connection.deleteIds(records);// ここで削除 location.reload();// 削除成功後に画面をリロード } else { alert("キャンセルされました。"); }
リストビューに表示
これだけだとリストビューにボタンが表示されないので、ボタンが表示されるように設定します。
- 標準オブジェクトの場合
設定 > カスタマイズ > 任意のオブジェクト(キャンペーン等) > 検索レイアウト > ***リストビュー
- カスタムオブジェクトの場合
設定 > 作成 > オブジェクト > 任意のオブジェクト > 検索レイアウト > ***リストビュー
こんな感じでボタンが追加される。
参考
ワークフロー機能ざっくりまとめ
はじめに
Salesforceのワークフローは使いこなせればとても便利な機能です。 プログラミングもしなくてもレコードの値を自動で変えたり、アラートメールを送ったりできるので、色んな使用方法が考えられます。
ただ設定方法がいまいち分かりにくいと思ったので、今回自分なりにまとめてみました。
ワークフローの大まかな流れ
コードで示した方が流れが伝わりやすいと思って書いてみました。
If(評価条件 == True){
If(ルール条件 == True){
ワークフローアクション実行
}
}
// もしくは
If(評価条件 == True && ルール条件 == True){
ワークフローアクション実行
}
要は評価条件とルール条件の二段階のチェックを通れば、ワークフローアクションが実行されるって感じですかね。 こう考えると凄くすっきりしました。
そして条件とワークフローアクションにもそれぞれ種類があります。
各条件とワークフローアクションの種類
評価条件
対象オブジェクトのレコードへのアクセスが下記のどれか一つに当てはまる時に、ルール条件のチェックを行います。
ルール条件
数式や条件を指定し、ワークフローアクションを行うかどうかのチェックを行います。
例:
ワークフローアクション
ワークフローアクションを行うタイミングは2つあり、自分で設定することが出来ます。
一つ目がルール条件がTrueだった時に即座に行われるルール適用時のアクション、二つ目がルール条件がTrueだった時に時間指定でアクションを実行する時間ベースのアクションです。
アクションの内容は、ルール適用時も時間ベースも共通で下記の5つ。
- 新規ToDo
- 新規メールアラート
- 新規項目自動更新
- 新規アウトバウンドメッセージ
- 既存アクションの選択
時間ベースのアクション実行のタイミングを設定するにはタイムトリガを追加する必要があります。
例:
例まとめ
今回の例をまとめます。
・評価条件 キャンペーンオブジェクトのレコードが新たに作成された時 もしくは後記するルール条件を満たすように編集された時 ・ルール条件 キャンペーンオブジェクトの項目「状況」の値が「進行中」の時 ・時間ベースのアクション 評価条件とルール条件を満たした場合、 レコードの終了日から一日後に、レコードの「状況」を「完了」に変更
ワークフローの確認
待機中のワークフローは設定 > 監視 > 時間ベースのワークフロー
にアクセスし、条件を指定して検索することが出来ます。
終わりに
ワークフローの設定方法を自分なりに噛み砕いてまとめてみましたが、いかがだったでしょうか? Salesforceは多機能なので使いこなすのが難しいですが、頑張っていきたいと思います。
【Apex】スケジュールを操作する
Apexコードを使ってスケジュールの作成・削除を行うことが出来ます。
これらを使えば、特定のクラスが呼び出された後にスケジュールをセットしたり削除したりすることが出来ます。
サンプルコード
CreateSchedule
クラスを呼び出すと、ジョブ名「3時のおやつ」で2016年中毎日15時にScheduledTest
クラスを呼び出すスケジュールが作成されます。
global class CreateSchedule { public static void execute(){ String jobName = '3時のおやつ'; // 2016年毎月毎日15時(年は省略可) String jobTime = '0 0 15 * * ? 2016'; // スケジュールを作成 System.schedule(jobName, jobTime, new ScheduledTest()); } }
今回は開発者コンソールから呼び出せるクラスを書いてみました。
開発者コンソール>Debug>Open Execute Anonymous Window
にアクセスし、下記のコードを記述してExecute
をクリックしてください。
CreateSchedule
クラスが呼び出されます。
CreateSchedule.execute();
スケジュールが作られたかどうかを確認するには、
設定>ジョブ>スケジュール済みジョブ
にアクセスしてください。作成されたスケジュールが一覧で表示されています。
毎日15時になるとScheduledTest
クラスが呼び出されます。
ただ毎日呼び出されると鬱陶しいので、呼ばれたらセットされたスケジュールを消すようにしてみました。
このクラスが呼ばれると、セットされたスケジュールが消され、コンソールにメッセージが表示されます。
global class ScheduledTest implements Schedulable { global void execute(SchedulableContext sc) { String jobName = '3時のおやつ'; // スケジュールオブジェクトからレコードを取得 List<CronTrigger> ct = [SELECT Id FROM CronTrigger WHERE CronJobDetail.JobType = '7' AND CronJobDetail.Name = :jobName LIMIT 1]; // スケジュール削除 System.abortJob(ct[0].Id); System.debug('今日のおやつはカールだよ'); } }
このスケジュールクラスは特殊で、Schedulable
インターフェースを実装していたりします。スケジュールオブジェクトにアクセスするSOQL文もかなり特殊ですよね。
これらは決まった様式なので、最初の内はあまり深く考えなくてもいいかもしれません。 とりあえずはこの様式に当てはめて、自分の行いたい処理を書けばOKだと思います。
参考
おまけ
スケジュールの管理画面を作成されている方がおられました。 ここまでいけばかなりユーザも使いやすいですね。
【Apex】クラス呼び出し後の画面遷移 (PageReference型の使い方)
クラス呼び出し後の画面遷移の仕方がよくわからなかったので調べてみました。
サンプルコードを使って、PageReference
型の簡単な使い方を解説します。
VisualForceページ_Page1
コントローラにJumpTest
を指定し、ボタンでjump
メソッドを呼び出します。
<apex:page controller="JumpTest"> <h1>ここはPage1です</h1> <apex:form > <apex:commandButton action="{!jump}" value="Page2へジャンプ!" /> </apex:form> </apex:page>
Apexクラス_JumpTest
JumpTest
クラスの中に、戻り値PageReference
型のjump
メソッドがあります。
メソッドの最後にreturn
でVisualForceページPage2
を返します。
ここで指定した画面に遷移します。
因みにreturn null
だと元の画面に遷移します。(今回で言うとPage1)
public class JumpTest(){ public PageReference jump(){ return Page.Page2; } }
VisualForceページ_Page2
<apex:page> <h1>ジャンプ成功!ここはPage2です!</h1> </apex:page>