Dynamics CRM 2011 次のアップデートで壊れる可能性のあるスクリプトの対応

※ 2012年 11月 27日 カスタムコード検証ツールが公開されているため、情報を追加。
※ カスタムコード検証ツールはこちらのリンクをご覧ください。

みなさん、こんにちは。

以前お伝えしたように、今後 Microsoft Dynamics CRM 2011 はマルチブラウザを
サポートする予定です。利用者の方はとても楽しみである反面、開発者の方は
開発したスクリプトが正常に動作するか心配ではないでしょうか。

先日 US チームで JScript に関する記事が公開されたので、紹介します。

情報元 : Resolve Breaking Script Issues When Upgrading to the Next Release of Microsoft Dynamics CRM

背景

私たちは Microsoft Dynamics CRM をご利用の方々に、素晴らしい体験を提供
したいと思っています。その一環として次のアップデートでは、複数のブラウザ
をサポートするために、Web アプリケーションが大幅に変更されます。

この変更により Microsoft Dynamics CRM を利用するユーザーや組織が増加
することが見込まれ、ソリューション提供者の方々にも、今後より多くの機会が
あると考えていますが、その際、既存のソリューションが、新しいアップデートに
対しても機能することが重要となります。その目標を達成するため、すでに
私たちが認識しているスクリプトに関する問題の情報を提供し、また解決の
ためのガイドラインを示したいと思います。

Microsoft Dynamics CRM では JScript を利用したクライアント拡張が可能であり、
Software Development Kit にてサポートされる実装方法や数多くのサンプルを
提供しています。サポートされていない手法で開発を行っている場合、今後の
アップデート適用時にそれらの機能が動作しなくなる可能性があります。

しかし、ビジネス要件により、サポートされない方法を利用せざる得ない場合
があるでしょう。この場合、将来にわたり機能が動作する保障がありません。
これは、その機能が Web ページの特定の構造に依存している場合に、その
構造が予告なく変わる可能性があるからです。

今回、複数のブラウザをサポートするにあたり、ページに多くの変更が発生する
ため、サポートされていない方法で開発したコードが動かなくなる可能性が高く
なります。これを機に現在のコードの見直しと対応を行ってください。

尚、現在のコードが引き続き動作するか確認する最良の方法はベータ版を
利用することです。ベータ版であるため、出荷版とは動作が異なる可能性が
ありますが、既存の問題を見つける手掛かりになります。ベータ版に関しては
こちらの記事をご覧ください。

問題のあるコード

既存のコードレビューを行うため、現在 Microsoft Dynamics CRM オンラインで
利用されているスクリプトをレビューしたところ、いくつかのコードではエラーが
出力されるか、まったく動作しないことを確認しました。今後、開発したコードに
問題があるかを確認するためのツールをリリースする予定ですが、以下に
いくつか例をあげます。

getElementById 関数

この関数は Web アプリケーション開発でよく利用される関数で、ページの
要素にアクセスするため利用します。しかし Xrm.Page オブジェクトモデルを
利用してページ要素にアクセスする方法のみがサポートされているため、
getElementById 関数を利用しているコードが存在するか確認してください。

HTML Web リソース上の要素にアクセスする場合はこの関数が利用できます
が、Microsoft Dynamics CRM アプリケーションの要素にアクセスする場合は
Id 属性が常に同じである保障はありません。この問題を避けるためには、
Xrm.Page オブジェクトモデルを利用してください。

crmForm の問題

Microsoft Dynamics CRM 2011 以前のバージョンでは、crmForm API が提供
されていました。この API を利用したスクリプトは互換性があるため、現在も
引き続き動作しますが、新しいコードでは Xrm.Page API を使用してください。
時期アップデートでは、crmForm API は Internet Explorer のみ動作します。

ほかのブラウザもサポートするためには、既存のコードを Xrm.Page を利用
して更新してください。既存のコードのアップグレードについては、以下情報
をご参照ください。

 スクリプトの Microsoft Dynamics CRM 2011 へのアップグレード

また crmForm API を利用しているものの、ドキュメントに無いプロパティを
利用している場合には、Internet Explorer を利用しても問題が発生する
可能性があります。以下にその例を挙げます。

crmForm.SetFieldReqLevel

このコードは時期アップデートでは動作しません。これはフィールドの要求
レベルを変更するものですが、Xrm.Page の setRequiredLevel メソッドを
利用してください。

crmForm.SubmitCrmForm

この内部関数はレコードを保存する場合利用されていますが、サポート
される方法は Xrm.Page.data.entity.save です。もし個別のフィールドの
動作を指定したい場合は、setSubmitMode 関数を利用してください。

※ setSubmitMode については、こちらの記事でも紹介しています。

crmForm.detachCloseAlert

この内部関数は、データが変更されたが保存せずに画面を閉じた場合
に表示される警告を表示させないために利用されていますが、getDirty
を利用すれば同じことが行えます。サポートされる方法は、フィールドが
"dirty” である場合に、setSubmitMode 関数で never を指定することです。

crmForm.IsValid

この内部関数は、必須フィールドに値が入っているかを確認するため
利用されますが、もうこの関数は存在しません。変わりに以下の方法で
確認が行えます。

例:

var requiredAttributesWithNullValues = [];
Xrm.Page.data.entity.attributes.forEach( function (attribute, index)
{
    if (attribute.getValue() == null && attribute.getRequiredLevel() == "required")
   {
      requiredAttributesWithNullValues.push(attribute);
    }
  }
);
if (requiredAttributesWithNullValues.length > 0)
{
  var message = "The following fields cannot be null:\n";
  for (var i = 0; i < requiredAttributesWithNullValues.length; i++)
  {
    message += requiredAttributesWithNullValues[i].controls.get(0).getLabel() + "\n";
  }
  alert(message);
}

crmForm.<attribute name>.Clear

この内部関数は、フィールドから値を削除するために利用されますが、
サポートされる方法は Xrm.Page.getAttribute("<attribute name>").setValue(null);
です。

crmGrid の問題

crmGrid オブジェクトはグリッドコントロールを表しますが、今までに
このオブジェクトに対するサポートは行われていません。現在の
ところ、フォーム上のサブグリッドに対して refresh メソッドが提供
されているのみです。

crmGrid.InnerGrid

この内部関数は、グリッド内のレコードの値や数を取得するために利用
されていますが、スクリプトでサポートされる方法はありません。

ただし、リボンからスクリプトを実行する際にグリッド内のレコードの
情報が必要な場合は、<CrmParameter> (RibbonDiffXml) を利用して
スクリプトの情報を渡すことができます。もし既存のコードでこの関数を
利用している場合には、機能をリボンに移すことを検討してください。

crmGrid.GetParameter

この内部関数は、グリッドのパラメーターにアクセスするために利用
されていますが、<CrmParameter> (RibbonDiffXml) を利用したリボンに
機能を移すことを検討してください。

Lookup コントロールの問題

Lookup コントロールでもいくつかの問題が見つかっています。

LookupControl.AddParam

AddParam 関数を利用して Lookup にパラメーターを追加している場合、
代わりに addCustomView を利用してください。

LookupControl.AddItems

この内部関数は、Lookup コントロールにアイテムを追加するために
利用されていますが、代わりに setValue を利用してください。SDK では
サンプルを提供しています。Set Lookup Attribute Value サンプルを
参照してください。

まとめ

Microsoft Dynamics CRM 4.0 からアップグレードした環境では、古い
コードやサポートされないコードを頻繁に利用していることがあります。
ぜひこのタイミングで一度コードを見直してください。

‐ Dynamics CRM サポート 中村 憲一郎