tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:無効な商談フェーズとパス表示について

最近ハマった無効な商談フェーズとパス表示についての話です。商談のセールスパスを有効化すると画面にパス表示ができるようになっています。


商談画面から入力できるのはフェーズ項目で有効な選択リスト値のみとなっています。

※ちょっと補足 - この組織では選択リスト値は翻訳設定で日本語変換しています。


無効な商談フェーズの値がセットできてしまうのはどんな時かというと、API経由でのデータ更新時です。例として以下のような場面があります。

  • Apexトリガ
  • データローダ


次のように適切な値であればフェーズもパスも当然正しく表示されます。


次に異常値となる無効な商談フェーズをセットした場合です。値としてセットはできますが、パス表示部分で明らかにおかしい状態であることを確認できます。これが通常の異常値セットの表示状況です。

本題

ここからが本題となりますが、設定上、有効/無効の両方に存在しない値、「Closed」をセットした場合について紹介します。まずは改めてリスト値として存在していないことのキャプチャから。


先程と同じくAPI経由での値セットを実行します。


実行結果はこちら。異常値でも値セットが可能なのは先程と同じですが、パスの表示がクローズ済扱いとなってしまいます。


パスの色はクローズ済扱いですが、データとしては商談完了フラグ(IsClosed)と商談成立フラグ(IsWon)はともにチェックOFFとなっています。つまり完了でも失注でもない扱いのデータです。


データの確認をしやすくするためのパス機能なので、そこが誤った表示になっていると業務に支障がでます。もしもClosedの値がセットされてしまうといった事象が発生するようでしたら、入力規則で「Closed」の値はブロックする対応の検討が必要かと思います。

入力規則の値ブロックのイメージです。実際は標準画面から無効な値のセットできないのでこの画面で表示されるとしたら商談トリガのBefore Update処理などの場面です。

無効な値がセットが発生するケースについて

商談の標準画面の操作からは無効な値をセットすることはできません。なのでもし商談画面で操作したあとにフェーズに異常値がセットされている場合は、Apexトリガの処理が存在していると思われます。このケースが発生する場合は、システム開発のバグとなりますので開発者側で調査実施と、処理が存在していた場合は修正対応が必要する形となります。


商談画面以外の場合、データローダのような外部ツールからの操作によるフェーズの値更新が行われるケースも考えられます。こうした外部ツールからのデータ更新も扱いとしてはAPIによる処理となっていますので無効な選択リスト値をセットすることが可能です。データローダはシステム管理者向けツールですので、ユーザが使用する場面は少ないと思いますが、ユーザ向けのデータ更新外部ツールもいろいろ存在していますので、そういったツールの使用を業務に組み込む場合は正しく使用されるように運用ルール等中止した方が良い箇所となります。(必要に応じて入力規則でブロックするといった対応も有効です。)

Apexでも外部ツールでの操作も見当たらない場合

無効なフェーズがセットされる事象が発生するのに社内開発したApexコード (一応フローとかも含む)でそれらしい値が見当たらない、ユーザも商談の標準画面から操作を行い、外部ツールからのデータ更新は行っていないことを確認できた。こんな状況に遭遇するケースも0ではありません。

この状況になった場合に考えられる可能性としてAppExchangeパッケージ処理の可能性があります。一般的にAppExchangeパッケージは管理パッケージとなっているため、ソースコードの内容をチェックしたり、どういった処理が実行されているかは不明となっていますが、当然ApexトリガやApexバッチによるデータ更新処理は存在しています。

社内開発の自動更新処理で無効な値セットが見当たらない場合はAppExchange側の処理で変更されているかもしれない点について確認が必要となります。

異常値発生の調査方法について

無効なフェーズのセットが再現性が高い場合、Sandbox組織で同様のデータを用意して一般的なデバッグ処理で調査を進めていくことができます。ですが、再現性が低い場合(年に数回とか、発生データをSandboxで試しても再現しないといった場合)は調査の実施も難しい状況になります。

その場合の対応方法については次のようになるかと思います。

①まずは入力規則で無効な値をブロック
これをやっておかないと異常値に気づかず商談がそのままになってしまいます。エラーにすることで異常値発生に気づけるようにします。

②異常値発生の再現を待つ
Sandbox環境などで検証しても再現性が無いことが前提ですが、異常値の発生を待つ形となります。①の入力規則追加でエラーになるので、ユーザ側と連携して発生したら連絡してもらうようにします。

③再現したらデバッグログ機能でログ取得
エラー再現の連絡があったらユーザ側と連携してログ取得になります。管理者ユーザであれば開発者コンソールが使えるかもしれませんが、一般ユーザの場合はそうは行かないため、設定メニューのデバッグログ機能で対象ユーザを指定してログ取得します。


デバッグログ取得できたら内容調査を行えば原因特定に繋がる情報が見つかるかもしれません。見つからない場合もログをダウンロードしてSalesforceサポートに相談するなど次のアクションに繋げることができると思います。(AppExchangeの管理パッケージの処理の場合はログ出るのか不明ですが..)


無効な商談フェーズとパス表示についての話はこんな感じです。