DX攻略部がリニューアルしました!

Salesforceの商談商品とは?少し特殊な標準オブジェクトを解説!

こんにちは、DX攻略部のヘナトンです。

さっそく質問ですが商談商品をうまく理解できていますか?

Salesforceを利用する上で、商談は分かる商品も分かる、でも商談商品がよく分からずうまく使いこなせていないケースも多いのではないかと思います。

また、デフォルトで表示されているため、なんとなく使っているケースもあると思います。

今回は商談商品をSalesforce構築側の視点から見て、理解を深め、有効活用していくことを目標に解説していきます。

商談商品の関わるオブジェクト構成

なぜ商談商品オブジェクトが少し難しいかというと、ズバリ商談オブジェクトと商品オブジェクトが直接つながっているように見えてつながっていないからです。

商談オブジェクトと商品オブジェクトは直接参照関係にあるわけではなく、間に中間オブジェクトとして商談商品オブジェクトを挟むことによって多対多の関係を構築しているのです。

もし商談オブジェクトと商品オブジェクトが直接つながっていたとしたら、、、

まずは商談AとBに対して3つの商品(商品A、商品B、商品C)があるパターンを考えましょう。

商品は商談を参照している、つまり商談が親で商品が子の関係です。

それぞれの商品は商談を参照する項目(商談1)があります。

ここまでは何の問題もありません。

商談Bでも同じ商品を使用したいとなるとそれぞれの商品に商談を参照する項目(商談2)を作成しなければなりません。

商談Cでも同じ商品を使用したい、商談Dでも同じ商品を、商談Eでも、、、となっていくと非常に多くの参照関係項目が必要となります。

現在Salesforceの仕様で1オブジェクトに参照関係項目(主従関係を含む)は50個までですから同じ商品を使用できる商談は50個までとなり、あまり使い勝手のよくない組織ができてしまいます。

逆に商品を親にし、商談を子にしたパターンを考えても同様に一つの商談で50個までしか商品を選択できないこととなり、同じくあまりよくないですね。

(お客様が100種類の商品が欲しい!とせっかく言っているのに、システム上できませんと言うのは損失ですよね、、、。)

また、同じ商品でも割引等を行い、別々の価格を設定することがあると思いますが、商談と商品が直接つながっている場合は同じモノでも価格が異なれば別の商品レコードを作成しなければなりません。

そうなると、売れ筋商品の分析の際も別の商品レコードをまとめる必要があり、なかなかキレイに集計できません

救世主、商談商品!

上記のような問題のある構造を解決してくれるのが中間オブジェクトとしての商談商品です。

商談と商品の間に商談商品を挟むことで「商談:商談商品=1:多」「商品:商談商品=1:多」の二つを同時に構成し、結果として「商談:商品=多:多」の関係を構築できるのです。

同じ商品を多くの商談で使う際は、同じ商品を参照し別々の商談を参照する商談商品を作成すればよく、

一つの商談で多くの商品を扱いたい場合は、同じ商談を参照し別々の商談を参照する商談商品を作成すればよく、

参照関係項目の作成限度に縛られることはありません

さらに商品に価格をもたせることなく、商談商品に価格を持たせることで、同じモノで異なる価格の場合、同じ商品を参照し異なる価格設定をした商談商品が増えるだけなので毎度同じ商品を使い回せます。

商談商品の項目情報

以下、商談商品特有のの標準項目一覧表です。

もちろんこれにカスタム項目を追加することも可能です。

商談商品(OpportunityLineItem)
項目表示ラベル API名 データ型 備考
商談商品名 Name テキスト 商談名と商品名を合わせたテキスト項目。編集不可。
商談 OpportunityId 参照関係 商談を参照する項目。
商品 Product2Id 参照関係 商品を参照する項目。
商品コード ProductCode テキスト どの商品かを識別するコード項目。
リスト価格 ListPrice 通貨 価格リストによる商品のデフォルトの価格。編集不可。
販売価格 UnitPrice 通貨 商品の単価。デフォルトはリスト価格。
数量 Quantity 数値 商品の数。
小計 Subtotal 通貨 販売価格×数量。自動で計算され、編集不可。
割引 Discount パーセント 割引率。
合計金額 TotalPrice 通貨 小計から割引額を引いた最終的な金額。編集不可。
提供日 ServiceDate 日付 商品を提供する日付。
明細説明 Description テキスト メモ欄。

商談商品に関わるApexやフローなどを作成する時の注意事項

商談商品に関わるオブジェクト構成でも説明したように、商談商品を中間オブジェクトとして考慮した開発をしなければなりません。

例えば、商談を関連するレコードとともにコピーするプログラムを作成する際は、商品レコードではなく商談商品レコードをコピーします。

また、商談商品が関わるApex ClassのTest Classでは商談や商品だけでなく商談商品レコード(テストレコード)も用意しないとエラーが出ます。

(この場合、価格表などもテストレコードとして必要ですがここでは割愛いたします。)

商談商品のオブジェクト構成や役割を十分に理解していれば、何の問題もありませんが、商談商品を意識した開発ができるとより効果的なシステムを構築し、運用できると思います。

まとめ

Salesforce初学者には少し難しい商談商品の解説をしましたが、少しはご理解の手助けになったでしょうか。

商談に商品を自動追加するような機能開発の発注も少なくありません。

その際、商談商品オブジェクトの理解が必須となってきますのでご参考になればと思います。

最後までご覧いただきありがとうございました。