Quantcast
Channel: Japan Microsoft Dynamics 365 Team Blog
Viewing all 589 articles
Browse latest View live

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 7

$
0
0

みなさん、こんにちは。

今回は既存のボタンに対するカスタマイズを紹介します。すでに
これまでの記事の内容を理解している前提となりますので、まだ
以前の記事をご覧でない場合、以下リンクを参照してください。

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 1
Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 2
Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 3
Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 4
Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 5
Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 6

シナリオ

取引先企業のグリッドコマンドバーにおいて、新規ボタンの画像
を変更し、文字列を「作成」に変更する。

image

サポートされる内容

コマンドバーのカスタマイズについては、既存のコマンド定義の
再利用はサポートされますが、JavaScript 関数の利用はサポート
されません。またコマンド定義についても将来的な変更や廃止は
すべて Microsoft がその権限を持っているものとされています。

既存ボタンのカスタマイズ

既存ボタンをカスタマイズするには、同じ ID を指定することで
上書きする必要があります。ただしデータベースのレコードを
上書きするわけではなく、カスタマイズが上位のレイヤーとして
挿入されるため、もともとある定義は変更されません。

1. Command Bar Test ソリューションをエクスポートして、解凍
した Customizations.xml を開きます。

2. 以前紹介した方法ですでに新規ボタンの ID を探します。該当
の Button 定義をまるまるコピーします。

3. エンティティリボンに以下の CustomAction を追加します。
Button 定義はコピーしたものを張り付けます。

LabelText とImage16by16 のみ変更しています。

image

4. 変更を保存してソリューションをインポートした後、すべて
のカスタマイズの公開を行い、ブラウザをリフレッシュします。

5. 取引先企業グリッドを表示します。

image

6. ボタンをクリックして、新規ボタンと同じ動作となるか
確認します。

必要に応じて複数言語対応も検討してください。

まとめ

コマンドバーのカスタマイズは Customizations.xml を直接編集
する必要があるため、慣れが必要です。また複数の方法で同じ
結果を達成できるため、要件や状況に合わせて適切な方法を
選択する必要があります。

ただし、既定のボタンを隠したい場合はまず権限をはく奪する
ことで対応するように検討してください。

- 中村 憲一郎


Dynamics CRM 2013/Fall '13 フィールドレベルデータの暗号化

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics CRM
Online Fall '13 の新機能である、フィールドレベルデータの暗号化機能に
ついて紹介します。

概要

Microsoft Dynamics CRM 2013 および、Microsoft Dynamics CRM Online
Fall '13 では、以下エンティティのフィールドを暗号化できます。

エンティティフィールド
EmailServerProfileIncomingPassword
EmailServerProfileOutgoingPassword
MailboxPassword
QueueEmailPassword
UserSettingsEmailPassword


暗号化は、SQL Server の機能を利用しています。

以下に重要なポイントを紹介します。

・暗号化機能を一旦有効にすると無効化はできません。
・オンライン環境は既定で有効となっています。
・設置型環境は手動で有効にする必要があります。
・暗号化対象のフィールドはカスタマイズできません。
・暗号化対象のフィールドはインデックスを利用できません。
・暗号化対象のフィールドは監査対象にできません。
・既定で暗号化されるフィールド以外を暗号化することはできません。
・暗号化されているフィールドの作成、編集、削除は通常通りできます。
・暗号化されているフィールドを読み取ると null が返されます。
・暗号化キーは最低年に一度変更することを推奨します。
・暗号化キーの変更には、キーを守るため HTTPS 通信が必須です。
・暗号化が有効な組織を他の環境にインポートした場合、暗号化キー
が必要となります。組織のインポート完了後、画面よりキーを入力
します。手順は後述します。

関連権限

暗号化キーの管理について、以下の権限が追加されています。

[コアレコード | その他の特権]
image

キーの確認および設定方法

1. 設置型の場合は証明書を登録して SSL 対応を行います。
※展開マネージャーの Web アドレスも変更が必要です。SSL 化の詳細は
実装ガイドを参照してください。

2. ブラウザで Microsoft Dynamics CRM 2013 に接続します。ユーザーは
必要なデータ暗号化キー関連の権限を持っている必要があります。また
設置型の場合は PrivUserGroup セキュリティグループのメンバーである
必要があります。

3. 設定モジュールよりデータ管理 | データ暗号化をクリックします。

image

4. キーを確認したい場合、暗号化キーの表示ボタンをクリックします。
変更する場合はキーを入力して、変更ボタンをクリックします。

image

組織のインポート

要でも紹介しましたが、暗号化が有効な組織を他の環境にインポート
する場合、インポート完了後に、上記手順で以前の暗号化キーを入力
する必要があります。そのため、組織をインポートする前にキーを
確認してください。

SDK

フィールドレベルデータの暗号化機能は以下メッセージをサポート
しています。

IsDataEncryptionActiveRequest : 暗号化が有効か確認
RetrieveDataEncryptionKeyRequest : 暗号化キーの取得
SetDataEncryptionKeyRequest ; 暗号化キーの設定

まとめ

重要なデータが暗号化されることは、セキュリティ上非常に重要
ですが、設定や管理が容易であることもまた重要な点となります。
今回のバージョンでは任意のフィールドを暗号化することは残念
ながらできませんが、素晴らしい機能ですので是非有効化して
ご利用ください。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 SDK Xrm.Page の新機能

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK Xrm.Page の新機能を紹介します。

追加された機能

以下に追加された Xrm.Page の機能一覧を紹介します。いくつかの
機能は実際のサンプルがあるとわかり易いため、個別に紹介します。

Xrm.Page.context.client.getClient
スクリプトが実行されているクライアントの種類を返します。
 
Xrm.Page.context.client.getClientState
スクリプトが実行されているクライアントの状態を返します。
 
Xrm.Page.context.getUserName
現在のユーザー名を返します。以前は ID しか取得できなかった
ため便利になりました。
 
Xrm.Page.data.entity.getPrimaryAttributeValue
主キーの値を返します。エンティティによって主キーの名前が
異なるため、同じ方法で取得できるのは便利です。

Xrm.Page.data.refresh
画面をリロードせずフィールドの値を再取得します。レコードが
他の場所で更新された場合にその値を反映することができます。
更新後保存するか、またその成否によって実行するコールバック
関数を指定できます。
 
Xrm.Page.data.save
画面をリロードせずレコードを保存します。また処理結果により
実行するコールバック関数を指定できます。
 
Xrm.Page.data.entity attribute.getIsPartyList
フィールドが複数参照か確認できます。
 
Xrm.Page.ui control.clearNotification
フィールドレベルのメッセージをクリアします。こちらの関数は
後日個別に紹介します。

Xrm.Page.ui control.setNotification
フィールドレベルのメッセージを表示します。こちらの関数は
後日個別に紹介します。

Xrm.Page.ui.clearFormNotification
フォームレベルのメッセージをクリアします。こちらの関数は
後日個別に紹介します。
 
Xrm.Page.ui.setFormNotification
フォームレベルのメッセージを表示します。こちらの関数は
後日個別に紹介します。

Xrm.Page.ui control.addCustomFilter
参照コントロールに対して FetchXML のフィルターを追加します。
こちらの関数は後日個別に紹介します。
 
Xrm.Page.ui control.setShowTime
日付コントロールに対して時刻も表示するか指定します。
 
Xrm.Utility.alertDialog
非同期アラートダイアログを表示します。こちらの関数は
後日個別に紹介します。
 
Xrm.Utility.confirmDialog
非同期確認ダイアログを表示します。こちらの関数は後日
個別に紹介します。

次回よりサンプルと共に利用方法を紹介します。お楽しみに!

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 SDK Xrm.Page.ui の新機能 その 1 - 参照コントロール関連

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK の新機能から参照コントロールに関連する
機能を紹介します。

参照コントロールの変更

今回のバージョンから参照アイコンをクリックすると 10 件の候補
を表示するようになりました。またダイアログを表示する場合も
ポップアップではなくオーバーレイ表示します。

[10件の候補表示]
image

[参照ダイアログ]
image

効率よく作業を行うためには 10 件の候補にレコードをいかに表示
するかが重要になります。

PreSearch イベントと addCustomFilter

PreSearch イベントを利用することで、ユーザーが参照アイコンを
クリックした際に処理を差し込むことが可能です。また差し込む
処理として addCustomFilter を利用することで検索クエリに対して
フィルター条件を追加することが可能です。

尚、PreSearch イベントは新 UI を持つフォームでのみ動作します。

シナリオ

営業案件レコードの取引先担当者を選択する際に、設定した取引先
企業に紐づくレコードだけを表示する。

例えばレコードが以下の状態の場合、取引先担当者を選択する際に
ファブリカム (サンプル) に紐づく担当者のみを表示する。

