[SFDC vs D365]フィールドの作成(所属選手編)

項目作成第3弾。
今回は所属選手(Contact)のエンティティになります。
少し難易度が上がります。

スポンサーリンク

移行元のオブジェクトは?

まずは、Salesforceから。
所属選手(取引先責任者)オブジェクトで以下の項目を作成します。
細かく突き詰めたら、項目はいっぱいありますが、まずはこのくらいにしておきます。

グローバル選択リストの使用

血液型は、グローバル選択リストを使用します。
[設定]→[ビルド]→[作成]→[選択リスト値セット]から、選択リストを定義します。

数式で年齢を算出

年齢は、本日日付と誕生日から計算します
数式はこのように定義しています。

IF(
(MONTH(TODAY()) * 100 + DAY(TODAY()) ) - (MONTH( Birthdate) * 100 + DAY(Birthdate))<0, /* 今年の誕生日が完了しているかの判定 */
YEAR(TODAY()) - YEAR(Birthdate) - 1, /* 完了していない場合は、今年分をカウントしない */
YEAR(TODAY()) - YEAR(Birthdate) /* 完了していないる場合は、今年分をカウントする */
)

この式のポイントとして、日付を数値化して大小関係をを比較しています

「月*100 + 日」とする事で、月日を4桁数値に変換しています。
1/1⇒101、12/31⇒1231といった具合です。

今年の誕生日が完了しているかは、本日日付と誕生日の月日を数値化した値を比較して、本日日付<誕生日ならまだ誕生日が完了していないことになります。
この日付の数値化テクは、よく使うので覚えておきましょう。

もし、数値化しないとなると、月と日でそれぞれIF文をかけることになるので、ちょっと面倒です。
ちなみに、今回は使いませんでしたが、年も計算に入れる場合は、「年*10000 + 月*100 + 日」とします。

所属選手エンティティを移行

次にDynamics側、所属選手エンティティはこのようになります。

ソリューション定義のオプションセットを使用

まずは、Salesforceではグローバル選択リストで設定した血液型から。
オプションセットの選択値は、各項目内で設定することはできますが、グローバル選択リストに相当するものもあります。
ソリューションの[コンポーネント]→[オプションセット]から定義が可能です。

新規でオプションセットを定義します。
グローバル選択リストと同じような定義内容になっているため、同じように設定します。

あとは、フィールド設定の際に作成したオプション設定を指定してあげればOKです。
「既存のオプションセットの使用」で「はい」を選べば同等の設定ができます。

レコードタイプが使えない!

お次は、ポジションフィールドの移行。
ただ、困ったことにレコードタイプが使用できません

Salesforceのレコードタイプは単なる選択肢だけでなく、レコードタイプごとにページレイアウトや選択リスト値を変えることができ、容易にデータの区分けができる優れモノだったのですが、残念ながらDynamicsではそれらができないため、オプションセットで選択肢のみを移行することになります。

ページレイアウトや選択リストの切り替え機能は、スクリプトを組んで対応することになりますがそれはまた別の話で。

計算フィールドはあるけれど…

数式の移行についても、少し注意が必要です。
Dynamicsにも計算フィールドがあるので、それを使って年齢を定義しようとすると…

現在の関数でdatetime型のbirthdateは使用できません

おおっと、エラー。

調べてみると、

すべての DIFF 機能では、最初の日付と時刻フィールドと 2 番目の日付と時刻フィールドの動作が、ユーザー ローカル日付のみ、またはタイム ゾーン非依存のいずれかと同じであることが要求されます。 2 番目のフィールドの動作が最初のフィールドの動作と一致しない場合、2 番目のフィールドを現在の関数で使用できないことを示すエラー メッセージが表示されます。

つまり、NOW()は時間を含む形式ですが、生年月日は日付のみなので2つの型が合っていないからエラーになるんですね。

じゃあ、NOWではなく、TODAY関数的なものを使えばいいんじゃない!?
→ない…

NOWを日付形式に使用できないかなぁ
→できない…

とにかく、数式を数値化するなど、駆使して何としてでも算出できないか!?
計算フィールドで扱える式を調べました。
→少ない…。そして、ない!!!

詰みました…。
年齢の計算に本日日付を使っているんですが、数式の中には取り込めないようですね

生年月日は標準項目なので、それとは別に日時で入力可能はカスタムの生年月日を作るという対応策はあるんですが、生年月日で時刻を入れるのも何だ違和感あるので、今回は計算フィールドは諦めてDynamics側では整数型のフィールドを持たせるだけにします。
別の手段で、計算させて値を保存する方法にします。

>追記
標準項目の生年月日ではなく、ユーザーローカルのカスタムの誕生日項目を使用すれば年齢の算出が可能です。
こちらに具体的な手順を載せています。

項目比較

移行前と移行後を比較してこうなりました。

前述したように、レコードタイプと数式は移行が不十分なので、別に補う必要があります
レコードタイプのレイアウトや選択リスト値の切り替えに代替できるのは、スクリプトにより表示の切り替えに相当します。
数式は計算フィールドの範囲外であるならば、ワークフローやプラグインを使用して項目自動セットで対処する必要があります。

まとめ

  • グローバル選択リストの移行は可能
  • レコードタイプにあたる機能はDynamicsにはなく、オプションセット+スクリプト等で対応
  • 計算フィールドはSalesforceの数式項目に比べ貧弱

コメント