Apexセールスフォースの豆知識セールスフォースの開発に役立つTIPSをメインに、新機能や関連ニュースなどをお届けします。(月)Queueableインタフェースを使った非同期処理実行エンジニアの谷隈です。Winter'15から導入された新機能Queueableインタフェースについて書きます。Queueableインタフェースはfutureメソッドと機能的にはすごく似ています。どちらも非同期に処理を実行する仕組みです。ドキュメントで謳われている両者の違い、Queueableインタフェースを利用するメリットは次の2点です。・ジョブIDを取得して、進行状況を監視できる・ジョブの連鎖が可能(Winter'15時点では2連鎖まで。Spring'15で無制限になる予定。)次のコードはQueueableインタフェースを実装したクラスの簡単なサンプルです。非同期に実行したい処理をexecuteメソッドの中に書きます。}}処理のキューへの登録にはsystem.enqueueJobメソッドを使用します。キューに入れられた処理の開始タイミングは呼び出し側のトランザクション完了後の模様。jobID);1トランザクション中でキューに登録できるジョブ数は50。ガバナ制限を超えてキューにジョブを登録しようとした場合は、例外が発生します。51ジョブの進行状況の取得はAsyncApexJobレコードを検索して取得できます。Id=:jobID];futureメソッドとの違いで、ちょっと面白いと思ったのはバッチジョブ内からもキューへの登録/実行が可能な点です。(バッチからfutureメソッドを呼び出した場合は例外が発生)ただ、現時点では制限により1つしかキューにジョブを追加できないので使えるケースはかなり限られそうです。最近の派手系追加機能と比べるといかんせん地味なQueueableですが、その内容はfutureメソッドからの順当な進化系なので抑えておいて損はない機能だと思います。(8~10)玉澤です。Tipsの残り3つを紹介します。Salesforce標準のログイン画面をブランディングするSalesforceの標準のログイン画面を変えたい、お客様の会社のイメージでブランディングしたいときに役立つTipsです。下記の手順で、Salesforce標準のログイン画面をカスタマイズできます。[管理]→[ドメイン管理]→[私のドメイン]から組織のサブドメインを登録します。※組織のサブドメインは一度しか登録できないため、慎重に選択してください。登録したら、↓のような画面になるので、「こちらをクリックしてログインしてください」を押下して、ドメインのテストを実施します。テスト後、↓のような画面になるので、「ユーザにリリース」を押下して、リリースします。※新しいドメイン名をリリースした後は、元に戻せません。リリース後は、すべてのユーザが新しいドメインにリダイレクトされるので、注意してください。リリース後、ログインページのブランド設定が表示されるので、ロゴ、背景色、右フレームのURLを表示します。設定後、リリースしたドメインにアクセスすると、↓のように、ログイン画面がカスタマイズされて表示されるようになります。タブのデフォルト表示を「最近使った○○」ではなくするタブをクリックしたときに、「最近使った○○」(※○○はオブジェクト名)というビューではなく、通常のビュー画面をデフォルト表示したい場合に役立つTipsです。通常のビュー画面を表示するVisualforceページを作成します。↓のコードを書けばOKです。/></apex:page>次に、タブのデフォルト表示を変更したいオブジェクトの設定画面を開き、「ボタン、リンク、およびアクション」セクションで、タブの設定編集リンクをクリックします。タブの設定編集画面で、上書き手段で「Visualforceページ」を選択し、先程作成したVisualforceページを選択します。すると、タブをクリックしたときに、「最近使った○○」というビューではなく、通常のビュー画面が表示されるようになります。レコード詳細画面にグラフを表示するレコードの詳細画面にグラフを表示したいときに役立つTipsです。対象のレコードに関連するレポート結果だけをグラフ表示できます。ここでは、取引先レコードの詳細画面で、その取引先の商談をフェーズ毎に集計したグラフを表示する方法を例に説明します。レポートをグラフ付きで作成します(今回の例では、標準の商談レポートタイプで、フェーズ毎に集計したサマリレポートを作成します)。次にグラフを表示したいオブジェクトのページレイアウトの設定画面を表示します。レポートグラフのセクションに、先程作成したレポートが表示されているので、ドラッグ&ドロップでレイアウトに追加します(今回の例では、取引先のページレイアウトを表示し、先程作成したレポートグラフを追加します)。追加後、プロパティ設定で、表示サイズ、タイトル表示の有無、絞り込み条件を設定します。グラフは、元々のレポートの集計結果から、更に絞り込み条件で指定した項目で絞り込んだ結果が表示されます(今回の例では、取引先IDを指定して、その取引先の商談だけが表示されるようにします)。設定すると、↓のように、レコード詳細画面でグラフが表示されるようになります(今回の例では、取引先レコードの詳細画面で、その取引先の商談をフェーズ毎に集計したグラフが表示されます)。(6~7)またもやこのシリーズです。今回は6つめと7つめをお送りします。VisualforceをRead-Onlyモードで実行するApexの実行には実はRead-Onlyモードというものがあります。これ、何か良いことがあるのかというとガバナ制限が緩和されるというメリットがあります。しても大量のデータを扱いたいといったケースなどには、特別な細工をせずに扱えるデータ件数が増えるので利用価値がありそうです。Read-Onlyモードの設定の仕方には2通りの方法があります。コントローラークラスのメソッドをRead-Onlyモードにするどちらの方法でモード設定するかによって緩和される制限に差があります。具体的な緩和されるガバナ制限の内容は下記になります。対象の繰り返しコンポーネントは<apex:repeat><apex:dataTable><apex:dataList>の3つ※Visualforceページ全体をRead-Onlyモードにした時のみ適用されます。ここからはRead-Onlyモードの設定の仕方について書いていきます。Visualforceページ全体をRead-Onlyモードにする方法から。これはすごく簡単で、<apex:page>タグにパラメータ「readOnly="true"」を追加するだけです。}}コントローラー側は特に何もする必要はありません。statements」の例外が発生します。次はコントローラーのメソッド単位でRead-Onlyモードを設定する方法です。コントローラーのメソッドにRead-Onlyモードを設定するには「@ReadOnly」あのテーションを付与します。どんなメソッドにもアノテーションを付けられる訳ではなく、次の条件を満たしている必要があります。アノテーションが付いているちなみにVisualforceということを抜きにすれば「@ReadOnly」自体はwebserviceなどでも使用できます。Guideを見てください。Datahttps://www.salesforce.com/us/developer/docs/pages/Content/pages_controller_readonly_context.htmでは、実際の使用例です。}}ページ全体がRead-Onlyモードになるわけではないので通常のメソッドを呼び出してデータを更新することもできます。いかがだったでしょうか。機会があったら活用してみてください。変更セットへ楽に項目を追加する変更セット使ってますか。変更セットは便利といえば便利なのですが、そのUIはお世辞にも使い易いとは言えません。カスタム項目数が数千件ある時に、そのなかから必要なものを選択する場合は一苦労です。こんなときに次の手順を踏むと少しだけ項目を選ぶのが楽になります。URLに追加されるパラメータ「rowsperpage」を1000に書き換えたURLに移動これで一気に一覧の表示件数を上限の1000件に変更することができます。あとはソートするなり、ページ内検索するなりすればほんの少し楽に項目追加ができるようになります。手動でURLを書き換えるのすら面倒だという方のために一覧表示を1000件にするブックマークレットを用意してみました。(やっていることは表示しているURLにパラメータ「rowperpage」があれば値を1000に変更し、なければ値を1000で追加して遷移させているだけです。l.href=((/rowsperpage=[0-9]+/i).test(h))?h.replace(/rowsperpage=[0-9]+/ig,'rowsperpage=1000'):(h+'&rowsperpage=1000');})();一応、Chromeで動作確認してあります。良かったら使ってやってください。(4~5)前回からの続きです。今回は4つめと5つめをお送りします。オブジェクトでトピックを利用するSpring'14からChatterのトピック機能がオブジェクトでも利用できる様になりました。トピックはTwitterで言うところのハッシュタグみたいなもので、レコードの整理に使うことができます。・使うための準備オブジェクトに対してトピック機能を有効化する必要があります。Spring'14以降に作成した組織の場合はトピックを使用可能なすべての標準オブジェクトは、デフォルトで機能が有効になっている様です。トピックの有効化は「カスタマイズ>トピック>オブジェクトのトピック」から行います。オブジェクトのトピックが有効になると、そのオブジェクト種別のレコードで公開タグが無効になるので、公開タグを使っている場合は注意が必要です。・使ってみるトピックをレコードに追加するには詳細画面を開いて、タイトルの下にある「クリックしてトピックを追加」リンクをクリックします。(すでにトピックが追加済みの場合はリンク名が「トピック」になります)トピック名を入力して「完了」をクリックするとトピックが追加されます。追加されたトピック名をクリックすると、対象のトピックが付与されているレコードが一覧で表示されます。トピックはビューの絞り込み条件に指定することもできます。トピックを絞り込み条件に指定する場合は、絞り込みの項目で「トピック」を選びます。次はApexからトピックを操作してみます。ConnectApiネームスペースのTopicsクラスがこの辺りの処理の為のメソッドを持っています。トピックを追加するレコードのIDとトピック名を指定してトピックを追加します。(第1引数はコミュニティのIDでコミュニティに対してトピックを追加する時でなければ、nullを指定します。topicName);トピックのIDを指定して削除します。(第1引数のコミュニティIDの扱いは追加の時と同じです。topicId);トピックが追加されているレコードの一覧はTopicAsssignmentオブジェクトから取得できます。'0TOU00000008eP6OAI'EntityIdにレコードのID、TopicIdにトピックのIDが入っています。(組織でコミュニティが有効化されている場合はオブジェクトにNetworkIdカラムが追加され、ここにコミュニティのIDが入ります。)・権限トピック機能を扱うにはトピックの権限とレコードに対する権限が必要です。レコードへのトピックの追加・削除に必要です。トピックそのものを作成するのに必要です。トピックそのものを削除するのに必要です。トピックそのものを編集するのに必要です。トピックを割り当てるには対象のレコードを更新できる必要があります。参照権限のみの場合は、参照はできますが、割り当てはできません。トピック機能は種類の異なるオブジェクトを関連づける事もできるので、うまく使って効果的にレコードを整理してみてください。レコードの閲覧日時と参照日時を参照する最近使ったXXX的な一覧を作ってみたくなったことはありませんか。各オブジェクトに追加されています。「LastReferencedDate」と「LastViewedDate」がその項目です。この2つの項目はどちらも読み取り専用の項目で、違いは項目の値が更新されるタイミングです。詳細は次の表にまとめましたのでご覧ください。更新されないこのように画面で操作したときは上のタイミングで項目が更新されるのですが、Apexからの操作の場合は何もしなければこの2項目は更新されません。Apexから更新したい場合は次のオプションを付けたSELECT文を発行することでこれらの項目を更新することができます。VIEW」オプションを付与します。REFERENCE」オプションを付与します。REFERENCE機会があったら使ってみてください。