image

スクリプトの開発

上記シナリオを満たすスクリプトを開発します。

1. 任意のソリューションに対してスクリプト Web リソースを追加
します。ここでは以下の様に設定しました。

image

2. テキストエディターボタンをクリックします。

3. フィルターを設定するフィールドを取得する関数を追加します。
また取得したフィールドに対してフィルターを追加する関数を
実行します。

function addCustomFilterForContact()
{
  Xrm.Page.getControl("parentcontactid").addPreSearch(addLookupFilterForContact);
}

4. 上記関数から呼び出される関数を追加します。

function addLookupFilterForContact(){
  // フィルタに使う取引先企業の情報を取得
  var accountname = Xrm.Page.getAttribute("parentaccountid").getValue()[0].name;
  var accountid = Xrm.Page.getAttribute("parentaccountid").getValue()[0].id;

  // フィルタ条件を作成
  var filter = "<filter type='and'>" +
   "<condition attribute='parentcustomerid' operator='eq' uiname='" +
  accountname + "' uitype='account' value='" + accountid + "'  />" +
  "</filter>";

  // カスタムフィルタの追加
  Xrm.Page.getControl("parentcontactid").addCustomFilter(filter);
}

5. 保存して公開します。

6. 任意の営業案件フォームをフォームエディタで開きます。

7. 取引先企業の OnChange イベントに addLookupFilterForContact を
指定します。

image

8. フォームを保存した後、公開します。

動作確認

1. 任意の営業案件レコードを開きます。

2. 取引先企業を変更します。

image

3. 取引先担当者の結果がフィルターされることを確認します。

image

4. 取引先企業を空欄にして取引先担当者の参照をクリック
すると反応せず、画面遷移時にエラーが出ることを確認
します。これは取引先企業の参照が空欄である場合を考慮
していないからです。

removePreSearch

取引先企業参照がない場合を考慮したスクリプトに改修
します。

1. スクリプト内の addCustomFilterForContact 関数を以下の
ように書き換えます。

function addCustomFilterForContact() {
  // 取引先企業が設定せれていない場合
  if(Xrm.Page.getAttribute("parentaccountid").getValue()==null)
  {
    // 設定済の PreSearch を削除する
    Xrm.Page.getControl("parentcontactid").removePreSearch(addLookupFilterForContact);
  }
  else
  {
    // PreSearch を設定する
    Xrm.Page.getControl("parentcontactid").addPreSearch(addLookupFilterForContact);
  }
}

2. スクリプトを保存後、公開します。

3. 再度検証を行います。

まとめ

addCustomFilter を addPreSearch と組み合わせて使うことで、
フォーム上の値を利用した動的なフィルタを設定することが
可能です。また removePreSearch を活用することでフィルタを
解除できます。是非お試しください。

- 中村 憲一郎

Microsoft Dynamics CRM 2013/Fall '13 サーバー側の同期による電子メールの処理

$
0
0

みなさん、こんにちは。

Microsoft Dynamics CRM 2013/Fall'13 の新機能であるサーバー側の同期による電子メールの処理についてお知らせします。

Microsoft Dynamics CRM のサーバー サイドの同期の設定ですが、2013年11月時点では、次の構成でのみ使用することができます。

  Microsoft Dynamics CRM 2013 設置型 + Exchange Server 2010 / 2013 設置型

  ※ Microsoft Dynamics CRM 2013 設置型バージョンでも、Exchange Online との連携はサポートされておりませんので、ご注意ください。

以下のように [設定] > [電子メール アクセス構成] > [電子メール アクセス構成の設定] を確認すると、サーバーサイド同期の設定画面がありますが、Dynamics CRM Online Fall ’13 でのサーバーサイド同期は、サポート開始前となりますので、いましばらくお待ちください。



カスタマーセンターにその旨記載されていますので、参考としていただければ幸いです。

サーバー側の同期による電子メールの処理
http://www.microsoft.com/ja-JP/dynamics/crm-customer-center/email-processing-through-server-side-synchronization.aspx

CRM Online 環境ではこれまで通り、Outlook 用 Microsoft Dyanmics CRM クライアント、または Email Router をご活用ください。
E-mail Router で同期対象となるのは、これまで通り電子メールのみです。

サポートが開始されましたら、またブログでご案内いたします。

- Dynamics CRM サポート
  中尾 奈美

Dynamics CRM 2013/Fall '13 SDK Xrm.Page.ui の新機能 その 2 - フォームのメッセージ表示

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK の新機能からフォームのメッセージ表示
機能を    紹介します。

概要

Microsoft Dynamics CRM 2013 および、Microsoft Dynamics CRM
Online Fall '13 では、ポップアップを極力減らすよう開発されて
います。その一環として、必須項目が入っていない場合のエラー
などもすべてフォーム上に表示できるようになっています。

メッセージには情報、警告、エラーの 3 種類があります。

[フィールド上のエラー]
image

フォームスクリプトからもこのメッセージ表示が利用できるよう
関数が提供されています。またフォームレベルのメッセージも
同時にサポートされます。

フォームレベルのメッセージ

Xrm.Page.ui.setFormNotification および clearFormNotification を
利用してフォーム上にメッセージを表示することができます。

1. スクリプト Web リソースを作成します。ここでは以下の名前
を指定して作成しました。

image

2. テキストエディターボタンをクリックして、以下のコードを
追加します。

function showMyNotification()
{
  // message : 表示するメッセージ
  // level : INFO (情報)、WARNING (警告)、ERROR (エラー) の指定
  // uniqueId : 削除時に指定できる一意の ID
  Xrm.Page.ui.setFormNotification("フォームレベルのメッセージ", "INFO", "MyID");
}


function clearMyNotification()
{
  Xrm.Page.ui.clearFormNotification("MyID");
}

3. スクリプト Web リソースを保存して公開します。

4. 任意のフォームの OnLoad に showMyNotification を指定します。
ここでは取引先担当者のフォームに指定しました。

image

5. フォームを保存して公開します。

6. 任意の取引先担当者を開きます。メッセージが表示されます。

image

7. 同じフォームの任意のフィールドに対して OnChange イベント
で clearMyNotification を設定します。今回は役職を使用しました。

image

8. フォームを保存して公開します。

9. 任意のレコードを開き、メッセージが表示されることを確認
します。その後役職を変更することでメッセージが消える事を
確認します。

フィールドレベルのメッセージ

フォームレベル同様、フィールドレベルでもメッセージが利用
できます。ただしフィールドメッセージはエラーのみでレベルを
指定できません。

1. 作成したスクリプト Web リソースに以下コードを追加します。

function showMyFieldNotification()
{
  Xrm.Page.getControl("jobtitle").setNotification("フィールドレベル");
}
 
function clearMyFieldNotification()
{
  Xrm.Page.getControl("jobtitle").clearNotification();
}
 
2. 保存して公開します。

3. 取引先担当者フォームの OnLoad に showMyFieldNotification
を指定します。

image

4. 同じフォームの任意のフィールドに対して OnChange イベント
で clearMyNotification を設定します。今回は役職を使用しました。

image

5. フォームを保存して公開します。

6. 任意の取引先担当者を開きます。メッセージが表示されます。

image

7. 役職の値を変更してメッセージが消えることを確認します。

業務ルールの利用

業務ルールではフィールドレベルのメッセージのみ利用できます。

image

まとめ

フィールドレベルのメッセージはもちろん、フォームレベルの
メッセージでは情報、警告、エラーを選択できるため、状況に
合わせたメッセージを表示できます。レコードの整合性向上に
役に立ちますので、是非ご利用ください。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 SDK Xrm.Utility の新機能

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK の Xrm.Utility 新機能を紹介します。

概要

Microsoft Dynamics CRM for Tablet では window.alert 関数、および
window.confirm 関数をサポートしないため、代わりの関数として
Xrm.Utility.alertDialog、Xrm.Utility.confirmDialog を提供します。

いずれも画面処理をブロックせず、ユーザーがクリックしたボタン
に応じてコールバック関数を呼び出せるようになっています。

既存のスクリプトで window.alert を利用している場合には、自動的
にコールバックのない alertDialog 関数に置換されますが、将来的
にこの自動置換はサポートされなくなりますので、事前に既存コード
のアップグレードを行ってください。

Xrm.Utility.alertDialog

1. 任意のスクリプト Web リソースを作成します。ここでは以下の
名前で作成しました。

image

2. テキストエディターをクリックして、以下のコードを追加します。

function showMyAlert()
{
  Xrm.Utility.alertDialog("プライマリフィールドの値をフォームメッセージとして表示します。", mycallback);
}

3. alertDialog の第 2 引数に指定した関数を追加します。

