AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.03.2009, 11:01   #1  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Присвоение одного атрибута сущности значения другого атрибута связанной сущности
Имеем 2 связанные сущности, как с помощью скриптов на событие (например сохранение) одному атрибуту присвоить значение атрибута связанной сущности?
Старый 27.03.2009, 11:12   #2  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от vital.mih Посмотреть сообщение
Имеем 2 связанные сущности, как с помощью скриптов на событие (например сохранение) одному атрибуту присвоить значение атрибута связанной сущности?
Используйте методы Retrieve и RetrieveMultiple их описание есть и в SDK и на форуме уже много примеров

Вот простая функция

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  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Насколько я понимаю, я должен подставлять GUID конкретной записи? Если так, то нереально, т.к. записей (под которыми еще множество записей) может быть много и их заводит пользователь.
Старый 30.03.2009, 14:16   #4  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от vital.mih Посмотреть сообщение
Насколько я понимаю, я должен подставлять GUID конкретной записи? Если так, то нереально, т.к. записей (под которыми еще множество записей) может быть много и их заводит пользователь.
Что значит "нереально" ?
Да, подставляете гуид и выбираете атрибут
Если надо обратиться "каскадно" к третей сущности, то делаете цикл и получаете гуид предыдущей записи,затем получаете гуид для 3ей и т.д.
Старый 30.03.2009, 14:21   #5  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
ага, значит просто я не понял. Я подумал, что нужно ручками забить гуид. А как вытащить его?
Старый 30.03.2009, 14:25   #6  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от vital.mih Посмотреть сообщение
ага, значит просто я не понял. Я подумал, что нужно ручками забить гуид. А как вытащить его?

Например так:
crmForm.all.new_lookupdfield.DataValue[0].id

получаю гуид записи, выбранной в лукапе
Старый 30.03.2009, 14:27   #7  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
а если не лукап а пиклист?
Старый 30.03.2009, 14:47   #8  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от vital.mih Посмотреть сообщение
а если не лукап а пиклист?
У вас в 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  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Написал так:
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  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Цитата:
Сообщение от Bondonello Посмотреть сообщение
У вас в picklist хранятся гуиды что ли?
Если честно, я вообще не знаю где хранятся гуиды
Старый 30.03.2009, 23:02   #11  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от 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  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Вобщем гуид записи я достал, зашел в таблицу, проверил его, как видно из рисунка 1, поле new_number имеет значение 1111.
Запускаю alert(GetAttributeValueByEntityId('new_date_protocol', crmForm.all.new_protocolsfordate.DataValue[0].id, 'new_number')) выводит пустое окно!
Как так?
Миниатюры
Нажмите на изображение для увеличения
Название: рисунок 1.JPG
Просмотров: 467
Размер:	14.5 Кб
ID:	4425  
Старый 31.03.2009, 08:17   #13  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Bondonello спасибо Вам!! все получилось.
1. Не мог вытащить гуид из лукапа потому что в форме не был добавлен атрибут, я думал что вне зависимости от атрибута на форме связь находится в базе данных. был неправ.
2. Функцию GetAttributeValueByEntityId брал не вашу а из похожей темы. Однако она не работает, а ваша работает.
Старый 31.03.2009, 08:26   #14  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
С вашего позволения следующий вопрос
Как достать строковые значения пиклиста, т.к. в .datavalue хранится номер записи ?
Старый 31.03.2009, 13:15   #15  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
SDK:
Цитата:
{Field}.SelectedText - string - Get property
Returns the string value of the currently selected option.
Старый 31.03.2009, 13:42   #16  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от vital.mih Посмотреть сообщение
Bondonello спасибо Вам!! все получилось.
1. Не мог вытащить гуид из лукапа потому что в форме не был добавлен атрибут, я думал что вне зависимости от атрибута на форме связь находится в базе данных. был неправ.
2. Функцию GetAttributeValueByEntityId брал не вашу а из похожей темы. Однако она не работает, а ваша работает.
Ну наконец-то
Жмите на зеленый квадратик
Старый 31.03.2009, 14:12   #17  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
А что делать, если значение атрибута, который мы хотим вытащить null? Где в функции поставить условие, чтоб она возвращала unassigned value или '' ", но не ошибку.
Старый 31.03.2009, 15:25   #18  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от vital.mih Посмотреть сообщение
А что делать, если значение атрибута, который мы хотим вытащить null? Где в функции поставить условие, чтоб она возвращала unassigned value или '' ", но не ошибку.
ну как бы проверка стоит:
if (errorCount != 0)
{
var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
result = " ";
alert(msg);
}

закомменьте alert(msg); - это я для отладки оставлял
Старый 31.03.2009, 15:37   #19  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
я сделал это первым делом, все равно ошибка вылазит, проверил алертом, этот кусок кода не отрабатывается, отрабатывается return result;
Изображения
 
Старый 01.04.2009, 07:35   #20  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
2vital.mih
Код в студию
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить значение поля одной сущности при обработке формы другой сущности zhenek Dynamics CRM: Разработка 25 05.07.2011 16:19
Получение атрибута из другого объекта Казарин Александр Dynamics CRM: Разработка 6 20.10.2008 18:08
Создание объекта сущности из другого объекта! SnSS Dynamics CRM: Разработка 5 29.05.2008 13:38
Отнимание одного значения от другое pkost Dynamics CRM: Разработка 2 14.03.2008 07:48
Rollup 2 и обкрытие атрибута сущности для кастомизации AHAPX1CT Dynamics CRM: Администрирование 1 23.08.2007 13:45
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:21.