14

일부 CRM 2011 온라인 맞춤 설정 작업을하고 있으며 자바 스크립트를 사용하여 엔티티를 가져와야합니다.CRM 2011 : Javascript로 엔티티 가져 오기

필자가 필요로하는 엔티티는 다른 필드 (연락처 엔티티)의 ID 값을 기반으로합니다.이 연락처 ID는 정상적으로 처리 될 수 있습니다.

원하는 엔터티는 사용자 지정 엔터티입니다. ... 그래서 난 그냥 목록에서 첫 번째 (중요하지 않기 위해) 지금까지이 작업을 수행 할 수있는 몇 가지 방법으로 보았다

을 얻고 싶은 연락처 ID를 기반으로 여러 일치가있을 수 있습니다

  • 중 하나로, OData - 내가 어떤 쿼리 식을 만들 수 있습니다하도록 사용자 지정 엔터티

  • FetchXML이 일을하는 방법을 /면, 나도 몰라이 충분한 예를 찾을 수 없습니다 - 나는를 만들 수 있습니다 내장 된 "고급 찾기"를 사용하여 멋진 FetchXML 쿼리도 도움이 될 수 있다면 javascript에서 이것을 호출 해 드리겠습니다. 하나의 유망한 답변을 찾았습니다 here하지만 "결과"반환 데이터 (Service.Fetch 함수)를 설정하는 방법을 볼 수 없습니다

  • SOAP 요청 - 제가 시도한 첫 번째 방법은 CRM에서 수행 할 수있는 것과 비슷한 방법입니다 4 그러나 이것은 효과가없는 것처럼 보입니다. 요청이 실행 되더라도 결과 데이터가 비어있는 것 같습니다. 이것은 내가 코드를 가지고 있기 때문에 하나의 코드가 아래에있는 코드에 문제를 일으킬 수 있다면 그렇게 될 것입니다.

편집 : 나는 (I 닫는 태그를 태그를 여는 링크를 제거하지만 떠난) 일부 중복 쿼리 데이터를 발견했다 - 나는 지금 XML 결과 데이터를 얻을이를 제거하기 때문에 ... 그러나, where 절하지 않습니다 적용하는 것 자신의 답변 게시물에 대한 GlennFerrieLive에, 덕분에 큰 코드 포스트에 대한

var xml = "<?xml version='1.0' encoding='utf-8'?>" + 
    "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + 
    GenerateAuthenticationHeader() + 
    "<soap:Body>" + 
    "<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" + 
    "<query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" + 
    "<q1:EntityName>new_vehicle</q1:EntityName>" + 
    "<q1:ColumnSet xsi:type='q1:ColumnSet'>" + 
    "<q1:Attributes>" + 
    "<q1:Attribute>new_vehicleid</q1:Attribute>" + 
    "<q1:Attribute>new_primarydriver</q1:Attribute>" + 
    "<q1:Attribute>statuscode</q1:Attribute>" + 
    "<q1:Attribute>new_registration</q1:Attribute>" + 
    "</q1:Attributes>" + 
    "</q1:ColumnSet>" + 
    "<q1:Distinct>false</q1:Distinct>" + 

    "<q1:Conditions>" + 

        "<q1:Condition>" + 
        "<q1:AttributeName>new_primarydriver</q1:AttributeName>" + 
    "<q1:Operator>Equal</q1:Operator>" + 
    "<q1:Values>" + 
    "<q1:Value xmlns:q2='http://microsoft.com/wsdl/types/' xsi:type='q2:guid'>" + 
    customerID + 
    "</q1:Value></q1:Values></q1:Condition>" + 

    "</q1:Conditions>" + 

    "</query></RetrieveMultiple>" + 
    "</soap:Body></soap:Envelope>"; 


    var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP"); 

    xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); 
    xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple"); 
    xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); 
    xmlHttpRequest.setRequestHeader("Content-Length", xml.length); 
    xmlHttpRequest.send(xml); 

    var result = xmlHttpRequest.responseXML.xml; 
    var doc = new ActiveXObject("MSXML2.DOMDocument"); 
    doc.async = false; 
    doc.loadXML(result); 

    var id = doc.selectSingleNode("//new_vehicleid"); 
    var registration = doc.selectSingleNode("//new_registration"); 

    if(id == null) 
     return null; 

    var vehicle = new Array(); 
        value[0] = new Object(); 
        value[0].id = id; 
        value[0].name = registration; 
        value[0].entityType = "new_vehicle"; 

    return vehicle; 

죄송합니다 (다만 모든 엔티티의 목록을 얻을 수)하지만 더 나은 이해를 가지고 희망 누군가가 먼저

답변

28

도움을 줄 수 있습니다. Dynamics CRM 2011 SDK으로 발견 된 샘플 (특히 그 중 하나)은 실제로 도움이되었으며 포함 된 JSON 파서는 작업에 완벽했습니다.

나는 SDK 예제에서 그다지 분명하지 않을 수있는 몇 가지 중요한 주석을 어떻게 사용했는지에 대한 예제를 제공하기 위해이 답변을 게시하고 있습니다.


내 작업의 목적은 다른 조회 엔티티의 선택된 데이터를 기반으로 조회 필드를 설정 얻기 위해 자바 스크립트를 사용하는 것이었다 조회 필드에서 ID 값을 선택하기. 설정할 엔터티는 "new_vehicle"이고 쿼리 할 엔터티는 "customer"입니다.