function mycallback()
{
  var primaryvalue = Xrm.Page.data.entity.getPrimaryAttributeValue();
  Xrm.Page.ui.setFormNotification("プライマリフィールドの値は " + primaryvalue + " です。", "INFO", "MyNotification");
}

※ setFormNotification についてはこちらの記事を参照してください。

4. OK をクリックしてテキストエディターを閉じます。

5. 上書き保存をしてから公開します。

6. 任意のフォームの OnLoad に showMyAlert 関数を登録します。
ここでは発注に対して指定しました。

image

7. フォームの変更を保存して公開します。

8. 既存の発注レコードを開きます。メッセージが出たら OK を
クリックします。

image

9. フォームのメッセージを確認します。

image

Xrm.Utility.confirmDialog

基本的に Xrm.Utility.alertDialog と同じですが、OK または Cancel
ボタンに対してそれぞれコールバック関数を指定できます。

まとめ

タブレット対応を行う際に必須となる変更ですが、それ以外にも
コールバック関数を指定できるなど処理をわかり易く記述できる
メリットもあります。是非お試しください!

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 SDK サーバー API の新機能

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK サーバー API の新機能を紹介します。

組織サービスの非同期実行

これまで組織サービスの API はすべて同期で処理を行いましたが、
今回のバージョンより非同期処理が追加されました。現時点では
ソリューションのインポートのみが対象となります。

非同期での実行は Excute メソッドに対して ExecuteAsyncRequest
を渡して実行します。ExecuteAsyncRequest の Request メンバと
して ImportSolutionRequest を渡してください。

// ImportSolutionRequest 作成
ImportSolutionRequest importRequest = new ImportSolutionRequest()
{
    CustomizationFile = System.IO.File.ReadAllBytes(“<ソリューションファイルのパス>")
};

// ExecuteAsyncRequest 作成
ExecuteAsyncRequest request = new ExecuteAsyncRequest()
{
    // 作成した ImportSolutionRequest をアサイン
    Request = importRequest                    
};

// response.AsyncJobId でジョブ ID を取得可能
ExecuteAsyncResponse response = (ExecuteAsyncResponse)_serviceProxy.Execute(request);

非同期で実行されているため、作業完了を確認する場合は取得
した AsyncJobId を利用して AsyncOperation レコードの Status
を確認します。例えば以下のような方法が考えられます。

任意のループ内
// AsyncJob を取得
AsyncOperation myjob = (AsyncOperation)_serviceProxy.Retrieve( 
AsyncOperation.EntityLogicalName, response.AsyncJobId, new ColumnSet(true)); 
// ステータスが完了なら終了、それ以外なら 2 秒後再トライ 
if (myjob.StateCode == AsyncOperationState.Completed) 
  break; 
else 
  System.Threading.Thread.Sleep(2000);

イメージの操作

エンティティでイメージを利用する場合、以下スキーマが自動的
に追加されます。エンティティのイメージサポートについては
こちらを参照してください。

EntityImage_Timestamp : 最後に更新されたバージョン
EntityImage_URL : エンティティイメージへの直接アクセス URL
EntityImageId : エンティティイメージの固有 ID

イメージデータの取得

イメージ自体は EntityImage 属性に格納されていますが、サイズ
とパフォーマンスを考慮して、明示的に列を指定して取得しない
限りデータは取得できません。以下にコードを示します。

// 全ての列を取得。この場合イメージは含まれない。
ColumnSet cols = new ColumnSet(true);
Account retrievedAccount = (Account)_serviceProxy.Retrieve("account", _accountId, cols);

// イメージのデータを取得したい場合、明示的に entityimage を列として指定。
cols = new ColumnSet( new String[]{"name","entityimage"});
Account retrievedAccount2 = (Account)_serviceProxy.Retrieve("account", _accountId, cols);

はじめのコードでは EntityImage 列は null が返されます。

イメージの更新

イメージはバイトアレイとして画像を格納し、更新することで
変更が可能です。以下にコードを示します。

Account myAccount = new Account();                   
byte[] myimage = System.IO.File.ReadAllBytes(@"C:\sample.JPG");

myAccount.AccountId = _accountId;
myAccount.EntityImage = myimage;

_serviceProxy.Update(myAccount);

サイズは自動的に 144x144 にリサイズされます。

新機能に伴うメッセージの追加

フィールドの暗号化やアクセスチームなどの新機能に対応するため
メッセージが追加されています。

アクセスチーム関連
アクセスチームについてはこちらを参照してください。

AddUserToRecordTeamRequest
レコードに紐づく自動生成されたチームに対してユーザーを追加します。

RemoveUserFromRecordTeamRequest
レコードに紐づく自動生成されたチームよりユーザーを削除します。

ConvertOwnerTeamToAccessTeamRequest
所有タイプのチームをアクセスチームに変換します。
 
フィールドレベル暗号化関連
フィールドレベル暗号化についてはこちらを参照してください。

IsDataEncryptionActiveRequest
暗号化が有効か確認します。
 
RetrieveDataEncryptionKeyRequest
暗号化キーを取得します。

SetDataEncryptionKeyRequest
暗号化キーを更新します。

メタデータ関連の変更

AttributeMetadata.AttributeType は廃止となります。その代わり
AttributeMetadata.AttributeTypeName を利用してください。
この変更は ImageAttributeMetadata クラスをサポートするため
の変更となります。

まとめ

主に新機能に対応するための機能追加ですが、非同期での実行は
今後もサポートするメッセージが増えるようであれば期待できる
機能だと感じます。是非お試しください!!

- 中村 憲一郎


Dynamics CRM 2013/Fall '13 SDK FetchXML の新機能

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK FetchXML の新機能を紹介します。

結合結果に対するフィルタ

以前より FetchXML ではフィルタ機能が利用できましたが、クエリ
に結合がある場合、結合前のそれぞれのエンティティに対してのみ
フィルタが可能であり、結合した結果をフィルタすることはできま
せんでした。

Microsoft Dynamics CRM 2013 および、Microsoft Dynamics CRM Online
Fall '13 より結合結果に対するフィルタをサポートします。

サンプル

例えば潜在顧客を取得する FetchXML を考えると以下の様になります。

image

次に上記潜在顧客と紐づくタスクを取得する場合、以下の様になります。

image

上記の場合結合条件として outer を指定しているため、タスクが紐
付いていない潜在顧客も表示されます

この結果を利用して、まだタスクをもっていない潜在顧客を取得する
ことができます。

image

まとめ

FetchXML は SDK やカスタムレポートで利用できるクエリですが、
T-SQL に比較すると柔軟性が低いという課題があります。今回の
拡張で以前よりクエリの幅が広がりましたので一度お試しください。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1

$
0
0

みなさん、こんにちは。

今回から Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 の新機能である、ユーザー定義アクション (操作)
を紹介します。

概要

通常、ビジネスプロセスを把握し改善する担当者とシステムの開発、
保守を行う担当者は異なります。ビジネスアナリストはプロセスを
開発者に伝え、開発者はシステムにプロセスを実装します。

このモデルの場合、以下の様な問題が発生します。

- 開発者がビジネスプロセスを理解する必要がある
- 伝達ミス、相互理解の不足により問題が発生する
- プロセスを変更するたびに改修が入る

これらの問題を解消すべくユーザー定義アクションは導入されました。
アクションでは以下の機能を提供します。

- ビジネスアナリストは GUI エディターを利用して操作を作成
- 開発者は操作に関連付いた要求/応答を呼び出すプログラムのみ作成
- プログラムの完成後もビジネスアナリストは操作の編集を自由に行う
ことができる。(入出力パラメータが同じ場合)

早速具体例を見ていきます。

シナリオ

オープン状態の潜在顧客に対して電話活動が行われていない場合、
任意の担当者にメールで通知する必要があります。毎日 0 時にこの
処理をバッチ実行する予定ですが、今後担当者にメールで通知する
担当者の変更や、プロセスの追加が行われる可能性があります。

実装方式の候補

シナリオを実現するにはいくつかの方式が考えられます。まず夜間の
バッチ処理を前提としているため SDK でコンソールアプリケーション
を使用することはほぼ決まりとなりますが、処理自体は以下の選択肢
があります。

プロセスをコード内にハードコードする

これは今までの方法で、上記に挙げた問題が潜在的に存在します。

ワークフローを利用する

ワークフローを実行するフラグとなるカスタムフィールドを作成し、
その値のみを SDK で更新します。この場合ワークフロー側で実際
の処理を行えるためビジネスアナリストがワークフローの作成および
管理を行うことができます。

ただしフラグ用のフィールド追加や本質的には必要のないレコードの
更新処理が伴います。

ユーザー定義アクションを利用する

今回はユーザー定義アクションを利用します。メリット、デメリット
については今後の記事で紹介していきます。

操作の作成

まずビジネスプロセスに該当する操作を作成します。操作はワークフロー
と同じ要領で作成が可能です。

1. 設定モジュールよりプロセスを選択し、新規ボタンをクリックします。

2. カテゴリより操作、エンティティより潜在顧客を選択し、任意の名前
を設定します。ここでは潜在顧客のフォローアップとしました。

image

3. OK をクリックするとエディターが開きます。

4. 一意の名前を指定します。この名前が SDK より呼び出すメッセージ
名となります。ここでは followupLead としました。

5. 処理をトランザクションとして設定したい場合、ロールバックを有効
にするにチェックを付けておきます。またエラー発生時にログを見たい
場合は、エラーが発生したワークフロージョブのログを保持する項目で
チェックを付けておきます。

image

6. 入出力パラメーターを利用する場合はパラメーターの追加を行います
が今回はシナリオにないため省略します。

image

7. ステップの追加より電子メールの送信を追加します。任意の名前を指定
します。

image

8. プロパティの設定をクリックします。

9. 差出人で管理者を指定します。

10. 宛先に潜在顧客の作成者を指定します。

11. 任意の件名、本文を入力して、保存して閉じるをクリックします。

12. アクティブ化をクリックします。

操作がアクティブになれば準備完了です。

次回は SDK より定義した操作を呼び出す方法を紹介します。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 2

$
0
0

みなさん、こんにちは。

今回は前回に続き、SDK から操作を実行する紹介します。
前回からの続き物となりますのでご注意ください。

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1

事前準備

操作は関連付く要求/応答クラスのカスタム メッセージを提供
します。まずはこのメッセージ情報を取得する必要があります。

1. Microsoft Dynamics CRM 2013 SDK をダウンロードします。
http://www.microsoft.com/ja-jp/download/details.aspx?id=40321

2. コマンドプロンプトを開き、sdk\bin フォルダに移動します。

3. crmsvcutil.exe を /generateActions パラメータを指定して
実行します。crmsvcutil の使い方はこちらを参照してください。

例) オンライン環境の場合
>crmsvcutil.exe /url:https://<組織名>.api.crm5.dynamics.com/XRMServices/2011/Organization.svc /out:Xrm.cs /username:<ユーザ名> /password:<パスワード> /generateActions

