14

Estoy trabajando en algunas personalizaciones de CRM 2011 Online y necesito obtener una entidad que use javascript.CRM 2011: obtención de entidad con Javascript

La entidad que necesito se basará en el valor de identificación de otro campo (una entidad de contacto); esta ID de contacto me puede quedar bien.

La entidad que deseo es una entidad personalizada. Puede haber varias coincidencias basadas en la Identificación de contacto así que sólo quiero conseguir el primero de la lista (orden no es importante)

Hasta ahora he mirado en un par de maneras de hacer esto ...

  • OData - no podía encontrar suficientes ejemplos de este en cuanto a lo expresiones de consulta que puede crear, también no sé si/cómo hacer este trabajo para entidades personalizadas

  • FetchXML - puedo crear una una buena consulta FetchXML usando el "hallazgo avanzado" incorporado y estaré encantado de llamar esto desde javascript si alguien puede ayudar? Encontré una respuesta prometedora here pero no pude ver cómo se estaban estableciendo los datos de retorno de "resultados" (función Service.Fetch)

  • Solicitud SOAP - Lo primero que probé es un método similar al que podría haber hecho en CRM 4 pero esto no parece funcionar. Aunque la solicitud se ejecuta, los datos de mi resultado parecen estar vacíos. Esto es todo lo que tengo código para que si alguien puede detectar un problema con el código a continuación, sería genial.

EDITAR: He visto algunos datos de consulta redundante (que había eliminado enlace apertura etiquetas pero dejó etiquetas de cierre) - ya retirar esta Ahora recibe los datos del resultado XML ... sin embargo, la cláusula en que no lo hace parece aplicarse (acaba de obtener la lista de todas las entidades)

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; 

lo siento por los grandes post código, pero es de esperar que alguien que tiene una mejor comprensión puede ayudar

Respuesta

28

en primer lugar, gracias a GlennFerrieLive para su puesto de respuesta. Las muestras que encontré con el Dynamics CRM 2011 SDK (bueno solo una en particular) realmente me ayudaron y el analizador JSON incluido fue perfecto para el trabajo.

Estoy publicando esta respuesta para dar un ejemplo completo de cómo lo hice con algunos comentarios importantes para prestar atención a lo que puede no ser tan obvio en los ejemplos de SDK.


ser seleccionado valor de ID de campo de búsqueda

El objetivo de mi tarea consistía en usar javascript para conseguir establecer un campo de búsqueda, basado en los datos seleccionados de otra entidad de búsqueda. La entidad a configurar es "new_vehicle" y la entidad a consultar es "cliente".

El primer trabajo es obtener el valor de ID del campo de búsqueda de contactos ...

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

Consulta de una entidad con un ID de

Lo siguiente es la parte en la que utiliza el valor ID del cliente para encontrar el vehículo que se encuentra actualmente asignado a ellos (la entidad que desea utilizar para establecer un campo de búsqueda).

primer problema que nos encontramos fue que cuando se consulta con OData, no parece que el valor de ID para trabajar con llaves {} - por lo que estos deben ser eliminados ...

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

A continuación presentamos lo mejor oDataPath ...

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

entonces podemos construir la consulta OData ...

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

NOTA: Hay un par de cart e de las cosas importantes a tener en cuenta aquí ...

  1. Cuando se utiliza un valor GUID que explícitamente que decir que es un GUID utilizando (guid'xxx')
  2. Cuando se filtra por una entidad de consulta (por ejemplo, new_PrimaryDriver) debe agregar el valor para consultar (por ejemplo, Id) - esto se traduce en new_PrimaryDriver/Id

Una vez que tenemos la configuración de consulta podemos solicitar los datos de la siguiente manera ...

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

Nota que esta es una llamada asincrónica y la función onreadystatechange se procesará al finalizar, en esta función hacemos un par de comprobaciones para ver si fue un éxito y analizamos los datos JSON resultantes: la función JSON.Parse se ha incluido en al final de esta publicación (pero está disponible en el SDK)


Configuración de un campo de búsqueda utilizando la entidad consultada por encima de

La otra función para tomar nota de que aquí es SetLookup que es simplemente una función de ayuda sencilla añadí para establecer un campo de búsqueda. Este es el siguiente ...

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

función de análisis JSON

Ésta es la función auxiliar JSON que se utilizó en el código anterior (JSON.parse), pega como se encontró en el 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

Dynamics CRM ?, no lo compre si necesita personalizaciones: D requisito simple, complicado aplicación ... – Legends

Cuestiones relacionadas