SOQLセールスフォースの豆知識セールスフォースの開発に役立つTIPSをメインに、新機能や関連ニュースなどをお届けします。(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機会があったら使ってみてください。今日は、SOQLでのコレクション(List、Set、Map)とバインド変数に関する小技をご紹介。○SetやMapでSOQLの結果を直接受け取る方法SOQLの結果は通常Listで受け取りますが、↓のように、コンストラクタを使って、SetやMapで直接受け取ることができます。Account]);○IN句でコレクションを使用する方法SOQLのIN句では、バインド変数にListとSetを使用できます。Setを渡すようにすると使用できます。:nameMap.keySet()];○動的SOQLでバインド変数を使用する方法[]内のSOQLの中でないと、バインド変数は使用できないと思われがちですが、動的SOQLでもバインド変数が使用可能です。↓のように、Database.queryメソッドに渡すSOQL文字列にそのままバインド変数を記述すれば使用できます。今回はSOQLのサブクエリの結果の取得方法をご紹介。そんなの知ってるよ、という方が多いかもしれませんが、Web上にサンプルが少ないようなので紹介しておきます。下記は、指定した取引先番号の取引先に紐付く取引先責任者情報を取得するサンプルApexコードです。例のように、サブクエリの結果セットは、「.子リレーション名」で取得できます(ac.Contactsの部分)。'10から集計関数が利用できるようになりました。APIバージョン18以上で使用可能のようです。合計値こんな感じで↓使用します。NameApexではクエリ結果を、AggregateResult(複数の場合はList<AggregateResult>)で受け取り、AggregateResultオブジェクト.get('名称')で値を取得します。集計関数の名称は↓のように付けます(maxNumが名称)。Name集計関数の結果取得部分のソースコードはこんな感じ。(金)SOQLでのリレーションの辿り方SQLでは動的に列を指定して表を結合することができますが、SOQLでは動的に結合することはできません(そもそも結合ができない)。SOQLではオブジェクト間に予めリレーションを設定しておくことにより、リレーションを辿ってのデータ参照が可能となります。いうことで、今日はSOQLでのリレーションの辿り方をご紹介。子オブジェクトから親オブジェクトへは、リレーション名を使用してリレーションを辿ります。なります(標準項目のリレーション名は予め設定されています)。SOQLのFrom句には必ず基点となるベースオブジェクトを指定しますが、ベースオブジェクトから最大5段階まで親のリレーションを辿ることができます。子リレーション名を使用してリレーションを辿ります。'10からは、子リレーション名が必須項目となり、そのようなこともなくなりました。子リレーション名は自オブジェクトの複数形で付けることが一般的なようです(分かりやすいですしね)。ContactからAccountへリレーションを結ぶ場合は、子リレーション名をContactsにします。SOQLでは、メインクエリのFrom句にベースオブジェクト名を、サブクエリのFrom句に子リレーション名を指定して、データを取得します。ここで重要なのは、親から子へは1段階しかリレーションを辿ることはできない、ということ。指定したベースオブジェクトの子オブジェクトのみリレーションを辿ることが可能です。子の子や親の子などはアクセス不可です。u親から子へ1段階しか辿ることができないというのは、かなり大きな制約です。データモデルの設計時には必ず覚えておきましょう。言いつつ、もうそろそろ、2段階、3段階と子リレーションを辿れるようになるんじゃないか?と淡い期待もしてたりします(集計関数も使えるようになりましたしね)。・HerokuやAWSなどのクラウドプラットフォーム上でのWebアプリケーション開発エンジニア、マネージャーを募集中です。・認定デベロッパーが在籍している、セールスフォースパートナーです。partnersにも登録されています。Salesforce/Force.com導入支援サービス弊社の認定プロフェッショナルが支援致します。・Salesforceと連携するWebアプリ開発も承っております。セールスフォースご検討の際は、お気軽にお問合せください。参加レポートSalesforceはじめました。その4Salesforceはじめました。その3Salesforceはじめました。その2Salesforceはじめました。sharingキーワード)。