Home

Leer y grabar datos en un campo Lookup (Búsqueda) en Microsoft Dynamics CRM 2011 con Javascript

webmaster's picture

En muchas ocasiones cuando necesitamos obtener datos de un campo de tipo lookup debemos tener en cuenta que es de tipo objeto() y en su interior posee 3 valores importantes que debemos tratar si queremos tanto leer como grabar los datos.

Para obtener los valores usaremos un ejemplo parecido a continuación:

var busqueda = new Array();
busqueda = Xrm.Page.getAttribute("nombre_campo").getValue();
if (busqueda != null) {
    var nombre = busqueda[0].name;
    var id = busqueda [0].id;
    var entityType = busqueda[0].entityType;
}

Para grabar los valores en usaremos un ejemplo parecido a continuación:

var id;
var nombre;
var entityType;
// Suponiendo que los valore de las tres variables anteriores los hemos capturado del ejemplo anterior
var busqueda = new Array();
busqueda[0] = new Object();
busqueda[0].id = id;
busqueda[0].name = nombre;
busqueda[0].entityType = entityType;
Xrm.Page.getAttribute("nombre_campo").setValue(busqueda);

o alternativamente podriamos utilizar:

Xrm.Page.getAttribute("nombre_campo").setValue([{ id: id, name: nombre, entityType: entityType}]);

 

Leyendo un campo tipo lookup a través de una consulta REST.

Aqui la cosa cambia un poco, teniendo en cuenta que el resultado que devuelve la consulta REST al Webservices del CRM viene en formato Json por lo que debemos interpretar que el objeto() vendrá como parte de la consulta y la interpretación de los elemento viene de forma diferente.

En el artículo sobre "Obtener el contenido de algunos campos de la cuenta relacionada en la ficha del contacto en Microsoft Dynamics CRM 2011" faltaba por incluir el campo "Pais" de tipo Lookup. Para hacer la lectura de dicho campo tendríamos que realizar las siguientes inclusiones en el código:

1. Dentro de las variables iniciales, crear una para el Pais

var pais = Array();

2. Modificar la llamada al metodo Retrieve de la XrmServiceToolkit para incluir la toma del país, teniendo en cuenta que el campo se llama new_pais

XrmServiceToolkit.Rest.Retrieve(cuenta_asociada[0].id,"AccountSet",null, null, function(datos){
    direccion = datos.Address1_Line1;
    codpos = datos.Address1_PostalCode;
    ciudad = datos.Address1_City;
    provincia = datos.Address1_StateOrProvince; 
    pais = datos.new_pais;}, function (error){
    equal(true, false, error.message);
    },false);

Esta consulta devolvería un resultado como se muestra a continuación:

{
"d" : {
"results": [
{
"__metadata": {
"uri": "http://vwserver64:8050/LEMURCRM/XRMServices/2011/OrganizationData.svc/AccountSet(guid'c6b7a623-0376-e311-8e12-000c29a7744f')", "type": "Microsoft.Crm.Sdk.Data.Services.Account"
}, "Address1_PostalCode": "28030", "new_pais": {
"__metadata": {
"type": "Microsoft.Crm.Sdk.Data.Services.EntityReference"
}, "Id": "52a0b2fc-737d-e311-9d2f-000c29a7744f", "LogicalName": "new_paises", "Name": "Espa\u00f1a"
}, "Address1_StateOrProvince": "Madrid", "Address1_Line1": "Ave de Manoteras, 38, Bloque D, 412", "Address1_City": "Madrid"
}
]
}
}

3. Como podeis observar el contenido del campo new_pais es una matriz cuyas posiciones son entre otras "Id", "Name" y "type" que son las que nos interesan.  Utilizaremos la variante 2 para grabar los valores en el campo lookup pais del contacto que se llama new_address1_pais de la siguiente forma:

Xrm.Page.data.entity.attributes.get("new_address1_pais").setValue([{id:pais["Id"], name:pais["Name"], entityType:pais["type"]}]);

Asi quedaría la pantalla después de realizar la importación.

Pulse en la imagen para ampliar

Fuente: 

Centro Práctico de LEMURSOLUTION & Knowledge Base de Microsoft Dynamics

Contacto: 
webmaster

Comments

webmaster's picture

Modificación en asignación de valor al Lookup

En el momento de tomar los valores del resultado de la consulta en formato JSON; la posición "type": "Microsoft.Crm.Sdk.Data.Services.EntityReference"contiene un resultado de tipo string con la denominación del tipo de entidad devuelta y si este valor se lo asignamos al campo lookup como entityType, se poduce un desplazamiento en el mismo. Para que funcione bién, debemos asignarle el valor que devuelve la posición "LogicalName".

La sentencia correcta sería esta:

Xrm.Page.data.entity.attributes.get("new_address1_pais").setValue([{id:pais["Id"], name:pais["Name"], entityType:pais["LogicalName"]}]);

o

Xrm.Page.getAttributes("new_address1_pais").setValue([{id:pais["Id"], name:pais["Name"], entityType:pais["LogicalName"]}]);

Microsoft MCSD, .NET Project Manager & ERP-CRM Consultant