Кастомизация
11
Авг
5

Отображение в Lookup’е произвольного поля вместо основного атрибута

Наверное, Вы уже знаете, что поле lookup отображает только значение основного поля связанного объекта. И это не может быть изменено с помощью настроек, т.к. в большинстве случаев этого достаточно.

Однако, если в Вашем случаи необходимо отобразить а лукапе другую информацию (без необходимости открытия формы связанного объекта), то можете воспользоваться ниже представленной JavaScript функцией.

Пример

Допустим на форме Возможной сделки Вы хотите отобразить в лукапе Потенциальный клиент поле Код организации вместо названия бизнес-партнера.

  1. Пойдите к настройке формы объекта (в данном примере это Возможная сделка), где у Вас расположен лукап:
    Добавьте на событие onload эту строчку кода и замените в ней LookupSchemaName на имя Вашего лукапа:

    crmForm.all.LookupSchemaName.FireOnChange();

    Эта строчка запускает код при открытии формы, который мы далее поместим на лукап (чтобы его дважды не копировать). Для чего это нужно? Очень просто – на самом деле мы не можем сделать так, чтобы вместо основного атрибута отображался какой-либо другой (лукап на самом деле представляет собой массив состоящий из трех значений – айдишник связанной записи, значение основного атрибута и тип связанного объека) и поэтому будем в режиме реального времени подставлять в лукап вместо значения основного атрибута любой другой (какой захотим). А доставать значение другого атрибута мы будем с помощью SOAP-запроса. Этот SOAP-запрос мы поместим на поле лукапа (чтобы он срабатывал при изменении лукапа). Но при сохранении формы значение атрибута не сохранится (сохранится его айдишник) и его снова придется вытаскивать при открытии формы. А это строчка? как я уже сказал, всего лишь запустит лукаповский код (который вытаскивает значение какого-либо атрибута из связанного объекта) при загрузке!

    Т.е. я экспериментирую над лукапом Потенциальный клиент, формы Возможная сделка, то эта строчка будет выглядеть так:

    crmForm.all.customerid.FireOnChange();
    
  2. На событие onchange лукапа скопируйте следующий код, в котором определите две переменные:
    • fieldToDisplay = имя атрибута связанного объекта, который Вы хотите отобразить в лукапе вместо основного атрибута.
    • fieldToDisplayIsText, подствьте в него:
      • true, если поле, которое Вы хотите отобразить в лукапе это nvarchar (т.е. текстовое) поле.
      • false, если поле, которое Вы хотите отобразить в лукапе это picklist или лукап.
    var fieldToDisplay = 'accountnumber';
    var fieldToDisplayIsText = true;
    
    var lookupData = new Array();
    var lookupItem= new Object();
    var lookup = event.srcElement.DataValue;
    
    if (typeof(lookup) != 'undefined' && lookup != null && lookup[0] != null) { 
    	var myValue = GetAttributeValueFromID(lookup[0].typename,lookup[0].id,fieldToDisplay,fieldToDisplayIsText); 
    	if(myValue != '') { 
    		lookupItem.id = lookup[0].id; 
    		lookupItem.typename = lookup[0].typename; 
    		lookupItem.name = myValue; 
    		lookupData[0] = lookupItem;  
    		crmForm.all[event.srcElement.id].DataValue = lookupData; 
    	} 
    }
    
    function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName, isTextField) { 
    
    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>" + 
    "		<Execute xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" + 
    "			<Request xsi:type=\"RetrieveRequest\" ReturnDynamicEntities=\"false\">" + 
    "				<Target xsi:type=\"TargetRetrieveDynamic\">" + 
    "					<EntityName>" + sEntityName + "</EntityName>" + 
    "					<EntityId>" + sGUID + "</EntityId>" + 
    "				</Target>" + 
    "				<ColumnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\">" + 
    "					<q1:Attributes>" + 
    "						<q1:Attribute>" + sAttributeName + "</q1:Attribute>" + 
    "					</q1:Attributes>" + 
    "				</ColumnSet>" + 
    "			</Request>" + 
    "		</Execute>" + 
    "	</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/Execute");
    xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); 
    xmlHttpRequest.setRequestHeader("Content-Length", xml.length); 
    xmlHttpRequest.send(xml); 
    
    var result = null;
    
    if(isTextField) { 
    	result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).text; 
    } else { 
    	result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).getAttribute('name'); 
    } 
    
    if (result == null) { 
    	return ''; 
    } else 
    	return result; 
    }
    
    


Тестируем…

Содайте запись объекта Бизнес-партнер и заполните в ней помимо всего прочего поле Код организации! Создайте запись Возможная сделка (или откройте существующую) и выберите в лукапе Потенциальный клиент созданную запись бизнес-партнера!


Комментарии (5)
  • Sergey 11.08.2009

    Спасибо за статью. Очень помогла 🙂

  • slivka_83 11.08.2009

    Пожалуйста 🙂

  • mc707 11.08.2009

    Подскажите, пожалуйста, куда копать:
    При наличии этой доработки на форме перестает работать мультилукап на той же форме, взятый отсюда — http://mmcrm.ru/?p=1254
    Спасибо.

  • slivka_83 11.08.2009

    Если проблема именно в этом, то следует воспользовать отладкой скриптов (где-то на этом сайте есть статья). У меня уже давно нет CRM 4 🙂

    Ну, и как универсальный способ можно такой же функционал забацать с помощью плагина — точно конфликтовать не будет с д ругими скриптами 🙂

  • probka 11.08.2009

    Код не срабатывает, если заполняемое поле доступно только для чтения. Как поступить в таком случае?

*

code