Search code examples
javascriptdynamics-crm-2016

Dynamics CRM 2016 - Retrieve lookupfield value


I'm using a script to populate one entity with information from another entity. It works great, i can do it for all static fields no problem at all.

However, when one of the fields is a lookup field, it doesn't work.

Could someone please point me in the right direction to get the below working?

In the below example the new_rehabconsultant field is the lookup field on the contact form. The new_UnitNumber is a static single line of text field. The new_UnitNumber is populating fine, the new_rehabconsultant lookup field isn't

function Contact_OnChange() {
var contact = Xrm.Page.getAttribute("regardingobjectid").getValue();

if (contact == null) {
    return;
}

var serverUrl = Xrm.Page.context.getClientUrl();
var oDataSelect = serverUrl + "/XRMServices/2011/OrganizationData.svc/ContactSet?$select=new_UnitNumber,new_rehabconsultant&$filter=ContactId eq guid'" + contact[0].id + "'";

var retrieveReq = new XMLHttpRequest();
retrieveReq.open("GET", oDataSelect, false);
retrieveReq.setRequestHeader("Accept", "application/json");
retrieveReq.setRequestHeader("Content-Type", "application/json;charset=utf-8");
retrieveReq.onreadystatechange = function () {
    GetContactData(this);
};
retrieveReq.send();
}

function GetContactData(retrieveReq) {
if (retrieveReq.readyState == 4) {
    if (retrieveReq.status == 200) {
        var retrieved = JSON.parse(retrieveReq.responseText).d;
                 Xrm.Page.getAttribute("new_unitnumber").setValue(retrieved.results[0].new_UnitNumber);
    Xrm.Page.getAttribute("new_rehabconsultant").setValue(retrieved.results[0].new_rehabconsultant);
    }
}
}

Solution

  • You're trying to fit the cube inside the triangle here, it's a problem of data model being different between oData (Entity reference) and Form (Lookup).

    You should do this (slightly rewritten for readability):

    function GetContactData(retrieveReq) {
        if (retrieveReq.readyState == 4) {
            if (retrieveReq.status == 200) {
                var retrieved = JSON.parse(retrieveReq.responseText).d;
                Xrm.Page.getAttribute("new_unitnumber").setValue(retrieved.results[0].new_UnitNumber);
                var record = retrieved.results[0].new_rehabconsultant;
                // mind the square brackets, lookup values are *arrays*
                var value = [{ id: record.Id, name: record.Name, entityType: record.LogicalName }];
    
                Xrm.Page.getAttribute("new_rehabconsultant").setValue(value);
            }
        }
    }
    

    Beware that this isn't meant to be copy-pasted but serves as a PoC about what's wrong in the OP.