14

Bazı CRM 2011 Çevrimiçi özelleştirmeleri üzerinde çalışıyorum ve javascript kullanarak bir varlık edinmem gerekiyor.CRM 2011: Javascript ile varlık edinme

İhtiyacım olan varlık, başka bir alanın (bir İletişim varlığı) ID değerine dayanacaktır - bu İrtibat Kimliği İyileşebilir.

İstediğim varlık özel bir varlıktır. ... yüzden sadece birinci listesinde (önemli değil sipariş) Şimdiye kadar bunu yapmak için birkaç yollarını baktım

almak istiyorum İletişim kimliğine dayalı birden çok eşleşme olabilir

  • OData - Ben ne sorgu ifadeleri oluşturabilir olarak özel varlıklar

  • FetchXML için bu işi yapmak için nasıl/eğer, ayrıca bilmiyorum bu konuda yeterli örnekler bulamadı - Ben oluşturabilir yerleşik "gelişmiş bul" kullanarak da güzel FetchXML sorgusu ve herkes yardımcı olabilirse bunu javascript'ten aramaktan mutluluk duyar mı? Bir umut verici yanıt here buldum ama "sonuçların" dönüş verileri nasıl ayarlandığını göremedim (Service.Fetch işlevi)

  • SOAP İsteği - Denediğim ilk şey CRM'de yapabileceğim benzer bir yöntemdir 4 ama bu işe yaramaz. İstek yürütülmesine rağmen sonuç verilerim boş görünüyor. Bu kod için sahip olduğum tek şey şu ki, eğer biri aşağıdaki kodla ilgili bir sorunu tespit edebilirse, o zaman bu harika olur.

DÜZENLEME: (Ben kapanış etiketleri etiketleri açılırken bağlantının kaldırılması ancak bıraktığı) bazı gereksiz sorgu verilerini fark var - Şimdi XML sonucu veri almak bu kaldırarak beri ... Fakat nereye fıkra değil uygulamak gibi görünüyor onun cevabı yazı için GlennFerrieLive sayende büyük kod yazı hakkında

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; 

Maalesef (sadece tüm varlıkların listesini almak) ama daha iyi anlaşılmasını vardır umarım birileri Öncelikle

cevap

28

yardımcı olabilir. Ben Dynamics CRM 2011 SDK (özellikle sadece bir tane) ile bulduğum örnekleri gerçekten yardımcı oldu ve JSON ayrıştırıcı dahil iş için mükemmeldi!

Bu cevabı, SDK örneklerinden bu kadar belirgin olmayabileceğine dikkat çekmek için bazı önemli yorumlarla birlikte yaptığımın tam bir örneğini vermek için gönderiyorum.


Görevimle amacı başka arama varlığın seçilmiş verilere dayalı bir arama alanı, set almak için javascript kullanmaktı arama alanından Kimlik değeri seçilir alın. Ayarlamak için varlık "new_vehicle" ve sorgulamak için varlık "müşteri" dir.

İlk iş, kişi arama alanının kimlik değerini almaktır ...

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

bir kimlik kullanarak bir varlık sorgulama

Sonraki Şu anda onlarla (varlık ı kullanmak istediğiniz atanan aracı bulmak için customerID değerini kullanılan parçasıdır arama alanı belirle). OData ile sorgularken, kimlik değeri süslü parantez {} ile çalışmak görünmüyor oldu

buldum

İlk sorun - bu yüzden bu kaldırılması gerekir ...

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

Sonra oDataPath olsun ...

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

Sonra ...

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

NOT OData sorgu oluşturabilirsiniz: bir coupl vardır önemli şeylerden e bunu kullanarak bir guid olduğunu söylemek açıkça gerekir

  1. bir guid değeri kullanırken ... Burada dikkat edilmesi gereken (guid'xxx')
  2. bir arama varlık tarafından filtreleme (örn new_PrimaryDriver) Eğer (örn Id sorgulamak için value eklemek gerekir) - Bu new_PrimaryDriver/Id sonuçlanır

aşağıdaki gibi biz bilgileri talep edebilirler sorgu kurulum ...

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(); 

Not sahip olduktan sonra bu bir zaman uyumsuz çağrı ve onreadystatechange işlevi tamamlandıktan sonra işlenecektir, bu fonksiyonda bir başarı olup olmadığını görmek için birkaç kontrol yaparız ve sonuçta elde edilen JSON verilerini ayrıştırırız - JSON.Parse fonksiyonu Bu yazının en altında (ancak SDK numaralı telefondan edinilebilir)

Burada not edin

diğer fonksiyon yukarıda sorgulanan varlık kullanılarak bir arama alanı ayarlama


Ben bir arama alanı ayarlamak için eklenen sadece basit bir yardımcı işlevi olan SetLookup olduğunu. şöyle This is ...

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 ayrıştırma işlevi

budur o bulunmuştur olarak, yukarıdaki kod (JSON.parse) kullanılan yapıştırılıp JSON yardımcı işlevi 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 ?, özelleştirmeleri gerekiyorsa onu satın almayın: D Basit gereklilik, karmaşık uygulama ... – Legends