4. 生成された Xrm.cs ファイルを開きます。

5. new_followupLeadRequest および new_followupLeadResponse
が生成されていることを確認します。

6. Visual Studio より C# のコンソールアプリケーションを作成
します。プロジェクト名は CustomActionSample としました。

7. 参照の追加より SDK\bin 配下の Microsoft.Xrm.Sdk.dll を追加
します。また以下参照を追加します。

System.DirectoryServices.AccountManagement
System.Security
System.ServiceModel
System.Runtime.Serialization
Microsoft.IdentityModel.dll

8. 以下のヘルパーコードを追加します。
sdk\samplecode\cs\helpercode\crmservicehelpers.cs
sdk\samplecode\cs\helpercode\deviceidmanager.cs

9. 生成した Xrm.cs を追加します。

10. 一旦プロジェクトをビルドしてエラーがないことを確認します。

コンソールアプリケーションの開発

1. 以下のコードを Program.cs に貼り付けます。簡単なサンプルの
ため、一切のエラーハンドリングはしていません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Crm.Sdk.Samples;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;

namespace CustomActionSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // ヘルパーを利用してサービスプロキシの生成
            ServerConnection serverConnect = new ServerConnection();
            ServerConnection.Configuration config = serverConnect.GetServerConfiguration();

            using (OrganizationServiceProxy _serviceProxy = ServerConnection.GetOrganizationProxy(config))
            {
                // 事前バインドの利用
                _serviceProxy.EnableProxyTypes();

                // オープンで電話活動がない潜在顧客の取得
                string fetch = @"<fetch version='1.0' output-format='xml-platform'
                     mapping='logical' distinct='false'>
                       <entity name='lead'>
                         <attribute name='fullname' />
                         <attribute name='leadid' />
                          <order attribute='fullname' descending='false' />
                         <link-entity name='phonecall' from='regardingobjectid'
                          to='leadid' alias='ab' link-type='outer'>
                           <attribute name='subject' />
                         </link-entity>
                          <filter type='and'>
                            <condition entityname='lead' attribute='statecode'
                             operator='eq' value='0' />
                            <condition entityname='ab' attribute='regardingobjectid'
                            operator='null' />
                          </filter>
                       </entity>
                      </fetch>";

                EntityCollection results =
                    _serviceProxy.RetrieveMultiple(new FetchExpression(fetch));

                // 取得したレコードに対してカスタムアクションを実行
                foreach (Lead lead in results.Entities)
                {
                    // 操作に紐づく要求の作成
                    new_followupLeadRequest request = new new_followupLeadRequest();
                    // アクションのターゲットとして取得した潜在顧客を指定
                    request.Target = new EntityReference("lead", lead.Id);
                    // 操作に紐づく応答の取得
                    new_followupLeadResponse response =
                         (new_followupLeadResponse)_serviceProxy.Execute(request);
                 }
            }
        }
    }
}

2. プロジェクトをコンパイルして、実行します。

3. 意図したとおり電子メールが作成されれば成功です。

重要な点は、開発者は new_followupLeadRequest/Response が
実際になにを行っているかは知る必要がなく、メッセージ名と
パラメータを理解するだけで良いという事です。

次回はプロセスの変更とトラブルシューティ��グを紹介します。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 3

$
0
0

みなさん、こんにちは。

今回はすでに公開済みの操作を変更するシナリオを紹介します。
前回からの続き物となりますのでご注意ください。

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 2

シナリオ

オープン状態の潜在顧客に対して電話活動が行われていない場合
これまでは担当者にメール通知をしていましたが、プロセス追加
により、メール通知以外にもタスクの作成も行います。

操作の変更

すでにアクティブ化した操作の変更は以下の手順で行います。

1. 設定モジュールよりプロセスを選択します。

2. アクティブ化済みの潜在顧客のフォローアップ操作を開きます。

image

3. 非アクティブ化ボタンをクリックして操作を非アクティブに
します。

4. ステップの追加よりレコードの作成を選択します。

5. 作成対象よりタスクを選択し、プロパティをクリックします。

image

6. タスクに必要な情報を入力して保存してください。

7. プロセスの変更が完了したので、エディターの画面でアクティブ
化をクリックします。

8. 操作が再びアクティブになります。

SDK からの実行

前回作成したアプリケーションを実行します。実行が完了したら
電子メールおよびタスクが作成されていることを確認します。

image

上記のようにプロセスの変更時に SDK の改修が不要であり、業務
プロセスだけを修正することが可能です。

次にエラーが発生した際のトラブルシューティングを紹介します。

トラブルシューティング

操作のトラブルシューティング方法はワークフローと同様の手順で
実施します。今回はエラーを発生させるため、上記の操作に関して
タスクの作成が失敗するようにカスタムプラグインを登録しました。

このカスタムプラグインのコードは以下の通りです。

public class MyPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        throw new InvalidPluginExecutionException("サンプルエラーが発生しました");
    }
}

SDK プログラムでのエラー

SDK プログラムには実行時のエラーが返ります。そのため内容に
応じたハンドルが可能です。

image

操作の履歴から確認

操作からも以下手順でエラーが確認できます。

1. 設定モジュールよりプロセスを選択します。

2. アクティブ化済みの潜在顧客のフォローアップ操作を開きます。

3. 画面左側にあるプロセス セッションをクリックします。

4. 失敗のログの記録されていることを確認します。

image

5. レコードを開いて詳細を確認します。

image

タスクの作成で失敗しているにも関わらず、トランザクションを
有効にしてることから電子メールの送信アクションも取り消しと
なっています。

トランザクション処理およびエラー処理の変更

操作では既定で 「ロールバックを有効にする」および「エラーが
発生したワークフロー ジョブのログを保持する」 が有効になって
います。必要に応じてオプションを変更することで挙動を制御する
ことが可能です。

オプションを変更した際の違いを実際にお試しください。

今回重要な点は、プロセスの変更およびエラー発生時のログ確認が
いずれも GUI から行うことができるという点です。よって開発者
の負担が減るばかりでなく、完全な分業が可能となります。

次回は操作に対する入出力パラメーターの利用を紹介します。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 4

$
0
0

みなさん、こんにちは。

今回は新規に入出力パラメータを利用する操作を作成し、SDK
から利用する方法を紹介します。前回までの内容を把握している
ことが前提となりますのでご注意ください。

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 2
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 3

シナリオ

