トピックス

知識創造研究室 by CRM(xRM)

Dynamics CRM Web API レコード取得編 Part.Ⅱ

お久しぶりです。ケンタッキーフライドチキンを週一で食べている Harada です。
みなさんは、ケンタッキーを何と呼んでますか?

  • ケンタッキー
  • KFC
  • ケンタ
  • ケンチキ

数年前に某所で『ケンチキ』といって爆笑されたことがあります。それ以来発言しないように気をつけています(ヘタレですw 恥ずかしかったんです。。。)

どうでもいい話はこの辺で終わりにしときます。(ご要望があればもう少し書きますがw)
今回は前回に引き続き、Dynamics CRM Web API レコード取得編のPart.Ⅱとなります。

前回はレコードURLを使用してレコードを取得するJavaScriptを記載しました。今回はもう少し実用的なところとして、パフォーマンスを考えて取得フィールドを絞り込む、1レコードではなくエンティティに対して検索条件を指定してレコードを抽出するといったあたりをご説明します。

Dynamics CRM Web API 取得フィールドの指定

システム開発では一般的なことですが、取得するフィールドは必要なものだけを取得し、ネットワーク負荷やメモリ負荷の軽減をすることと思います。Dynamics CRM Web API でも全く同じで、Microsoft 社もベストプラクティスとしてMSDNに記載しています。
取得フィールドを指定するには『$select』オプションを使用します。ここで気を付けて頂きたいのは、前回の取得データでご説明した通り、検索フィールドは「_fieldName_value」の形式で指定する必要があります。
$select』オプションをどのように指定するかというとURLのパラメータとして指定します。URLで「https://hogehoge.com/search?q=test」のように『?』がついていてその後ろに「key=value」の形式となっているの見たことがある方がほとんどだと思います。ここではこの「?」以降をパラメータと表現しています。余談ですがパラメータが複数ある場合は「url?key1=value1&key2=value」と「&」で連結していきます。それでは前回のJavaScriptを使用して取得フィールドの指定を行いたいと思います。

var entity = Xrm.Page.data.entity;
var recordUrl = Xrm.Utility.getEntityUrl(entity.getEntityName(), entity.getId());
var options = '$select=name,_customerid_value,actualclosedate';
options += ',estimatedvalue,purchaseprocess';
var xhr = new XMLHttpRequest()
xhr.open("GET", encodeURI(recordUrl + '?' + options), true);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xhr.setRequestHeader('OData-MaxVersion', '4.0');
xhr.setRequestHeader('OData-Version', '4.0');
xhr.setRequestHeader('Prefer', 'odata.include-annotations="*"');
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) {
var data = JSON.parse(this.response);
for (key in data) {
console.log(key + ':' + data[key]);
}
}
else {
var error = JSON.parse(this.response).error;
Xrm.Utility.alertDialog(error.message, function () { });
}
}
};
xhr.send();

前回からの変更点は下記の通りです。

3行目、4行目
$selectオプションを追加しています。
指定しているフィールドは見込顧客、実際のクローズ日、売上見込み、支払方法。
6行目
レコードURLと$selectオプションを「?」で連結しています。

どうでしょうか?取得フィールドの指定は問題ありませんね。

Dynamics CRM Web API 検索条件を指定したレコード抽出

続いては、条件を指定したレコード抽出です。レコードのGUIDを指定する必要はありません。そして条件を使用するには『$filter』オプションを使用します。$select オプションと同様にURLパラメータを使用して指定します。
使用できる演算子は「標準フィルタ演算子」「標準クエリ機能」「Microsoft CRM Web API のクエリ機能」がります。詳細はMSDNページを参照してください。
ここでは下記の$filter を指定して、営業案件の「トピック」に"SKU"という文字列が含まれているレコードを抽出します。$filter は下記のようになります。

$filter=contains(name,'SKU')

実際のソースコードで説明します。



var apiUrl = Xrm.Page.context.getClientUrl();
apiUrl += '/api/data/v';
var version = Xrm.Page.context.getVersion().split(".");
apiUrl += version[0]+"."+version[1] + "/";
apiUrl += "opportunities";
var options = '$select=name,_customerid_value,actualclosedate';
options += ',estimatedvalue,purchaseprocess';
options += "&$filter=contains(name,'SKU')";
var xhr = new XMLHttpRequest();
xhr.open("GET", encodeURI(apiUrl+'?'+options), true);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xhr.setRequestHeader('OData-MaxVersion', '4.0');
xhr.setRequestHeader('OData-Version', '4.0');
xhr.setRequestHeader('Prefer', 'odata.include-annotations="*"');
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) {
var data = JSON.parse(this.response).value;
for (record in data) {
for (key in data[record]) {
console.log(record + ":" + data[record]);
}
}
}
else {
var error = JSON.parse(this.response).error;
Xrm.Utility.alertDialog(error.message, function () { });
}
}
};
xhr.send();
1行目~5行目
リクエストするURLの生成方法を変更しました。下記URLを作成しています。
[Organization URL]/api/data/[version]/opportunities

Organization URL:Xrm.Page.context.getClientUrl() Dynamics CRMのURL
version:実行されているDynamics CRM のバージョン(最新の場合は"v8.1")
8行目
$filter オプションを$select と「&」で連結しています。

こちらもそんなに難しくないですね。少し『癖が強い(千鳥 ノブ風)』かもしれないので、わかりにくいなどありましたらコメント等でお知らせくださいm(_ _)m

次回の内容

次回はDynamics CRM Web API レコード取得編 最終回となります。乞うご期待!w

※ 記事の内容は個人発信の参考情報です。記事内容のご利用は、ご自身の判断でお願いします。

この記事を書いた人
原田 研吾

文系プログラマ(.NET Framework、Java)。
25歳から始めたプログラムは死ぬ気で頑張った(誰も褒めてくれないので自分で誉めてます)。
気が付けば製品開発部のマネージャー・・・
弊社Dynamics CRM トレーニングの講師をやったりもします。
事業部やら役職やらありますが、『事業部内の便利屋』が一番フィットする肩書です。
アーカス・ジャパン株式会社 CRM製品
CRM製品に関するお問い合わせ
TEL 06-6195-7501
お問い合わせはこちら

同じカテゴリの記事

Translate »