첫 번째 작업은 연락처 조회 필드의 ID 값을 가져 오는 것입니다.

var customerItem = Xrm.Page.getAttribute("customerid").getValue(); 
var customerID = customerItem[0].id; 

ID를 이용하여 엔티티를 조회

다음 I은 그들 (항목은 I가 사용하고자 할당 된 차량을 찾기 위해 고객 ID 값을 사용하는 일부 조회 필드 설정). 하나로, OData에 쿼리 할 때, ID 값은 중괄호 {}로 작동하지 않는 것이었다

은 내가 찾은

첫 번째 문제 - 그래서이 제거 될 필요가 ...

customerID = customerID.replace('{', '').replace('}', ''); 

다음으로 우리는 oDataPath를 얻을 수 ...

var oDataPath = Xrm.Page.context.getServerUrl() + "/xrmservices/2011/organizationdata.svc"; 

그런 다음 우리는 ...

var filter = "/new_vehicleSet?" + 
    "$select=new_vehicleId,new_Registration" + 
    "&$filter=new_PrimaryDriver/Id eq (guid'" + customerID + "')" + 
    "&$orderby=new_LastAllocationDate desc" + 
    "&$top=1"; 

주를 하나로, OData 쿼리를 구성 할 수 있습니다하십시오 COUPL 있습니다 중요한 일의 전자 당신이 그것을 사용하여 GUID라고 명시해야한다

  1. 은 GUID 값을 사용하는 경우 ... 여기서주의 할 (guid'xxx')
  2. 조회 엔티티에 의해 필터링 (예를 들어, new_PrimaryDriver) 당신이 (예를 들면 이드 쿼리 값을 추가해야합니다) -이는 new_PrimaryDriver/아이디 결과

우리는 다음과 같이 우리가 데이터를 요청할 수있는 쿼리 설정 ...

var retrieveRecordsReq = new XMLHttpRequest(); 
retrieveRecordsReq.open("GET", oDataPath + filter, true); 
retrieveRecordsReq.setRequestHeader("Accept", "application/json"); 
retrieveRecordsReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
retrieveRecordsReq.onreadystatechange = function() { 
    if (this.readyState == 4) { 
     if (this.status == 200) { 
      var retrievedRecords = JSON.parse(retrieveRecordsReq.responseText).d; 
      if(retrievedRecords.results.length > 0) 
      { 
       var vehicle = retrievedRecords.results[0]; 
       SetLookup("new_replacedvehicle", vehicle.new_vehicleId, vehicle.new_Registration, "new_vehicle"); 
      } 
     } 
    } 
}; 
retrieveRecordsReq.send(); 

참고가되면 이것이 비동기 호출이고 onreadystatechange 함수가 완료되면 처리 될 것입니다.이 함수에서는 성공인지 여부와 결과 JSON 데이터를 파싱 하는지를 확인하기 위해 JSON.Parse 함수가 포함되어 있습니다 이 게시물의 하단 (그러나 SDK에서 가능)

여기에서 주목을 만들기 위해

다른 기능보다 쿼리 엔티티를 사용하여 조회 필드를 설정는


내가 조회 필드를 설정하는 추가 단순한 도우미 함수 인 SetLookup이다. 이것은 다음과 같이 ...이다

function SetLookup(fieldName, idValue, textValue, typeValue) { var value = new Array(); value[0] = new Object(); value[0].id = idValue; value[0].name = textValue; value[0].typename = typeValue; Xrm.Page.getAttribute(fieldName).setValue(value); } 

JSON 파싱 기능

이것은 그것이 발견되었을 때, 상기 코드 (JSON.parse)에 사용되는 접착 된 JSON 도우미 함수 SDK ...

if (!this.JSON) { this.JSON = {}; } (function() { function f(n) { return n < 10 ? '0' + n : n; } if (typeof Date.prototype.toJSON !== 'function') { Date.prototype.toJSON = function (key) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) { return this.valueOf(); }; } var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' }, rep; function quote(string) { escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { var i, k, v, length, mind = gap, partial, value = holder[key]; if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); } if (typeof rep === 'function') { value = rep.call(holder, key, value); } switch (typeof value) { case 'string': return quote(value); case 'number': return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': return String(value); case 'object': if (!value) { return 'null'; } gap += indent; partial = []; if (Object.prototype.toString.apply(value) === '[object Array]') { length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { k = rep[i]; if (typeof k === 'string') { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } if (typeof JSON.stringify !== 'function') { JSON.stringify = function (value, replacer, space) { var i; gap = ''; indent = ''; if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } } else if (typeof space === 'string') { indent = space; } rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('JSON.stringify'); } return str('', { '': value }); }; } if (typeof JSON.parse !== 'function') { JSON.parse = function (text, reviver) { var j; function walk(holder, key) { var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { j = eval('(' + text + ')'); return typeof reviver === 'function' ? walk({ '': j }, '') : j; } throw new SyntaxError('JSON.parse'); }; } }()); 
+0

CRM Dynamics?는 사용자 정의가 필요한 경우 구입하지 마십시오. D 단순 요구 사항, 복잡한 구현 ... – Legends