作成後 1 か月以上週間経過したサポート案件に対して以下の
プロセスでエスカレーションを実施します。

- エスカレーション担当者にサポート案件をアサインする
- 担当者のウォールにエスカレーションされた旨を投稿する
- 元担当者のウォールにエスカレーションされた旨を投稿する

操作の作成

シナリオを満たせるよう、エスカレーション担当者を入力
パラメータとして受け取れる操作を作成します。また出力
パラメータのサンプルとしてすべての操作の最後に作業が
完了した旨を記した文字列を返すこととします。

1. 設定モジュールよりプロセスをクリックします。

2. 新規ボタンをクリックして、以下の様に操作を作成します。

image

3. OK をクリックします。

4. 一意の名前として new_escalateIncident と入力します。

5. プロセスの引数で [+] ボタンをクリックします。

image

6. 名前、種類、エンティティなど以下の様に指定します。
※必須出席者と表示されているのは表示バグであり、本来は
”必須” です。この入力パラメータが必須であるか指定します。

image

7. ステップの追加よりレコードの作成を追加します。

8. 作成から投稿を選択して、以下の様にプロパティを設定します。
動的な値で入力パラメーターで指定した値が利用できることを
確認します。

[ステップ]
image

[動的な値]
image

[投稿レコードのプロパティ]
image

9. もう一つ投稿作成ステップを追加します。

image

image

10. レコードの割り当てステップを追加します。動的な値で
入力パラメータで指定したユーザーに割り当てます。

image

11. 次に出力パラメータを追加します。プロセスの引数で
[+] ボタンをクリックして、以下の様に設定します。

image

12. ステップの追加より値の割り当てを追加します。

image

13. プロパティの設定をクリックし、以下の様に設定します。

image

出力パラメータが複数ある場合、ドロップダウンより任意の
ものを選択できます。

14. 操作を保存して、アクティブ化します。

SDK からの呼び出し

1. こちらの記事と同じ手順で SDK の準備を行います。

2. 以下のコードを Program.cs に貼り付けます。

