1

契約ラインを取得するためにインシデントフォームに以下のJS関数を記述しましたが、関数は何もしていません。私はFetch Queryを検証し、結果を返します。だからデータは間違いなくそこにある。私はそれをデバッグし、 "this.readyState == 4"のように見えます。ダイナミックCRM:JavaScript GETリクエストがWeb.Apiを使用してレコードを取得していない

誰でも私のコードに間違っていることを教えてください。アセンブリを追加する必要はありますか? onreadystatechangeインサイド

おかげ

function Test() { 

    var customerId = Xrm.Page.getAttribute("parentcustomer").getValue(); 
    if (customerId == null) { 
     return; 
    } 

    var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" + 
     "<entity name='contractdetail'>" + 
     "<attribute name='contractid' />" + 
     "<attribute name='contractdetailid' />" + 
     "<filter type='and'>" + 
     "<condition attribute='statuscode' operator='in'>" + 
     "<value>2</value>" + 
     "<value>1</value>" + 
     "</condition>" + 
     "<condition attribute='customerid' operator='eq' value='" + 
     customerId[0].id + 
     "' />" + 
     "</filter>" +   
     "</entity>" + 
     "</fetch>"; 

    var uri = "/contractdetail?fetchXml=" + encodeURIComponent(fetchXml); 
    var clientUrl = Xrm.Page.context.getClientUrl(); 
    var webAPIPath = "/api/data/v8.1"; 
    uri = clientUrl + webAPIPath + uri; 

    var request = new XMLHttpRequest(); 
    request.open("GET", encodeURI(uri), false); 
    request.setRequestHeader("Accept", "application/json"); 
    request.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
    request.setRequestHeader("OData-MaxVersion", "4.0"); 
    request.setRequestHeader("OData-Version", "4.0"); 
    request.onreadystatechange = function() { 
     if (this.readyState == 4 /* complete */) { 
      request.onreadystatechange = null; 

      switch (this.status) { 
       case 200: // Success with content returned in response body. 
       case 204: // Success with no content returned in response body. 
        var data = JSON.parse(this.response); 
        if (data && data.value) { 
        for (var indexContractLine = 0; indexContractLine < data.value.length; indexContractLine++) { 
         alert(data.value[indexContractLine].contractdetailid); 
         //alert(data.value[indexContractLine]['@odata.etag']); 
        } 
       } 
        break; 
       default: // All other statuses are unexpected so are treated like errors. 
        var error; 
        try { 
         error = JSON.parse(request.response).error; 
        } catch (e) { 
         error = new Error("Unexpected Error"); 
        } 
        alert(error); 
        break; 
      } 

      if (this.status == 200) { 
       var data = JSON.parse(this.response); 
       if (data && data.value) { 
        for (var indexContractLine = 0; indexContractLine < data.value.length; indexContractLine++) { 
         alert(data.value[indexContractLine].contractdetailid); 
         alert(data.value[indexContractLine]['@odata.etag']); 
        } 
       } else { 
        var error = JSON.parse(this.response).error; 
        alert(error.message); 
       } 
      } 
     }; 
     request.send(); 
    } 
} 
+2

ルックを助けることができます:https://github.com/jlattimer/CRMRESTBuilder ...その素晴らしい – KingRider

答えて

3

request

thisを置き換えるここでは、コードのサンプルビットはストレート本番環境(ノートの外にあります:これはPOCである、コピー&ペーストであることを意味していませんあなたのコードの中に)どのように表示されるべきかを示すために:

var xhttp = new XMLHttpRequest(); 
xhttp.onreadystatechange = function() { 
    if (xhttp.readyState == 4) { 
     if (xhttp.status == 200) { 
      xhttp.onreadystatechange = null; // avoid memory leaks 
      var data = JSON.parse(xhttp.response); 
      onsuccess(data); 
     } 
     else { 
      var error = JSON.parse(xhttp.response).error; 
      onerror(error); 
     } 
    } 
}; 
+0

ありがとう@アレックス、私はここに何かを逃していると思います。コードはあなたの推奨事項とまったく同じですが、この条件( 'request.readyState == 4') ' – Scorpion

+0

のreadyStateは1のままで、状態0にはなりません。 – Scorpion

+0

私はここでばかげているだけです。実際に私たちは365にアップグレードしています。私が働いていた組織はまだv8.0になっています。現在、readyStateは4ですが、ステータス404です。 – Scorpion

2

Jason LattimerのCRM RESTBuilderソリューションを使用して、さらにテストを行います。

https://github.com/jlattimer/CRMRESTBuilder

それはあなたがテストし、お好みに合わせて変更することができたWeb APIクエリを作成するためのGUIを提供します。

関連する問題