サンプル: OData エンドポイントと JavaScript を使用した複数のレコードの取得
公開日: 2016年11月
対象: Dynamics CRM 2015
このサンプル コードは、Microsoft Dynamics CRM 2015 および Microsoft Dynamics CRM Online 2015 更新プログラム 向けです。 Microsoft Dynamics CRM SDK パッケージをダウンロードします。 このサンプル コードは、ダウンロード パッケージの次の場所にあります。
SDK/SampleCode/JS/RESTEndpoint/JavaScriptRESTRetrieveMultiple
このサンプルがどのように機能するかを確認するだけであれば、ダウンロード ファイルに含まれている JavaScriptRESTRetrieveMultiple_1_0_0_0_managed.zip マネージド ソリューションをインストール (インポート) します。 このマネージド ソリューションをインストールし、以下の名前を使用して Web リソースを作成する場合は、マネージド ソリューションをアンインストール (削除) しない限り、ソリューション発行者のカスタマイズ接頭辞を "sample" にすることはできません。
要件
このサンプルは、ソリューションのインストール後にその構成ページに表示されます。
このサンプルは次の 4 つの Web リソースを使用します。
sample_/JavaScriptRESTRetrieveMultiple.htm
SDK.REST.retrieveMultipleRecords 関数を呼び出してデータを取得するためのユーザー インターフェイスと関数を提供する HTML ページ。 このページは、サンプル ソリューション用の構成ページとして設定されます。sample_/Scripts/SDK.REST.js
この JavaScript ライブラリには、SDK.REST.retrieveMultipleRecords 関数など、Web リソースの REST エンドポイントを使用するための関数が含まれています。sample_/Styles/JavaScriptRESTRetrieveMultiple.css
このカスケード スタイル シート ファイルは、sample_/JavaScriptRESTRetrieveMultiple.htm 用のスタイルを提供します。
注意
カスタマイズの接頭辞 "sample_" はコード内では使用されません。 これらのサンプルは、任意の発行者からのカスタマイズ接頭辞を使用して機能します。 ただし、シミュレートされた Scripts and Styles フォルダーの相対パスは、Web リソースの名前に含まれる必要があります。
使用例
既定では、REST エンドポイントによって返されるレコードの数は 50 レコードに制限されます。 このサンプルは、この制限を気にせずに複数のレコードを取得する方法を示したものです。
このサンプルでは、次のアプローチを使用します。
document.onreadystatechange イベント ハンドラーに、各種の UI 要素のグローバル変数を設定し、retrieveAccounts 関数を Retrieve Accounts ボタン (btnRetrieveAccounts) の click イベント ハンドラーとして設定し、btnRetrieveAccounts ボタンの click メソッドを呼び出すコードを含めます。
retrieveAccounts 関数は、accountGrid をクリアし、numberOfAccountsToRetrieve 選択コントロールから取得するレコードの数を取得します。 この値は、SDK.REST.retrieveMultipleRecords オプションのパラメーターに渡される OData システム クエリ オプションに追加されます。
SDK.REST.retrieveMultipleRecords メソッドは、次のパラメーターを受け取ります。
type: 取得するレコードのエンティティの種類のスキーマ名。 この例では、取引先企業レコードを取得するために "Account" を使用しています。
options: 返されるデータを制御する OData システム クエリ オプションを表す文字列。 この例では、取引先企業の Name 属性と Telephone1 属性を設定し、既定の上限である 50 レコードに制限されないように $top クエリ オプションの値を設定しています。
successCallback: レコードのページが返されるたびに渡されて呼び出される関数。 この例では、retrieveAccountsCallBack 関数を使用しています。
errorCallback: 応答しなかった場合に渡されて呼び出される関数。 この例では、alert 関数を使用してすべてのエラーのメッセージを表示する匿名関数を使用しています。
OnComplete: 要求されたレコードがすべて返されたときに呼び出される関数。 この例では、accountsRetrieveComplete 関数を使用しています。
SDK.REST.retrieveMultipleRecords 関数は、要求された取引先企業レコードを取得するように XMLHttpRequest を準備し、要求を送信します。
要求の onreadystatechange イベント ハンドラーで、最初の 50 件の結果が successCallback として retrieveAccountsCallBack 関数に返されます。 この関数は、各レコードの HTML の行を生成し、それらを accountsGrid テーブルに追加します。
$top クエリ オプションを使用して要求されたレコードの総数がまだ取得されていない場合、__next オブジェクトに、次の 50 件のレコードを取得するための URL が格納されます。 この URL は、クエリ オプションだけ抽出されて、SDK.REST.retrieveMultipleRecords 関数に渡されます。 この自己参照型の関数呼び出しは、要求された数のレコードが返されるか、返すレコードがなくなるまで繰り返されます。
__next オブジェクトが結果と共に返されなくなると、OnComplete 関数として accountsRetrieveComplete 関数が実行されます。 この関数は、返されたレコードの総数を設定し、成功したことを示すメッセージを表示します。
ページに既定値が読み込まれたら、Maximum Number of Accounts to Retrieve (numberOfAccountsToRetrieve) 選択コントロールを使用して異なる数のレコードを要求し、Retrieve Accounts (btnRetrieveAccounts) ボタンを使用して別の要求を送信できます。
sample_/JavaScriptRESTRetrieveMultiple.htm
<html lang="en-us">
<head>
<title>REST Endpoint Paging with JScript</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script src="../ClientGlobalContext.js.aspx" type="text/javascript"></script>
<script src="Scripts/SDK.REST.js" type="text/javascript"></script>
<link href="Styles/JavaScriptRESTRetrieveMultiple.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
var accountsGrid; //The tbody element of the accountsTable
var numberOfAccountsToRetrieve; // The select control with options for the number of records to retrieve.
var btnRetrieveAccounts; //The button to retrieve accounts
var accountsRetrieved; //The span displaying the number of account records retrieved.
var successMessage; // The message displayed when records are returned.
var totalAccountCount = 0;
document.onreadystatechange = function () {
if (document.readyState == "complete") {
btnRetrieveAccounts = document.getElementById("btnRetrieveAccounts");
accountsGrid = document.getElementById("accountsGrid");
numberOfAccountsToRetrieve = document.getElementById("numberOfAccountsToRetrieve");
accountsRetrieved = document.getElementById("accountsRetrieved");
successMessage = document.getElementById("successMessage");
btnRetrieveAccounts.onclick = retrieveAccounts;
btnRetrieveAccounts.click();
}
}
function retrieveAccounts() {
///<summary>
/// Retrieves accounts by passing a filter to the SDK.RestEndpointPaging.RetrieveRecords function
///</summary>
clearaccountsGrid();
var number = parseInt(numberOfAccountsToRetrieve.options[numberOfAccountsToRetrieve.selectedIndex].value, 10);
var options = "$select=Name,Telephone1&$top=" + number;
//The retrieveAccountsCallBack function is passed through as the successCallBack.
SDK.REST.retrieveMultipleRecords("Account", options, retrieveAccountsCallBack, function (error) { alert(error.message); }, accountsRetrieveComplete);
}
function retrieveAccountsCallBack(retrievedAccounts) {
///<summary>
/// This function is passed through the request and is iterated for each page of data
/// This function appends rows to the accountsGrid.
///</summary>
totalAccountCount = totalAccountCount + retrievedAccounts.length;
for (var i = 0; i < retrievedAccounts.length; i++) {
var account = retrievedAccounts[i];
var row = document.createElement("tr");
var nameCell = document.createElement("td");
setElementText(nameCell, account.Name);
row.appendChild(nameCell);
var mainPhoneCell = document.createElement("td");
setElementText(mainPhoneCell, (account.Telephone1 == null) ? "" : account.Telephone1);
mainPhoneCell.className = "rightColumn";
row.appendChild(mainPhoneCell);
accountsGrid.appendChild(row);
}
}
function accountsRetrieveComplete() {
///<summary>
/// This function is called after all the records have been returned to update the actual total number of records.
///</summary>
accountsRetrieved.innerText = totalAccountCount;
successMessage.style.display = "block";
}
function clearaccountsGrid() {
///<summary>
/// This function initializes the totalAccountCount and clears all the rows from the accountsGrid
/// in preparation for adding a new set of rows.
///</summary>
successMessage.style.display = "none";
totalAccountCount = 0;
for (var i = accountsGrid.rows.length - 1; i >= 0; i--) {
accountsGrid.deleteRow(i);
}
}
function setElementText(element, text) {
///<summary>
/// This function mitigates the fact that IE uses innerText and other browsers use textContent.
///</summary>
if (typeof (element.innerText) != "undefined")
{ element.innerText = text; }
else
{ element.textContent = text; }
}
</script>
</head>
<body>
<table id="tableHeadings" summary="This table provides the headings for the list of accounts displayed in a grid.">
<thead>
<tr>
<th class="leftColumn">
Account Name
</th>
<th class="rightColumn">
Main Phone
</th>
</tr>
</thead>
</table>
<div id="tableContainer">
<table id="accountsTable" rules="groups" summary="This table displays the accounts retrieved.">
<tbody id="accountsGrid" />
</table>
</div>
<div id="controlsContainer">
<div>
<span>Maximum Number of Accounts to Retrieve:
<select id="numberOfAccountsToRetrieve">
<option value="10" selected="selected">10</option>
<option value="100" selected="selected">100</option>
<option value="300">300</option>
<option value="600">600</option>
<option value="900">900</option>
</select>
<button id="btnRetrieveAccounts">
Retrieve Accounts</button>
</span>
</div>
<div id="successMessage" style="display: none;">
Total Number of Accounts Retrieved : <span id="accountsRetrieved"></span>
</div>
</div>
</body>
</html>
sample_/Scripts/SDK.REST.js
if (typeof (SDK) == "undefined")
{ SDK = { __namespace: true }; }
SDK.REST = {
_context: function () {
///<summary>
/// Private function to the context object.
///</summary>
///<returns>Context</returns>
if (typeof GetGlobalContext != "undefined")
{ return GetGlobalContext(); }
else {
if (typeof Xrm != "undefined") {
return Xrm.Page.context;
}
else
{ throw new Error("Context is not available."); }
}
},
_getClientUrl: function () {
///<summary>
/// Private function to return the server URL from the context
///</summary>
///<returns>String</returns>
var clientUrl = this._context().getClientUrl()
return clientUrl;
},
_ODataPath: function () {
///<summary>
/// Private function to return the path to the REST endpoint.
///</summary>
///<returns>String</returns>
return this._getClientUrl() + "/XRMServices/2011/OrganizationData.svc/";
},
_errorHandler: function (req) {
///<summary>
/// Private function return an Error object to the errorCallback
///</summary>
///<param name="req" type="XMLHttpRequest">
/// The XMLHttpRequest response that returned an error.
///</param>
///<returns>Error</returns>
//Error descriptions come from https://support.microsoft.com/kb/193625
if (req.status == 12029)
{ return new Error("The attempt to connect to the server failed."); }
if (req.status == 12007)
{ return new Error("The server name could not be resolved."); }
var errorText;
try
{ errorText = JSON.parse(req.responseText).error.message.value; }
catch (e)
{ errorText = req.responseText }
return new Error("Error : " +
req.status + ": " +
req.statusText + ": " + errorText);
},
_dateReviver: function (key, value) {
///<summary>
/// Private function to convert matching string values to Date objects.
///</summary>
///<param name="key" type="String">
/// The key used to identify the object property
///</param>
///<param name="value" type="String">
/// The string value representing a date
///</param>
var a;
if (typeof value === 'string') {
a = /Date\(([-+]?\d+)\)/.exec(value);
if (a) {
return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));
}
}
return value;
},
_parameterCheck: function (parameter, message) {
///<summary>
/// Private function used to check whether required parameters are null or undefined
///</summary>
///<param name="parameter" type="Object">
/// The parameter to check;
///</param>
///<param name="message" type="String">
/// The error message text to include when the error is thrown.
///</param>
if ((typeof parameter === "undefined") || parameter === null) {
throw new Error(message);
}
},
_stringParameterCheck: function (parameter, message) {
///<summary>
/// Private function used to check whether required parameters are null or undefined
///</summary>
///<param name="parameter" type="String">
/// The string parameter to check;
///</param>
///<param name="message" type="String">
/// The error message text to include when the error is thrown.
///</param>
if (typeof parameter != "string") {
throw new Error(message);
}
},
_callbackParameterCheck: function (callbackParameter, message) {
///<summary>
/// Private function used to check whether required callback parameters are functions
///</summary>
///<param name="callbackParameter" type="Function">
/// The callback parameter to check;
///</param>
///<param name="message" type="String">
/// The error message text to include when the error is thrown.
///</param>
if (typeof callbackParameter != "function") {
throw new Error(message);
}
},
createRecord: function (object, type, successCallback, errorCallback) {
///<summary>
/// Sends an asynchronous request to create a new record.
///</summary>
///<param name="object" type="Object">
/// A JavaScript object with properties corresponding to the Schema name of
/// entity attributes that are valid for create operations.
///</param>
///<param name="type" type="String">
/// The Schema Name of the Entity type record to create.
/// For an Account record, use "Account"
///</param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called by a successful response.
/// This function can accept the returned record as a parameter.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
this._parameterCheck(object, "SDK.REST.createRecord requires the object parameter.");
this._stringParameterCheck(type, "SDK.REST.createRecord requires the type parameter is a string.");
this._callbackParameterCheck(successCallback, "SDK.REST.createRecord requires the successCallback is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.createRecord requires the errorCallback is a function.");
var req = new XMLHttpRequest();
req.open("POST", encodeURI(this._ODataPath() + type + "Set"), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 201) {
successCallback(JSON.parse(this.responseText, SDK.REST._dateReviver).d);
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
req.send(JSON.stringify(object));
},
retrieveRecord: function (id, type, select, expand, successCallback, errorCallback) {
///<summary>
/// Sends an asynchronous request to retrieve a record.
///</summary>
///<param name="id" type="String">
/// A String representing the GUID value for the record to retrieve.
///</param>
///<param name="type" type="String">
/// The Schema Name of the Entity type record to retrieve.
/// For an Account record, use "Account"
///</param>
///<param name="select" type="String">
/// A String representing the $select OData System Query Option to control which
/// attributes will be returned. This is a comma separated list of Attribute names that are valid for retrieve.
/// If null all properties for the record will be returned
///</param>
///<param name="expand" type="String">
/// A String representing the $expand OData System Query Option value to control which
/// related records are also returned. This is a comma separated list of of up to 6 entity relationship names
/// If null no expanded related records will be returned.
///</param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called by a successful response.
/// This function must accept the returned record as a parameter.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
this._stringParameterCheck(id, "SDK.REST.retrieveRecord requires the id parameter is a string.");
this._stringParameterCheck(type, "SDK.REST.retrieveRecord requires the type parameter is a string.");
if (select != null)
this._stringParameterCheck(select, "SDK.REST.retrieveRecord requires the select parameter is a string.");
if (expand != null)
this._stringParameterCheck(expand, "SDK.REST.retrieveRecord requires the expand parameter is a string.");
this._callbackParameterCheck(successCallback, "SDK.REST.retrieveRecord requires the successCallback parameter is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.retrieveRecord requires the errorCallback parameter is a function.");
var systemQueryOptions = "";
if (select != null || expand != null) {
systemQueryOptions = "?";
if (select != null) {
var selectString = "$select=" + select;
if (expand != null) {
selectString = selectString + "," + expand;
}
systemQueryOptions = systemQueryOptions + selectString;
}
if (expand != null) {
systemQueryOptions = systemQueryOptions + "&$expand=" + expand;
}
}
var req = new XMLHttpRequest();
req.open("GET", encodeURI(this._ODataPath() + type + "Set(guid'" + id + "')" + systemQueryOptions), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 200) {
successCallback(JSON.parse(this.responseText, SDK.REST._dateReviver).d);
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
req.send();
},
updateRecord: function (id, object, type, successCallback, errorCallback) {
///<summary>
/// Sends an asynchronous request to update a record.
///</summary>
///<param name="id" type="String">
/// A String representing the GUID value for the record to retrieve.
///</param>
///<param name="object" type="Object">
/// A JavaScript object with properties corresponding to the Schema Names for
/// entity attributes that are valid for update operations.
///</param>
///<param name="type" type="String">
/// The Schema Name of the Entity type record to retrieve.
/// For an Account record, use "Account"
///</param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called by a successful response.
/// Nothing will be returned to this function.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
this._stringParameterCheck(id, "SDK.REST.updateRecord requires the id parameter.");
this._parameterCheck(object, "SDK.REST.updateRecord requires the object parameter.");
this._stringParameterCheck(type, "SDK.REST.updateRecord requires the type parameter.");
this._callbackParameterCheck(successCallback, "SDK.REST.updateRecord requires the successCallback is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.updateRecord requires the errorCallback is a function.");
var req = new XMLHttpRequest();
req.open("POST", encodeURI(this._ODataPath() + type + "Set(guid'" + id + "')"), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("X-HTTP-Method", "MERGE");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204 || this.status == 1223) {
successCallback();
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
req.send(JSON.stringify(object));
},
deleteRecord: function (id, type, successCallback, errorCallback) {
///<summary>
/// Sends an asynchronous request to delete a record.
///</summary>
///<param name="id" type="String">
/// A String representing the GUID value for the record to delete.
///</param>
///<param name="type" type="String">
/// The Schema Name of the Entity type record to delete.
/// For an Account record, use "Account"
///</param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called by a successful response.
/// Nothing will be returned to this function.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
this._stringParameterCheck(id, "SDK.REST.deleteRecord requires the id parameter.");
this._stringParameterCheck(type, "SDK.REST.deleteRecord requires the type parameter.");
this._callbackParameterCheck(successCallback, "SDK.REST.deleteRecord requires the successCallback is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.deleteRecord requires the errorCallback is a function.");
var req = new XMLHttpRequest();
req.open("POST", encodeURI(this._ODataPath() + type + "Set(guid'" + id + "')"), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("X-HTTP-Method", "DELETE");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204 || this.status == 1223) {
successCallback();
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
req.send();
},
retrieveMultipleRecords: function (type, options, successCallback, errorCallback, OnComplete) {
///<summary>
/// Sends an asynchronous request to retrieve records.
///</summary>
///<param name="type" type="String">
/// The Schema Name of the Entity type record to retrieve.
/// For an Account record, use "Account"
///</param>
///<param name="options" type="String">
/// A String representing the OData System Query Options to control the data returned
///</param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called for each page of records returned.
/// Each page is 50 records. If you expect that more than one page of records will be returned,
/// this function should loop through the results and push the records into an array outside of the function.
/// Use the OnComplete event handler to know when all the records have been processed.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
///<param name="OnComplete" type="Function">
/// The function that will be called when all the requested records have been returned.
/// No parameters are passed to this function.
/// </param>
this._stringParameterCheck(type, "SDK.REST.retrieveMultipleRecords requires the type parameter is a string.");
if (options != null)
this._stringParameterCheck(options, "SDK.REST.retrieveMultipleRecords requires the options parameter is a string.");
this._callbackParameterCheck(successCallback, "SDK.REST.retrieveMultipleRecords requires the successCallback parameter is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.retrieveMultipleRecords requires the errorCallback parameter is a function.");
this._callbackParameterCheck(OnComplete, "SDK.REST.retrieveMultipleRecords requires the OnComplete parameter is a function.");
var optionsString;
if (options != null) {
if (options.charAt(0) != "?") {
optionsString = "?" + options;
}
else
{ optionsString = options; }
}
var req = new XMLHttpRequest();
req.open("GET", this._ODataPath() + type + "Set" + optionsString, true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 200) {
var returned = JSON.parse(this.responseText, SDK.REST._dateReviver).d;
successCallback(returned.results);
if (returned.__next != null) {
var queryOptions = returned.__next.substring((SDK.REST._ODataPath() + type + "Set").length);
SDK.REST.retrieveMultipleRecords(type, queryOptions, successCallback, errorCallback, OnComplete);
}
else
{ OnComplete(); }
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
req.send();
},
associateRecords: function (parentId, parentType, relationshipName, childId, childType, successCallback, errorCallback) {
this._stringParameterCheck(parentId, "SDK.REST.associateRecords requires the parentId parameter is a string.");
///<param name="parentId" type="String">
/// The Id of the record to be the parent record in the relationship
/// </param>
///<param name="parentType" type="String">
/// The Schema Name of the Entity type for the parent record.
/// For an Account record, use "Account"
/// </param>
///<param name="relationshipName" type="String">
/// The Schema Name of the Entity Relationship to use to associate the records.
/// To associate account records as a Parent account, use "Referencedaccount_parent_account"
/// </param>
///<param name="childId" type="String">
/// The Id of the record to be the child record in the relationship
/// </param>
///<param name="childType" type="String">
/// The Schema Name of the Entity type for the child record.
/// For an Account record, use "Account"
/// </param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called by a successful response.
/// Nothing will be returned to this function.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
this._stringParameterCheck(parentType, "SDK.REST.associateRecords requires the parentType parameter is a string.");
this._stringParameterCheck(relationshipName, "SDK.REST.associateRecords requires the relationshipName parameter is a string.");
this._stringParameterCheck(childId, "SDK.REST.associateRecords requires the childId parameter is a string.");
this._stringParameterCheck(childType, "SDK.REST.associateRecords requires the childType parameter is a string.");
this._callbackParameterCheck(successCallback, "SDK.REST.associateRecords requires the successCallback parameter is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.associateRecords requires the errorCallback parameter is a function.");
var req = new XMLHttpRequest();
req.open("POST", encodeURI(this._ODataPath() + parentType + "Set(guid'" + parentId + "')/$links/" + relationshipName), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204 || this.status == 1223) {
successCallback();
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
var childEntityReference = {}
childEntityReference.uri = this._ODataPath() + "/" + childType + "Set(guid'" + childId + "')";
req.send(JSON.stringify(childEntityReference));
},
disassociateRecords: function (parentId, parentType, relationshipName, childId, successCallback, errorCallback) {
this._stringParameterCheck(parentId, "SDK.REST.disassociateRecords requires the parentId parameter is a string.");
///<param name="parentId" type="String">
/// The Id of the record to be the parent record in the relationship
/// </param>
///<param name="parentType" type="String">
/// The Schema Name of the Entity type for the parent record.
/// For an Account record, use "Account"
/// </param>
///<param name="relationshipName" type="String">
/// The Schema Name of the Entity Relationship to use to disassociate the records.
/// To disassociate account records as a Parent account, use "Referencedaccount_parent_account"
/// </param>
///<param name="childId" type="String">
/// The Id of the record to be disassociated as the child record in the relationship
/// </param>
///<param name="successCallback" type="Function">
/// The function that will be passed through and be called by a successful response.
/// Nothing will be returned to this function.
/// </param>
///<param name="errorCallback" type="Function">
/// The function that will be passed through and be called by a failed response.
/// This function must accept an Error object as a parameter.
/// </param>
this._stringParameterCheck(parentType, "SDK.REST.disassociateRecords requires the parentType parameter is a string.");
this._stringParameterCheck(relationshipName, "SDK.REST.disassociateRecords requires the relationshipName parameter is a string.");
this._stringParameterCheck(childId, "SDK.REST.disassociateRecords requires the childId parameter is a string.");
this._callbackParameterCheck(successCallback, "SDK.REST.disassociateRecords requires the successCallback parameter is a function.");
this._callbackParameterCheck(errorCallback, "SDK.REST.disassociateRecords requires the errorCallback parameter is a function.");
var req = new XMLHttpRequest();
req.open("POST", encodeURI(this._ODataPath() + parentType + "Set(guid'" + parentId + "')/$links/" + relationshipName + "(guid'" + childId + "')"), true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("X-HTTP-Method", "DELETE");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204 || this.status == 1223) {
successCallback();
}
else {
errorCallback(SDK.REST._errorHandler(this));
}
}
};
req.send();
},
__namespace: true
};
sample_/Styles/JavaScriptRESTRetrieveMultiple.css
関連項目
OData エンドポイントを使用した Microsoft Dynamics CRM 2015 データをクエリ
返されるレコード数の制限
Ajax および JScript Web リソースで OData エンドポイントを使用する
サンプル: OData エンドポイントと JavaScript を使用したレコードの関連付けおよび関連付け解除
Web リソースで OData エンドポイントを使用する
技術記事: Using Option Set Options with the REST Endpoint - JScript (REST エンドポイントでのオプション セットのオプションの使用 - JScript)
© 2017 Microsoft. All rights reserved. 著作権