using Microsoft.Crm.Sdk.Samples;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomActionSample
{
    class Program
    {
        static void Main(string[] args)
         {
            // ヘルパーを利用してサービスプロキシの生成
            ServerConnection serverConnect = new ServerConnection();
            ServerConnection.Configuration config = serverConnect.GetServerConfiguration();

            using (OrganizationServiceProxy _serviceProxy = ServerConnection.GetOrganizationProxy(config))
             {
                // 事前バインドの利用
                _serviceProxy.EnableProxyTypes();
               
                // エスカレーション担当者の GUID を取得するロジックをここに記述
                // 結果として GUID を取得したと想定
                Guid escalationEngineer = new Guid("F5D307DA-E434-E311-904F-D89D676560BC");
                // 1 か月以上前に作成され、エスカレーション担当者が所有者でないサポート案件
                string fetch = String.Format(@"<fetch version='1.0' output-format='xml-platform'
                    mapping='logical' distinct='false'>
                     <entity name='incident'>
                    <attribute name='title' />
                    <attribute name='ticketnumber' />
                    <attribute name='createdon' />
                    <attribute name='incidentid' />
                     <order attribute='title' descending='false' />
                     <filter type='and'>
                        <condition attribute='createdon' operator='olderthan-x-months' value='1' />
                        <condition attribute='ownerid' operator='ne' uiname=''
                        uitype='systemuser' value='{0}' />
                    </filter>
                     </entity>
                </fetch>", escalationEngineer.ToString());

                EntityCollection results =
                     _serviceProxy.RetrieveMultiple(new FetchExpression(fetch));

                // 取得したレコードに対してカスタムアクションを実行
                foreach (Incident incident in results.Entities)
                 {
                    // 操作に紐づく要求の作成
                    new_escalateIncidentRequest request = new new_escalateIncidentRequest();
                    // アクションのターゲットとして取得したサポート案件を指定
                    request.Target = new EntityReference(Incident.EntityLogicalName, incident.Id);
                    // 要求の入力パラメータとして EscalationEngineer を設定
                    request.EscalationEngineer = new EntityReference(SystemUser.EntityLogicalName, escalationEngineer);
                    // 操作に紐づく応答の取得
                    new_escalateIncidentResponse response =
                        (new_escalateIncidentResponse)_serviceProxy.Execute(request);

                    // 応答のパラメータとして Result を表示
                    Console.WriteLine(response.Result);
                }
            }
        }
     }
}

3. プログラムを実行します。画面に設定した出力パラメータ
の文字列が表示されることを確認します。

4. 実際のレコードがエスカレーション担当者に割り当てられ、
それぞれのユーザーウォールに投稿が作成されていることを
確認します。

image

次回はユーザー定義アクションをプラグインやスクリプト
から呼び出す方法を紹介します。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 5

$
0
0

みなさん、こんにちは。

今回はプラグインおよびスクリプトより操作を呼び出す方法
について紹介します。前回までの内容からの続きとなります
のでご注意ください

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 2
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 3
Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 4

また今回はプラグインの開発、およびスクリプト開発の経験
がある前提となります。

概要

プラグインやスクリプトからユーザー定義アクションを実行
する理由は、プロセスを1か所で管理できるためです。実際
リアルタイムワークフローを利用することでプラグインから
操作を呼び出すのと同じ処理ができますし、ワークフローを
手動実行しても結果は同じです。但しその場合ワークフロー
定義が複数存在するため管理性が低下します。

プラグインからの呼び出し

プラグインから操作を呼び出す場合、メッセージ名を解決する
には crmsvcutil にて操作を取得する必要がありますが、複数の
アセンブリに対して同じファイルを含めることはサイズの面、
管理の面から望ましくないため、実行時に解決させる方法が
あります。

尚、この手法は通常の SDK アプリケーションでも同様に利用
可能です。

1. Visual Studio を開き、C# クラスライブラリプロジェクトを
新規に作成します。ここでは MyPlugin としました。

2. 参照に Microsoft.Xrm.Sdk.dll アセンブリを含めます。

3. 参照に System.Runtime.Serialization を含めます。

4. 以下コードを MyPlugin.cs に貼り付けます。

using Microsoft.Xrm.Sdk;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyPlugin
{
    public class MyPlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            // トレースサービスの作成
            ITracingService tracingService =
            (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            // 実行コンテキストの取得
            IPluginExecutionContext context = (IPluginExecutionContext)
            serviceProvider.GetService(typeof(IPluginExecutionContext));

            // コンテキストの入力パラメーターがエンティティか確認
            if (context.InputParameters.Contains("Target") &&
                context.InputParameters["Target"] is Entity)
            {
                // 入力パラメーターのエンティティを取得
                Entity entity = (Entity)context.InputParameters["Target"];

                // エンティティがサポート案件であることを確認
                if (entity.LogicalName != "incident")
                    return;

                // 組織サービスの取得
                IOrganizationServiceFactory serviceFactory =
                    (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                try
                {
                    // エスカレーション担当者の GUID を取得するロジックをここに記述
                    // 結果として GUID を取得したと想定
                    Guid escalationEngineer = new Guid("F5D307DA-E434-E311-904F-D89D676560BC");

                    // 操作に紐づく要求の作成
                    // 操作名のみ指定。new_escalateIncidentRequest ではない点に注意
                    OrganizationRequest request = new OrganizationRequest("new_escalateIncident");
                    // アクションのターゲットとして取得したサポート案件を指定
                    request["Target"] = new EntityReference("incident", entity.Id);
                    // 要求の入力パラメータとして EscalationEngineer を設定
                    request["EscalationEngineer"] = new EntityReference("systemuser", escalationEngineer);
                    // 操作に紐づく応答の取得
                    service.Execute(request);
                }
                catch (Exception ex)
                {
                    tracingService.Trace("MyPlugin: {0}", ex.ToString());
                     throw;
                }
            }
        }
    }
}

5. MyPlug プロジェクトより署名をします。

6. コンパイルを行います。

7. プラグイン登録ツールよりコンパイルしたアセンブリを登録します。

8. 任意のメッセージに対してステップを追加します。今回はテスト
目的でサポート案件の更新に対して登録しました。

image

9. 任意のサポート案件を更新し、結果としてエスカレーションが発生
することを確認します。

スクリプトからの利用

スクリプトから操作を呼び出す場合は、SOAP エンドポイントを利用
する必要があります。概要については以下のリンクを参照してください。

チュートリアル: JavaScript を使用した Web リソースの SOAP エンドポイントの使用
http://msdn.microsoft.com/ja-jp/library/gg594434.aspx

今回作成した操作を呼び出すには以下のようなリクエストを作成します。

var caseId = “<サポート案件の GUID>”
var escalationengineerId = "<エスカレーション担当者の GUID>";

var requestMain = ""
        requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
        requestMain += "  <s:Body>";
        requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
        requestMain += "      <request xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
        requestMain += "        <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
        requestMain += "          <a:KeyValuePairOfstringanyType>";
        requestMain += "            <b:key>Target</b:key>";
        requestMain += "            <b:value i:type=\"a:EntityReference\">";
        requestMain += "              <a:Id>" + caseId + "</a:Id>";
        requestMain += "              <a:LogicalName> incident </a:LogicalName>";
        requestMain += "              <a:Name i:nil=\"true\" />";
        requestMain += "            </b:value>";
        requestMain += "          </a:KeyValuePairOfstringanyType>";
        requestMain += "          <a:KeyValuePairOfstringanyType>";
        requestMain += "            <b:key>EscalationEngineer </b:key>";
        requestMain += "            <b:value i:type=\"a:EntityReference\">";
        requestMain += "              <a:Id>" + escalationengineerId + "</a:Id>";
        requestMain += "              <a:LogicalName>systemuser</a:LogicalName>";
        requestMain += "              <a:Name i:nil=\"true\" />";
        requestMain += "            </b:value>";
        requestMain += "          </a:KeyValuePairOfstringanyType>";
        requestMain += "        </a:Parameters>";
        requestMain += "        <a:RequestId i:nil=\"true\" />";
        requestMain += "        <a:RequestName>new_escalateIncident</a:RequestName>";
        requestMain += "      </request>";
        requestMain += "    </Execute>";
        requestMain += "  </s:Body>";
        requestMain += "</s:Envelope>";

スクリプトから操作を利用する例としてはカスタムボタンの
アクションとして指定することなどが考えられます。

まとめ

ユーザー定義アクションをうまく利用することで、開発者と
ビジネスプロセスの作成者の業務をシステムレベルでも分割
することができる他、開発工数や管理工数の削減にもつながり
ます。行える処理が増えるわけではありませんが、是非活用
してください。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 簡易検索のインデックスサポート

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 の新機能であり、簡易検索のインデックス作成
について紹介します。

概要

簡易検索ビュー定義の検索列に任意の列を追加することで、検索
対象とすることができますが、多くの場合それらの列には適切な
インデックスがないことから検索のパフォーマンスに大きな影響
が発生していました。

設置型の場合は直接データベースに対してカスタムインデックス
を作成することも可能ですが、オンライン環境の場合には対応が
行えませんでした。

Microsoft Dynamics CRM 2013 および、Microsoft Dynamics CRM
Online Fall '13 では、簡易検索ビュー検索列の情報から、自動で
インデックスを作る機能を提供します。

インデックス作成の動作

インデックスは以下の条件を満たしている場合に作成されます。

- 最大 20 列まで
- インデックス列の合計が 900 バイトまで
- 公開済のビュー定義を対象

インデックスはメンテナンス非同期サービス、OperationType 15
によって以下の形式で作成されます。

ndx_QF_<列名>

並べ替え列はインデックス作成対象にはなりません。

インデックス作成の確認

以下インデックス作成の確認は設置型のみで行えますが、同じ
動作はオンラインでも実施されます。

1. テストの為にカスタムエンティティを 1 つ作成します。名前を
以下のように設定しました。

image

2. 文字列型、長さ 100 文字のカスタムフィールドを 10 個作成
します。また長さ 450 文字と 451 文字のカスタムフィールドを
それぞれ 1 つずつ作成します。

3. 簡易検索ビューの検索列に 100 文字のカスタムフィールドを
全て追加して、カスタマイズを公開します。

4. 非同期サービスが実行されるのを待ちます。

5. 以下のようにインデックスが自動で作成されます。

image

6. 長さ 450 文字のフィールドを追加しても同様にインデックスが
追加されることを確認します。

7. 長さが 451 文字のフィールドを追加すると全てのインデックス
が削除されてしまうことを確認します。

簡易検索のベストプラクティス

簡易検索を利用する場合、以下の点に注意してください。

- 極力少ない検索列を設定する
- 並べ替えを極力減らす
- 前方一致のみ利用するようにする
- 関連エンティティのフィールドを最小限に留める
- サイズの大きい列は簡易検索に含めない

まとめ

今回の新機能により、簡易検索については適切なインデックスが
自動で作成されるため最適なパフォーマンスが期待できます。
設置型、オンラインいずれも恩恵を受けれる機能です。

- 中村 憲一郎


Dynamics CRM 2013/Fall '13 エンティティテーブルの仕様変更

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 で変更されたエンティティテーブルの仕様に
ついて紹介します。

概要

Microsoft Dynamics CRM 2011 以前のバージョンは、エンティティ
に対して基底のテーブルが Base と Extension の 2 つに分割されて
いました。これは SQL Server 2000 での制限に由来するものですが
Microsoft Dynamics CRM 2013 および、Microsoft Dynamics CRM
Online Fall '13 よりエンティティに対する基底のテーブルは、活動
エンティティのような特殊なものを除いて 1 つになります。

データ抽出時の JOIN が削減されるためパフォーマンスの向上に
つながります。

アップグレード時の動作

Microsoft Dynamics CRM 2011 からアップグレードを行う場合、
既定ではアップグレード中に自動でテーブルの結合が行われます。
但し大規模環境も考慮し、以下の機能を提供します。

- アップグレード時のテーブル結合をスキップ
- アップグレード後に別途ツールでテーブルを結合
- 任意のエンティティに対して順次結合を行える
- 一部のエンティティだけ結合された状態でもサービスを利用可能
※今後提供されるパッチの適用は、全てのエンティティの結合が
完了した時点で初めて行えます。

アップグレード時にテーブルの結合をスキップする方法

以下の手順でアップグレード中のテーブル結合をスキップできます。

1. 以下のレジストリキーを追加します。
場所 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM
キー名 : MergeBaseAndExtensionTables
キー型 : DWORD (32 ビット)
値 : 1

2. アップグレードプロセスを開始します。

3. アップグレード対象の組織を選択する画面で <なし> を選択します。
※組織を選択した場合、上記レジストリキーが存在してもテーブルの
結合が行われます。

image

4. アップグレードを完了します。

アップグレード後にテーブルを結合する方法

すべての展エンティティを一括結合

展開マネージャーからアップグレードを行うことで全てのエンティティ
を一括で結合できます。

1. 上記で追加したレジストリキーを削除するか、値を 0 に変更します。

2. アップグレード後に展開マネージャーから、任意の組織を右クリック
して組織のアップグレードを選択します。全てのテーブルを結合します。

個別のエンティティの順次結合

CrmMergeBaseAndExtensionTableTool.exe ツールを利用して、個別の
エンティティを順次処理することができます。

1. 上記で追加したレジストリキーを削除するか、値を 0 に変更します。

2. コマンドプロンプトを開き、Microsoft Dynamics CRM インストール
フォルダ¥Tools フォルダに移動します。

3. CrmMergeBaseAndExtensionTableTool を実行して結合を行います。
※利用方法はパラメータなしで実行することで詳細が表示されます。
※バックアップからリストアしたデータベースでテスト実行できます。

未結合のエンティティ一覧を確認

以下の SQL クエリを組織データベースで実行すると、まだ結合が完了
していないエンティティの一覧が確認できます。

SELECT e.Name, e.ExtensionTableName
FROM EntityView e
where e.IsActivity = 0 and e.ExtensionTableName is not null
and e.IsIntersect = 0
and e.IsLogicalEntity = 0
order by e.Name

まとめ

Base と Extension が結合することで大きなパフォーマンス向上が
期待できますが、アップグレードを問題なく成功させるためにも
規模によってどのようにアップグレードを進めるか事前に計画を
行ってください。

またカスタムレポートで直接基底テーブルをクエリするよう開発
されたものがないかも合わせてご確認ください。

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 複数レコード参照フィールドの新機能

$
0
0

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 の複数レコード参照フィールドにおける新機能
を紹介します。

概要

電子メールの宛先にように、参照でありながら複数のレコードを指定
できる特殊なフィールドにおいて、今回のバージョンで以下新機能を
提供します。

- 連続したレコードの自動解決と追加
- 高さの自動拡張
- 電子メールが許可されていない等、問題のあるレコードのハイライト
- 容易なレコードの削除

では実際に操作してみましょう。

動作の確認

1. 活動より新規に電子メールを作成します。

2. 宛先欄で参照アイコンをクリックします。

3. ドロップダウンより任意のレコードを 1 件選択します。

 

image

4. 続いて同じ方法で 2 件目のレコードを追加します。レコードは
; 記号で区切られます。

image

5. 宛先に ’シティ’ と入力して自動解決を試します。

image

6. レコードを追加していくと宛先フィールドの高さが自動で
拡張されます。※3 列を超えるとスクロールバーが出ます。

image

7. 任意のレコードをクリックして Delete キーを押下すると簡単に
削除できます。また連絡でレコードを削除することもできます。

8. 件名と本文を入力して、送信ボタンをクリックします。

9. 電子メールがなかったり電子メールが送信禁止になっている
レコードがある場合、以下の様に警告が出ると同時に、問題と
なっているレコードがハイライトされます。
※アドベンチャーワークス(サンプル)では事前に電子メールを
許可しない設定に変更してあります。

image

10. 宛先のレコードはダブルクリックするか、Ctrl+Enter キーの
押下で開きます。

まとめ

以前のバージョンでは表示領域が迫ったことや、その操作性から
複数の宛先を選択したり、間違った宛先を削除することが困難
でしたが、よりスムーズな操作が行えるようになりました。
是非使い心地をご確認ください。

- 中村 憲一郎

Dynamics CRM 2013/Fall ‘13 新機能関連ブログ一覧

$
0
0

みなさん、こんにちは。

10/1 から連続して Microsoft Dynamics CRM 2013 および
Microsoft Dynamics CRM Online Fall ’13 の新機能を紹介
していますが、記事の数が多くなってきましたので、一覧
を作成しました。

今後も新機能に関連する新しい記事は、こちらにリスト
する予定です。

新 UI 関連

Dynamics CRM 2013/Fall '13 刷新された UI の紹介
新しくなった UI 全般について

Dynamics CRM 2013/Fall '13 新フォーム紹介 その 1
ナビゲーション、コマンドバー、ソーシャルペイン、
業務プロセスフローなど、フォーム新機能の概要

Dynamics CRM 2013/Fall '13 新フォーム紹介 その 2
ルックアップ、フォームセレクター、サブグリッド
の拡張およびコンポジットコントロール、および
自動レイアウト調整

Dynamics CRM 2013/Fall '13 簡易作成フォームの紹介
簡易作成フォームのカスタマイズ詳細 

Dynamics CRM 2013/Fall '13 ナビゲーションの紹介
ナビゲーションの概要

Dynamics CRM 2013/Fall '13 コマンドバーの紹介
コマンドバーの概要

Dynamics CRM 2013/Fall '13 複数レコード参照フィールドの新機能
容易な参照の追加、削除と警告表示時のハイライト

設定/カスタマイズ関連

Dynamics CRM 2013/Fall '13 新フォーム紹介 その 3
簡易作成/簡易表示フォームの概要と作成

Dynamics CRM 2013/Fall '13 新フォーム紹介 その 4
フォーム新機能のカスタマイズ

Dynamics CRM 2013/Fall '13 新フォーム紹介 その 5
自動保存機能

Dynamics CRM 2013/Fall '13 フィールドの新機能
イメージと電話形式、ツールティップ拡張

Dynamics CRM 2013/Fall '13 ナビゲーションのカスタマイズ
ナビゲーションのカスタマイズ方法 

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 1
コマンドバーカスタマイズの概要と準備

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 2
既存のボタンを非表示にする方法

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 3
カスタムボタンの追加方法

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 4
多言語対応と表示/非表示コントロール

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 5
アプリケーションリボン概要と高度な検索リボンの
カスタマイズ方法

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 6
アプリケーションリボンを使用した全エンティティに対する
コマンドバーのカスタマイズ方法

Dynamics CRM 2013/Fall '13 コマンドバーのカスタマイズ その 7
既存ボタンのカスタマイズ方法

Dynamics CRM 2013/Fall '13 業務ルールの紹介
業務ルールの概要と作成

プロセス関連 

Dynamics CRM 2013/Fall '13 業務プロセスフローの紹介 その 1
業務プロセスフローの概要と作成

Dynamics CRM 2013/Fall '13 業務プロセスフローの紹介 その 2
複数の業務プロセスフロー作成、レポートでの利用

Dynamics CRM 2013/Fall '13 業務プロセスフローの紹介 その 3
複数エンティティにまたがる業務プロセスフローの作成

Dynamics CRM 2013/Fall '13 同期ワークフロー その 1
同期ワークフローの概要と作成

Dynamics CRM 2013/Fall '13 同期ワークフロー その 2
同期ワークフローのトラブルシューティング

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 1  
ユーザー定義アクション (操作) の概要と作成

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 2
ユーザー定義アクション (操作) の SDK からの呼び出し

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 3
プロセスの変更とトラブルシューティング

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 4
入出力パラメータの利用

Dynamics CRM 2013/Fall '13 ユーザー定義アクション その 5
プラグインとスクリプトからの呼び出し

セキュリティ

Dynamics CRM 2013/Fall '13 アクセスチームの紹介
アクセスチームの設定とシナリオ

Dynamics CRM 2013/Fall '13 フィールドレベルデータの暗号化
フィールドレベルデータの暗号化概要と設定

パフォーマンス

Dynamics CRM 2013/Fall '13 簡易検索のインデックスサポート
検索対象列に対するインデックスサポート

Dynamics CRM 2013/Fall '13 エンティティテーブルの仕様変更
Base および ExtensionBase テーブルの統合とアップグレード

SDK

Dynamics CRM 2013/Fall '13 SDK Xrm.Page の新機能
Xrm.Page.context : client.getClient, client.getClientState, getUserName
Xrm.Page.data : entity.getPrimaryAttributeValue, refresh, save

Dynamics CRM 2013/Fall '13 SDK Xrm.Page.ui の新機能 その 1 - 参照コントロール関連
検索イベントとカスタムフィルター

Dynamics CRM 2013/Fall '13 SDK Xrm.Page.ui の新機能 その 2 - フォームのメッセージ表示
フォームレベルおよびフィールドレベルメッセージ

Dynamics CRM 2013/Fall '13 SDK Xrm.Utility の新機能
Xrm.Utility : alertDialog, confirmDialog

Dynamics CRM 2013/Fall '13 SDK サーバー API の新機能
ExecuteAsync、新機能対応のメッセージ、メタデータの変更

Dynamics CRM 2013/Fall '13 SDK FetchXML の新機能
追加機能の概要と利用方法

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 SDK モバイルおよびリッチ クライアントの開発 その 1

$
0
0

みなさん、こんにちは。

今回から Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 新機能より、モバイルおよびリッチ クライアント
の開発に関する情報をお届けします。

概要

以下に今回のトピックに関連する内容を紹介します。

新たにサポートされる内容

- JWT トークンのサポート
- Windows 8 ストアアプリケーションのサポート
- ブラウザ以外の外部アプリケーションからの SOAP/REST エンド
ポイントの認証をサポート

ブラウザ以外のがいるアプリケーションでサポートされる操作

- OData エンドポイントを使用するとき、作成、取得、更新、および
削除の操作がサポートされます。メッセージ実行またはメタデータ
検索はサポートされません。
- 最新のアプリケーションおよびモバイル アプリケーションの SOAP
エンドポイント (Organization.svc/web) を使用するとき、完全な Web
サービス機能セットへのアクセスが利用できます。

テクノロジの依存関係

- .NET 用 Windows Azure AD 認証ライブラリ
- Microsoft Visual Studio 2012
- Windows Server 2012 R2 および AD FS 2.2 (IFD のみ)
※設置型の場合クレーム構成と IFD が必須となります。
- Microsoft Dynamics CRM 2013 SDK 6.0.1 (サンプルが含まれます)
※2013 年 11 月 29日時点で英語版のみサンプルを提供

セキュリティ関連

- Azure AD 認証ライブラリのユーザー ログオンは、Web ブラウザー
のコンテキストによって処理されます。
- アプリケーションの登録は、 展開のための Azure Active Directory、
および設置型展開または IFD のための Active Directory フェデレーション
サービス (AD FS) によって管理されます。

サンプルを利用する

開発者の方は実際にサンプルを見た方が早いと思いますので、早速
サンプルを紹介します。詳細は次回以降の記事で紹介しますので
今回はサンプルを動かせるようにする手順をまず案内します。

事前準備

サンプルを利用するにあたり、以下の環境を準備してください。
設置型については今後の記事で紹介する予定です。

- Microsoft Dynamics CRM 2013 オンライントライアル
- Visual Studio 2012
- Microsoft Dynamics CRM 2013 SDK 6.0.1 英語版

サンプルソリューションの準備

サンプルは SOAP と REST の 2 つ提供されていますが、今回は REST
版のサンプルを利用します。また REST 版は設置型向けのサンプルと
して提供されていますので、オンライン向けに書き換えます。

1. Visual Studio 2012 でサンプルを開きます。
SDK\SampleCode\CS\ModernAndMobileApps\ModernOdataApp

2. 参照設定を展開して解決できていない参照があるか確認します。

image

3. Azure のライブラリは NuGet で取得できます。ソリューションを
右クリックして NuGet パッケージの復元の有効化をクリックします。

image

4. 確認の画面が出るので「はい」をクリックします。

5. プロジェクトを右クリックして NuGet パッケージの管理をクリック
します。自動的に以下のメッセージが表示されます。復元ボタンを
クリックします。

image

6. 以下の様にパッケージが表示されます。インストールボタンが表示
されている場合はボタンをクリック、アンインストールが表示されて
いる場合はパッケージはインストール済で参照が解決されるだけです
ので、閉じるをクリックします。

image

7. 一旦ソリューションをビルドして参照エラーが解決することを
確認します。

image

8. 次にプロジェクト直下にある CurrentEnvironment.cs を開いて、
クラスメンバーを展開します。

9. CrmServiceUrl を申し込んだトライアルのアドレスに書き換えます。

public const string CrmServiceUrl   = “https://crm2013training3.crm5.dynamics.com”;

10. _oauthUrl を以下の様に書き換えます。

private const string _oauthUrl = “https://login.windows.net/common/wsfed”;

11. 58、68 行目の CrmServiceUrl 変数を “Microsoft.CRM” に書き換えます。

元)  await _authenticationContext.AcquireTokenAsync(CrmServiceUrl, _clientID);
後)  await _authenticationContext.AcquireTokenAsync(”Microsoft.CRM”, _clientID);

