27.03.2009, 11:01 | #1 |
Участник
|
Присвоение одного атрибута сущности значения другого атрибута связанной сущности
Имеем 2 связанные сущности, как с помощью скриптов на событие (например сохранение) одному атрибуту присвоить значение атрибута связанной сущности?
|
|
27.03.2009, 11:12 | #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). |
30.03.2009, 10:52 | #3 |
Участник
|
Насколько я понимаю, я должен подставлять GUID конкретной записи? Если так, то нереально, т.к. записей (под которыми еще множество записей) может быть много и их заводит пользователь.
|
|
30.03.2009, 14:16 | #4 |
Kostya Afendikov
|
Цитата:
Да, подставляете гуид и выбираете атрибут Если надо обратиться "каскадно" к третей сущности, то делаете цикл и получаете гуид предыдущей записи,затем получаете гуид для 3ей и т.д. |
|
30.03.2009, 14:21 | #5 |
Участник
|
ага, значит просто я не понял. Я подумал, что нужно ручками забить гуид. А как вытащить его?
|
|
30.03.2009, 14:25 | #6 |
Kostya Afendikov
|
|
|
30.03.2009, 14:27 | #7 |
Участник
|
а если не лукап а пиклист?
|
|
30.03.2009, 14:47 | #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 - имя атрибута пиклиста |
|
30.03.2009, 21:52 | #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 или не является объектом. Что я неправильно сделал? |
|
30.03.2009, 22:14 | #10 |
Участник
|
|
|
30.03.2009, 23:02 | #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 |
|
31.03.2009, 08:06 | #12 |
Участник
|
Вобщем гуид записи я достал, зашел в таблицу, проверил его, как видно из рисунка 1, поле new_number имеет значение 1111.
Запускаю alert(GetAttributeValueByEntityId('new_date_protocol', crmForm.all.new_protocolsfordate.DataValue[0].id, 'new_number')) выводит пустое окно! Как так? |
|
31.03.2009, 08:17 | #13 |
Участник
|
Bondonello спасибо Вам!! все получилось.
1. Не мог вытащить гуид из лукапа потому что в форме не был добавлен атрибут, я думал что вне зависимости от атрибута на форме связь находится в базе данных. был неправ. 2. Функцию GetAttributeValueByEntityId брал не вашу а из похожей темы. Однако она не работает, а ваша работает. |
|
31.03.2009, 08:26 | #14 |
Участник
|
С вашего позволения следующий вопрос
Как достать строковые значения пиклиста, т.к. в .datavalue хранится номер записи ? |
|
31.03.2009, 13:15 | #15 |
Участник
|
SDK:
Цитата:
{Field}.SelectedText - string - Get property
Returns the string value of the currently selected option. |
|
31.03.2009, 13:42 | #16 |
Kostya Afendikov
|
Цитата:
Сообщение от vital.mih
Bondonello спасибо Вам!! все получилось.
1. Не мог вытащить гуид из лукапа потому что в форме не был добавлен атрибут, я думал что вне зависимости от атрибута на форме связь находится в базе данных. был неправ. 2. Функцию GetAttributeValueByEntityId брал не вашу а из похожей темы. Однако она не работает, а ваша работает. Жмите на зеленый квадратик |
|
31.03.2009, 14:12 | #17 |
Участник
|
А что делать, если значение атрибута, который мы хотим вытащить null? Где в функции поставить условие, чтоб она возвращала unassigned value или '' ", но не ошибку.
|
|
31.03.2009, 15:25 | #18 |
Kostya Afendikov
|
Цитата:
if (errorCount != 0) { var msg = resultXml.selectSingleNode('//description').nodeTypedValue; result = " "; alert(msg); } закомменьте alert(msg); - это я для отладки оставлял |
|
31.03.2009, 15:37 | #19 |
Участник
|
я сделал это первым делом, все равно ошибка вылазит, проверил алертом, этот кусок кода не отрабатывается, отрабатывается return result;
|
|
01.04.2009, 07:35 | #20 |
Участник
|
2vital.mih
Код в студию |
|