|
|
#1 |
|
Участник
|
Присвоение одного атрибута сущности значения другого атрибута связанной сущности
Имеем 2 связанные сущности, как с помощью скриптов на событие (например сохранение) одному атрибуту присвоить значение атрибута связанной сущности?
|
|
|
|
|
#2 |
|
Kostya Afendikov
|
Цитата:
Вот простая функция X++: function GetAttributeValueFromID(sEntityName, GUID, sAttributeName)
{
var authenticationHeader = GenerateAuthenticationHeader();
// Prepare the SOAP message.
var xml = "";
xml = 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'>"+
authenticationHeader+
"<soap:Body>"+
"<Retrieve xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
"<entityName>"+sEntityName+"</entityName>"+
"<id>"+GUID+"</id>"+
"<columnSet xmlns:q1='http://schemas.microsoft.com/crm/2006/Query' xsi:type='q1:ColumnSet'>"+
"<q1:Attributes>"+
"<q1:Attribute>"+sAttributeName+"</q1:Attribute>"+
"</q1:Attributes>"+
"</columnSet>"+
"</Retrieve>"+
"</soap:Body>"+
"</soap:Envelope>";
// Prepare the xmlHttpObject and send the request.
var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Retrieve");
xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xHReq.setRequestHeader("Content-Length", xml.length);
xHReq.send(xml);
// Capture the result.
var resultXml = xHReq.responseXML;
// Check for errors.
var errorCount = resultXml.selectNodes('//error').length;
var result = resultXml.selectSingleNode("//q1:" + sAttributeName).nodeTypedValue;
if (errorCount != 0)
{
var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
result = " ";
alert(msg);
}
// Display the retrieved value.
else
{
return result;
}
}Пример вызова X++: crmForm.all.new_field.value = GetAttributeValueFromID("account","{GUID_RECORD}","name"); |
|
|
|
| За это сообщение автора поблагодарили: intentio (1). | |
|
|
#3 |
|
Участник
|
Насколько я понимаю, я должен подставлять GUID конкретной записи? Если так, то нереально, т.к. записей (под которыми еще множество записей) может быть много и их заводит пользователь.
|
|
|
|
|
#4 |
|
Kostya Afendikov
|
Цитата:
Да, подставляете гуид и выбираете атрибут Если надо обратиться "каскадно" к третей сущности, то делаете цикл и получаете гуид предыдущей записи,затем получаете гуид для 3ей и т.д. |
|
|
|
|
#5 |
|
Участник
|
ага, значит просто я не понял. Я подумал, что нужно ручками забить гуид. А как вытащить его?
|
|
|
|
|
#6 |
|
Kostya Afendikov
|
|
|
|
|
|
#7 |
|
Участник
|
а если не лукап а пиклист?
|
|
|
|
|
#8 |
|
Kostya Afendikov
|
У вас в picklist хранятся гуиды что ли?
crmForm.all.new_field.value = GetAttributeValueFromID("account","{GUID_RECORD}","name"); где account - имя сущности, к которой относится записи {GUID_RECORD} - гуид записи сущности account (в моем случае) name - имя атрибута, который присутствует у этой записи Если необходимо получить значение для поля picklist crmForm.all.new_field.value = GetAttributeValueFromID("account","{GUID_RECORD}","NEW_PICKLIST"); где NEW_PICKLIST - имя атрибута пиклиста |
|
|
|
|
#9 |
|
Участник
|
Написал так:
crmForm.all.new_d1.DataValue = GetAttributeValueByEntityId('new_date_protocol', crmForm.all.new_protocolsfordate.DataValue[0].id, 'new_cc1'); где: new_d1 - атрибут сущности, в который хочется записать значение new_date_protocol - наименование связанной сущности из которой хочу вытащить значение атрибута new_protocolsfordate - атрибут типа лукап, который связывает сущности между собой (не уверен, что правильно понял, что нужно указать его) new_cc1 - собственно атрибут, который хочется вытащить из объекта сущности new_date_protocol В итоге выдает ошибку: 'crmForm.all.new_protocolsfordate.DataValue' - есть null или не является объектом. Что я неправильно сделал? |
|
|
|
|
#10 |
|
Участник
|
|
|
|
|
|
#11 |
|
Kostya Afendikov
|
Цитата:
Сообщение от vital.mih
Написал так:
crmForm.all.new_d1.DataValue = GetAttributeValueByEntityId('new_date_protocol', crmForm.all.new_protocolsfordate.DataValue[0].id, 'new_cc1'); где: new_d1 - атрибут сущности, в который хочется записать значение new_date_protocol - наименование связанной сущности из которой хочу вытащить значение атрибута new_protocolsfordate - атрибут типа лукап, который связывает сущности между собой (не уверен, что правильно понял, что нужно указать его) new_cc1 - собственно атрибут, который хочется вытащить из объекта сущности new_date_protocol В итоге выдает ошибку: 'crmForm.all.new_protocolsfordate.DataValue' - есть null или не является объектом. Что я неправильно сделал? 1) Это значит, что в лукапе нет выбранной записи. делайте проверку в OnLoad alert(crmForm.all.new_protocolsfordate.DataValue[0].id) 2) Гуиды хранятся в БД, начните юзать SQL Managment Studio |
|
|
|
|
#12 |
|
Участник
|
Вобщем гуид записи я достал, зашел в таблицу, проверил его, как видно из рисунка 1, поле new_number имеет значение 1111.
Запускаю alert(GetAttributeValueByEntityId('new_date_protocol', crmForm.all.new_protocolsfordate.DataValue[0].id, 'new_number')) выводит пустое окно! Как так? |
|
|
|
|
#13 |
|
Участник
|
Bondonello спасибо Вам!! все получилось.
1. Не мог вытащить гуид из лукапа потому что в форме не был добавлен атрибут, я думал что вне зависимости от атрибута на форме связь находится в базе данных. был неправ. 2. Функцию GetAttributeValueByEntityId брал не вашу а из похожей темы. Однако она не работает, а ваша работает. |
|
|
|
|
#14 |
|
Участник
|
С вашего позволения следующий вопрос
![]() Как достать строковые значения пиклиста, т.к. в .datavalue хранится номер записи ? |
|
|
|
|
#15 |
|
Участник
|
SDK:
Цитата:
{Field}.SelectedText - string - Get property
Returns the string value of the currently selected option. |
|
|
|
|
#16 |
|
Kostya Afendikov
|
Цитата:
Сообщение от vital.mih
Bondonello спасибо Вам!! все получилось.
1. Не мог вытащить гуид из лукапа потому что в форме не был добавлен атрибут, я думал что вне зависимости от атрибута на форме связь находится в базе данных. был неправ. 2. Функцию GetAttributeValueByEntityId брал не вашу а из похожей темы. Однако она не работает, а ваша работает. Жмите на зеленый квадратик
|
|
|
|
|
#17 |
|
Участник
|
А что делать, если значение атрибута, который мы хотим вытащить null? Где в функции поставить условие, чтоб она возвращала unassigned value или '' ", но не ошибку.
|
|
|
|
|
#18 |
|
Kostya Afendikov
|
Цитата:
if (errorCount != 0) { var msg = resultXml.selectSingleNode('//description').nodeTypedValue; result = " "; alert(msg); } закомменьте alert(msg); - это я для отладки оставлял |
|
|
|
|
#19 |
|
Участник
|
я сделал это первым делом, все равно ошибка вылазит, проверил алертом, этот кусок кода не отрабатывается, отрабатывается return result;
|
|
|
|
|
#20 |
|
Участник
|
2vital.mih
Код в студию |
|
|