アプリケーションの登録

新しい認証方式を利用するには、アプリケーションを事前に
登録しておく必要があります。

1. 登録に際してアプリケーション固有の戻り値を取得します。
CurrentEnvironment.cs 57 行目にブレークポイントを設定して、
プロジェクトをデバッグ実行します。

2. redirectUrl の値をコピーしておきます。

image

3. http://graphexplorer.cloudapp.net/にアクセスします。画面
右上の Sign In をクリックして CRM 組織の管理者 ID でログイン
します。

image

4. Resource で自分の組織のアドレスが含まれていることを確認
して、画面上部の Add Application Permission をクリックします。

5. Company に組織名が表示されていること確認して、Client App
Display Name にアプリケーション名 (任意) を、Client App URL に
先ほど取得した redirectUrl の値を入力します。

image

6. 画面中央のサービス一覧より Microsoft.CRM を選択します。

image

7. Create Permission ボタンをクリックします。

8. 次の画面に表示される Cient Application 欄にある
Client ID をコピーします。

9. サンプルアプリケーションに戻り、CurrentEnvironment.cs に
ある _clientID 変数に取得した Client ID を貼り付けます。

private const string _clientID = "取得した Client ID";

サンプルの実行

いよいよサンプルを実行しましょう。

1. F5 キーを押下してサンプルを実行します。

