トピックス

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

Dynamics 365(Dynamics CRM) Web API レコード更新編

みなさん、こんにちは。
ジメジメした毎日ですが、みなさんはいかがお過ごしでしょうか。私はグッタリですw

さて、今回は Dynamics 365 Web API レコード更新編です。前回、作成編を書いたので、よろしければ合わせてお読みください

Dynamics 365 レコード更新の基本

レコードの更新には"PATCH"メソッドを使用します。レコードの作成との違いは URL です。

レコード作成時の URL
https://ORGNAME.crm7.dynamics.com/api/data/v8.2/contacts
レコード更新時の URL
https://ORGNAME.crm7.dynamics.com/api/data/v8.2/contacts(00000000-0000-0000-0000-000000000001)

このように更新の際はレコードを特定するために GUID を指定する必要があります。それでは、前回のサンプルを修正してみます。

var contact = {};
// Boolean
contact["creditonhold"] = false;
// Customer
contact["parentcustomerid_account@odata.bind"] = "/accounts(394BD9A2-3945-E711-8110-C4346BC53068)";
// DateTime
contact["birthdate"] = "1980-2-2";
// Double
contact["address1_latitude"] = 48.639583;
// Memo
contact["description"] = "Update Web API サンプル";
// Owner
contact["ownerid@odata.bind"] = "/systemusers(22C23226-E74E-E711-8111-C4346BC53068)";;
// Picklist
contact["accountrolecode"] = 1;
// String
contact["firstname"] = "名前";
// String
contact["lastname"] = "名字";
var requestUrl = "https://ORGNAME.crm7.dynamics.com/api/data/v8.2/contacts(E2506578-5D52-E711-8112-C4346BAD16B0)";
var req = new XMLHttpRequest();
req.open("PATCH", encodeURI(requestUrl), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204) {
Xrm.Utility.alertDialog("更新成功!", null);
} else {
var error = JSON.parse(this.response).error;
Xrm.Utility.alertDialog(error.message, null);
}
}
};
req.send(JSON.stringify(contact));

それでは変更点とともに簡単に説明します。

20行目
レコード作成時にはなかったレコードを特定するGUIDを付加しています。
22行目
"PATCH"メソッドに変更しています。

レコード作成が理解できれば、レコードの更新も簡単ですね。

※ 2017.07.26 追記
PATCH メソッドでは指定したGUIDが存在しない場合にレコードの作成を行ってしまうため、レコードの作成を阻止する場合は、リクエストヘッダに「If-Match:"*"」を追加してレコード作成を止める必要があります。

Dynamics 365 レコード更新のその他の機能

基本的なレコード更新は上記の通りですが、その他にもできることがあります。

更新した結果のレコードを取得

更新されたレコードのデータは 201 (Created) のステータスで返されます。結果を取得するには、要求のヘッダーで return=representation の基本設定を使用する必要があります。

req.setRequestHeader("Prefer", "return=representation");

どのフィールドを取得するかを制御するには、$selectクエリオプションを URL に追加します。$expandクエリオプションは、使用すると無視されます。

1フィールドの値の更新

1フィールドの値を更新します。基本の更新のURLに "/フィールド名" を付加し、"PUT"メソッドを使用します。下記では取引先担当者(contact)の「名(firstname)」を更新する例は下記です。

var contact = {};
contact["value"] = "名前の更新";
var requestUrl = "https://ORGNAME.crm7.dynamics.com/api/data/v8.2/contacts(E2506578-5D52-E711-8112-C4346BAD16B0)/firstname";
var req = new XMLHttpRequest();
req.open("PATCH", encodeURI(requestUrl), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204) {
Xrm.Utility.alertDialog("更新成功!", null);
} else {
var error = JSON.parse(this.response).error;
Xrm.Utility.alertDialog(error.message, null);
}
}
};
req.send(JSON.stringify(contact));

レコードの Upsert

Upsert では"PATCH"メソッドを使用します。レコードが存在しない場合は、レコードが作成されるます。 既にレコードが存在する場合は、そのレコードが更新されます。

Upsert の作成または更新の動作のいずれかを止める事が可能です。If-Match または If-None-Match の追加によってこれを実行できます。

レコードの作成を阻止する方法
リクエストヘッダにIf-Match:"*" を追加します。

req.setRequestHeader("If-Match", "*");

レコードの作成が阻止された場合にはHTTPステータス「404(Not Found)」が返されます。

レコードの更新を阻止する方法

リクエストヘッダにIf-None-Match:"*" を追加します。

 req.setRequestHeader("If-None-Match", "*");

レコードの更新が阻止された場合にはHTTPステータス「412(Precondition Failed)」が返されます。


レコード更新はいかがでしたでしょうか。
最後に注意点として検索(Lookup)フィールドの値を削除することは出来ません。(削除する方法あるんですが、残念なんです。。。)

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

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

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

同じカテゴリの記事

Translate »