2. アプリケーションの画面が表示された後、以下の様にユーザー
情報を求められますので、Microsoft Dynamics CRM オンライン
に接続できるユーザーを入力します。

image

3. サインインをクリックします。

4. アプリケーションの画面に戻るので、Accounts または Tasks
をクリックします。他のタイルはダミーですので動作しません。

image

5. 取引先企業の一覧を取得できることを確認します。データの
取得は非同期のため表示までに時間がかかる可能性があります。

image

次回からは今回行った手順やサンプルの詳細を紹介します。
お楽しみに!

- 中村 憲一郎

Dynamics CRM 2013/Fall '13 SDK モバイルおよびリッチ クライアントの開発 その 2 - 認証(オンライン)

$
0
0

みなさん、こんにちは。

前回に引き続き Microsoft Dynamics CRM 2013 および、Microsoft
Dynamics CRM Online Fall '13 新機能より、モバイルおよびリッチ
クライアントの開発に関する情報をお届けします。

Dynamics CRM 2013/Fall '13 SDK モバイルおよびリッチ クライアントの開発 その 1

前回は概要とサンプルの実行方法を紹介しましたが、今回は認証
に関する情報をお届けします。

新たな認証方式のサポート

Microsoft Dynamics CRM 2011 では Windows 統合認証とクレーム
認証をサポートしていました。このモデルはブラウザやマネージド
アプリケーションでは十分に機能していましたが、非ドメイン環境
で Windows Identify Foundation (WIF) SDK を利用できない場合の
開発が困難でした。

そのため Microsoft Dynamics CRM 2013 と Microsoft Dynamics CRM
Online Fall '13 では新しい認証として OAuth 2.0 をサポートします。
尚、設置型環境では AD FS 2.2 (Windows Server 2012 R2) および IFD
構成が必須となります。

設置型とオンライン環境で手順が異なるため、今回はオンラインに
絞って詳細を解説します。

オンライン環境の認証基盤

Microsoft Dynamics CRM Online では、ユーザー認証に Azure AD を
使用しています。ユーザーを管理する場合 Office 365 のポータルを
利用している方は疑問に思われるかもしれませんが、実際は以下の
流れとなります。

1. Microsoft Dynamics CRM Online または Office 365 のサービスに
サインアップします。この際利用するドメイン名を指定します。

2. 指定したドメインと同じドメイン名を利用して Azure AD が作成
されます。

3. Office 365 管理ポータルで追加、変更したユーザー情報は、裏で
Azure AD に格納されます。

Windows Azure のサブスクリプションがある場合は、実際に Azure
ポータルからもドメインとユーザーが確認可能です。

[Office 365 管理ポータル]
image

[Azure ポータル ‐ Azure AD ドメイン一覧]
image

[Azure ポータル ‐ Azure AD ユーザー]
image

アプリケーションの登録

各種サービスやアプリケーションから Azure AD を利用するには
事前に登録しておく必要があります。Microsoft Dynamics CRM
Online や Office 365 をサインアップした場合、自動的にサービス
が登録されます。

image

また、サンプルプログラムから Microsoft Dynamics CRM Online
のデータを取得するためにも、ここでアプリケーションの登録
を行う必要がありますが、通常 Azure のサブスクリプションは
持っていないため、Azure 管理ポータルは利用できません。

そこで Graph Explorer というツールを利用してアプリケーション
を登録することになります。手順は前回の記事で紹介しましたが
今回はその他の使い方や詳細も紹介します。

1. http://graphexplorer.cloudapp.net/に接続し、管理者権限で
サインインします。

2. Resource のアドレスからテナントが正しいことを確認して
Get ボタンをクリックします。

image

3. 一番上の users をクリックします。Azure AD よりユーザー
情報が取得できます。例えば assignedPlans ではライセンスが
付与されているサービスが確認できます。

image

4. 1 つ前の画面に戻って /applicationsリンクをクリックする事で
登録しているアプリケーションが確認できます。

5. 画面上部の Add Application Permission をクリックしてサンプル
アプリケーションの登録をします。この画面では Client App Display
Name と Client App URL でアプリケーションの情報を登録できます。
またこのアプリケーションが利用できるサービスを指定します。

尚、Windows ストアアプリケーションの Client App URL は以下の
コードで取得が可能です。

string redirectUrl = WebAuthenticationBroker.GetCurrentApplicationCallbackUri().ToString();

Windows Azure Authentication Library (AAL)

AAL を利用することで、Azure AD を利用したアプリケーションの
開発が容易になります。

AAL では以下の流れでユーザーの認証から取得したトークンの利用
が可能になります。

1. 認証サービスを指定することで認証コンテキストを取得します。
Azure AD の場合は https://login.windows.net/common/wsfedです。

_authenticationContext = new AuthenticationContext(_oauthUrl);

2. 取得したコンテキストの AcquireTokenAsync メソッドを実行し
トークンを取得します。この際に登録済の ClientId および利用する
サービスの名前を指定します。Microsoft Dynamics CRM Online
の場合は、Microsoft.CRM です。

AuthenticationResult result =
await _authenticationContext.AcquireTokenAsync("Microsoft.CRM", _clientID);

3. HttpClient のヘッダーとして取得したトークンを設定します。

// HttpClient の生成
HttpClient httpClient = new HttpClient();
// ヘッダーにトークンを設定
httpClient.DefaultRequestHeaders.Authorization = 
  new AuthenticationHeaderValue("Bearer", accessToken);
// HttpRequest を生成
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, url);
req.Method = HttpMethod.Get;

// HttpResponse を生成
HttpResponseMessage response;
// 結果を取得
response = await httpClient.SendAsync(req);

まとめ

新しい認証方式をサポートしたことで、これまで意識する必要のなかった
Azure AD やアプリケーション登録、JWT というキーワードが増えました。
初めは構成にうまくいかない問題など出ると思いますが、繰り返し試して
いただくことで手順が確かなものになりますので、是非お試しください。

- 中村 憲一郎

Viewing all 589 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>