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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.09.2007, 13:54   #1  
zhenek is offline
zhenek
Участник
 
133 / 10 (1) +
Регистрация: 01.02.2007
? Как получить значение поля одной сущности при обработке формы другой сущности
Например, в сущности Product создано новые поля "Оптовое количество" и "Оптовая цена". Требуется, чтобы в форме "Продукт для заказа" при указании количества более или равное оптовому, цена менялась с цены по умолчанию на специальную оптовую.
Так вот, как в событии OnChange для поля "Количество" формы "Продукт для заказа" получить эти самые значения сущности Product "Оптовое количество" и "Оптовая цена", чтобы потом подставить оптовую цену? Какие функции для этого использовать и как?

Писать SQL запрос на JavaScript в событии я оставил на самый крайний случай, потому что думаю есть более удобные варианты
Старый 25.09.2007, 10:14   #2  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Попробуйте использовать LookupControlItem
Старый 25.09.2007, 10:27   #3  
zhenek is offline
zhenek
Участник
 
133 / 10 (1) +
Регистрация: 01.02.2007
Пример не приведете? И вообще синтаксис использования этой функции, поскольку то что я видел в sdk по ней не совсем подходит, по моему мнению, в данной ситуации
Старый 12.10.2007, 09:34   #4  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Да, извините, я, видимо, невнимательно прочитал. К сожалению в CRM нельзя доставать из полей полноценные объекты. Видимо придется сделать аналогично примеру duplicatedetection из того же SDK - вычитать нужные данные и передать их в XML.
Спросите Lud - она в этом деле больший специалист чем я.
Старый 15.10.2007, 00:57   #5  
EvgenijM is offline
EvgenijM
Участник
 
11 / 14 (1) ++
Регистрация: 09.10.2007
Адрес: Вильнюс, Литва
Эта задача вообще без програмирования решается...
В вашем варианте нужно использовать Discount List (наверное "список скидок", извиняюсь, нет под рукой русской версии продукта)
Старый 15.10.2007, 11:38   #6  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Цитата:
Сообщение от EvgenijM Посмотреть сообщение
Эта задача вообще без програмирования решается...
В вашем варианте нужно использовать Discount List (наверное "список скидок", извиняюсь, нет под рукой русской версии продукта)
Тоже об этом подумал, еще есть вариант - использовать разные прайс листы (оптовый и розничный), но тут, я так понял своя специфика?
Старый 15.10.2007, 13:48   #7  
zhenek is offline
zhenek
Участник
 
133 / 10 (1) +
Регистрация: 01.02.2007
Именно, специфика своя. Я тоже обращал внимание на все эти скидки, но дело в том, что для каждого продукта разный оптовый порог, нет единой формулы для скидки и не для каждого продукта она вообще предусмотрена. Поэтому в базе хранится для каждой записи своя информация и её нужно как-то добыть из другой формы

Последний раз редактировалось zhenek; 15.10.2007 в 14:05.
Старый 15.10.2007, 17:38   #8  
EvgenijM is offline
EvgenijM
Участник
 
11 / 14 (1) ++
Регистрация: 09.10.2007
Адрес: Вильнюс, Литва
В таком случае, нужно использовать разные прайс листы.
Согласен, что это менее удобно, чем все писать в карточке продукта, но зато "правильно" с точки зрения "идиологии" CRMа. Ведь не продукты задают цены (для заказов и и т.д.), а прайс листы.

Просто из опыта хочу сказать, что лучше стараться не отходить от той "идиологии", что уже есть в CRMе. Сейчас может казаться, что ваш вариант удобнее и быстрее, но на следующих этапах проекта это может всплыть и будет очень неприятно все переделывать.

Ну, а на случай если всё-таки не убедил, вот скрипт

Код:
 
function GetAttributeValueByEntityId(entityName, entytiId, attributeName)
{
    var xml = '' + 
    '[?xml version=`1.0` encoding=`utf-8`?]' + '\r\n' + 
    '[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`]' + '\r\n' + 
    ' [soap:Body]' + '\r\n' + 
    ' [entityName xmlns=`http://schemas.microsoft.com/crm/2006/WebServices`]' + entityName + '[/entityName]' + '\r\n' + 
    ' [id xmlns=`http://schemas.microsoft.com/crm/2006/WebServices`]' + entytiId + '[/id]' + '\r\n' + 
    ' [columnSet xmlns=`http://schemas.microsoft.com/crm/2006/WebServices` xmlns:q=`http://schemas.microsoft.com/crm/2006/Query` xsi:type=`q:ColumnSet`]' + '\r\n' + 
    ' [q:Attributes]' + '\r\n' +
    ' [q:Attribute]' + attributeName + '[/q:Attribute]' + '\r\n' +
    ' [/q:Attributes]' + '\r\n' +
    ' [/columnSet]' + '\r\n' + 
    ' [/soap:Body]' + '\r\n' + 
    '[/soap:Envelope]' + 
    '';
    xml = xml.replace(/\[/gi, String.fromCharCode(60));
    xml = xml.replace(/\]/gi, String.fromCharCode(62));
    xml = xml.replace(/\`/gi, String.fromCharCode(34));
    var xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
    xmlHttpRequest.Open('POST', '/mscrmservices/2006/CrmService.asmx', false);
    xmlHttpRequest.setRequestHeader('SOAPAction','http://schemas.microsoft.com/crm/2006/WebServices/Retrieve');
    xmlHttpRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
    xmlHttpRequest.setRequestHeader('Content-Length', xml.length);
    xmlHttpRequest.send(xml);
    var doc = xmlHttpRequest.responseXML;
//    alert(xmlHttpRequest.responseText);
    var retValue = '';
    if (doc.selectSingleNode('//RetrieveResult/' + attributeName) != null) retValue = doc.selectSingleNode('//RetrieveResult/' + attributeName).text;
    return retValue;
}
Использовать в OnChange поля продукта, например:

Код:
 
var oProduct = crmForm.all.productid;
if (oProduct.DataValue != null && oProduct.DataValue[0] != null)
{
    crmForm.all.SOME_OTHER_FIELD.DataValue = GetAttributeValueByEntityId('product', oProduct.DataValue[0].id, 'PRODUCT_ATTRIBUTE_NAME');
}
За это сообщение автора поблагодарили: zhenek (1), Bondonello (1), mistah (1).
Старый 15.10.2007, 18:37   #9  
zhenek is offline
zhenek
Участник
 
133 / 10 (1) +
Регистрация: 01.02.2007
Спасибо огромнейшее, буду пробовать
Старый 30.03.2009, 12:34   #10  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
А подскажите, плиз, неопытному куда вставлять код создания функции? Вызов то понятно на событии...
Старый 30.03.2009, 12:41   #11  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Цитата:
Сообщение от vital.mih Посмотреть сообщение
А подскажите, плиз, неопытному куда вставлять код создания функции? Вызов то понятно на событии...
Если вы говорите о форме объекта, то:

Раздел "Параметры" - > Меню "Настройка" -> "Настроить объекты" -> 2-м щелчком открываете нужный объект (сущность/entity) -> В открывшемся окне меню "Формы и представления" -> из списка выбираем "Форма" -> В открывшейся форме выделяем нужное поле -> Справа кнопка "Свойства" -> Вкладка "События"

ЗЫ: возможно не совсем понял вопрос - так что чем полнее и подробнее ваш вопрос на форуме, тем выше вероятность, что вам помогут.
И почитайте SDK - вещь полезная.
Цитата:
Adding Scripts to the Form or Field Events
Add scripts to a form or field event by pasting code into the Event Property Details form in the Microsoft Dynamics CRM Web application.

In the Navigation Pane, click Settings, click Customization, and then click Customize Entities.
Open the entity that contains the form, and then click Forms and Views.
In the list, double-click Form.
To add a script to a form:
Click Form Properties.
On the Events tab, Click OnSave or OnLoad, and then click Edit.
– OR –

To add a script to a field:

Double click the field
On the Events tab, click Edit.
Select the Event is Enabled check box to enable the event and enter the body of the script.
On the Dependencies tab, in the Available Fields list, select any fields you referenced in the script, and then click >> to move the selected fields to the Dependent fields List.
Test your script in the three modes: create, update, and read-only:
On the Preview menu, click Create Form, Update Form, or Read-Only Form.
Click Save and Close to close the form
When your customizations are complete, publish your customizations.
To publish the customizations for the current entity, on the Actions menu, click Publish.

Последний раз редактировалось Bakai Madybaev; 30.03.2009 в 13:34.
Старый 30.03.2009, 13:39   #12  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
да я уж понял что в одном скрипте все пишется. спасибо
Подскажите, плиз, что есть productid в строке:
var oProduct = crmForm.all.productid;
Старый 30.03.2009, 15:15   #13  
Bakai Madybaev is offline
Bakai Madybaev
Участник
 
201 / 16 (1) ++
Регистрация: 22.04.2008
Цитата:
Сообщение от vital.mih Посмотреть сообщение
да я уж понял что в одном скрипте все пишется. спасибо
Подскажите, плиз, что есть productid в строке:
var oProduct = crmForm.all.productid;
productid - это поле - GUID записи Продукт.
Старый 30.03.2009, 22:17   #14  
vital.mih is offline
vital.mih
Участник
 
114 / 10 (1) +
Регистрация: 25.02.2009
Адрес: Пермь
Цитата:
Сообщение от Bakai Madybaev Посмотреть сообщение
productid - это поле - GUID записи Продукт.
Как вытащить мне гуид записи связанной сущности (связь 1:N)? Связь происходит с помощью атрибута типа лукап new_protocolsfordate.
Старый 19.02.2011, 20:26   #15  
Sergikrus is offline
Sergikrus
Участник
 
82 / 15 (1) ++
Регистрация: 26.09.2008
Адрес: Tyumen
Angry
Цитата:
Сообщение от EvgenijM Посмотреть сообщение
Код:
 
function GetAttributeValueByEntityId(entityName, entytiId, attributeName)
{
    var xml = '' + 
    '[?xml version=`1.0` encoding=`utf-8`?]' + '\r\n' + 
    '[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`]' + '\r\n' + 
    ' [soap:Body]' + '\r\n' + 
    ' [entityName xmlns=`http://schemas.microsoft.com/crm/2006/WebServices`]' + entityName + '[/entityName]' + '\r\n' + 
    ' [id xmlns=`http://schemas.microsoft.com/crm/2006/WebServices`]' + entytiId + '[/id]' + '\r\n' + 
    ' [columnSet xmlns=`http://schemas.microsoft.com/crm/2006/WebServices` xmlns:q=`http://schemas.microsoft.com/crm/2006/Query` xsi:type=`q:ColumnSet`]' + '\r\n' + 
    ' [q:Attributes]' + '\r\n' +
    ' [q:Attribute]' + attributeName + '[/q:Attribute]' + '\r\n' +
    ' [/q:Attributes]' + '\r\n' +
    ' [/columnSet]' + '\r\n' + 
    ' [/soap:Body]' + '\r\n' + 
    '[/soap:Envelope]' + 
    '';
    xml = xml.replace(/\[/gi, String.fromCharCode(60));
    xml = xml.replace(/\]/gi, String.fromCharCode(62));
    xml = xml.replace(/\`/gi, String.fromCharCode(34));
    var xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
    xmlHttpRequest.Open('POST', '/mscrmservices/2006/CrmService.asmx', false);
    xmlHttpRequest.setRequestHeader('SOAPAction','http://schemas.microsoft.com/crm/2006/WebServices/Retrieve');
    xmlHttpRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
    xmlHttpRequest.setRequestHeader('Content-Length', xml.length);
    xmlHttpRequest.send(xml);
    var doc = xmlHttpRequest.responseXML;
//    alert(xmlHttpRequest.responseText);
    var retValue = '';
    if (doc.selectSingleNode('//RetrieveResult/' + attributeName) != null) retValue = doc.selectSingleNode('//RetrieveResult/' + attributeName).text;
    return retValue;
}
Использовать в OnChange поля продукта, например:

Код:
 
var oProduct = crmForm.all.productid;
if (oProduct.DataValue != null && oProduct.DataValue[0] != null)
{
    crmForm.all.SOME_OTHER_FIELD.DataValue = GetAttributeValueByEntityId('product', oProduct.DataValue[0].id, 'PRODUCT_ATTRIBUTE_NAME');
}
---------------------------
Сообщение с веб-страницы
---------------------------
<?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">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode> <faultstring>System.Web.Services.Protocols.SoapException: Сервер не распознал заголовок HTTP SOAPAction: http://srv/mscrmservices/2006/WebServices/Retrieve. at System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest() at System.Web.Services.Protocols.SoapServerProtocol.Initialize() at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean&amp; abortProcessing)</faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>
---------------------------
ОК
---------------------------

Уже кучу способов перепробовал, а результат один . Подскажите пожалуйста, в чем моя ошибка?
Старый 21.02.2011, 01:20   #16  
Sergikrus is offline
Sergikrus
Участник
 
82 / 15 (1) ++
Регистрация: 26.09.2008
Адрес: Tyumen
Цитата:
Сообщение от EvgenijM Посмотреть сообщение
Уже кучу способов перепробовал, а результат один . Подскажите пожалуйста, в чем моя ошибка?
Проблема решена, спасибо

Решение тут: SoapException
Старый 28.06.2011, 09:30   #17  
webmaster is offline
webmaster
Участник
 
19 / 10 (1) +
Регистрация: 28.06.2011
Адрес: Новосибирск
Доброго времени суток. А как будет выглядеть скрипт реализации данной задачи для crm 5.0?
Старый 28.06.2011, 11:21   #18  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
Цитата:
Сообщение от webmaster Посмотреть сообщение
Доброго времени суток. А как будет выглядеть скрипт реализации данной задачи для crm 5.0?
Вот пример для строкового поля (new_contact - лукап на контакты):

PHP код:
if (Xrm.Page.getAttribute("new_contact").getValue()!=null)
{
        var 
contactid Xrm.Page.getAttribute("new_contact").getValue()[0].id;
   
        var 
retrieveContact = new XMLHttpRequest();
        
retrieveContact.open("GET"ODataPath "/ContactSet(guid'" contactid "')?$select=firstname,lastname"false);
        
retrieveContact.setRequestHeader("Accept""application/json");
        
retrieveContact.setRequestHeader("Content-Type""application/json; charset=utf-8");
        
retrieveContact.send();

        var 
firstname JSON.parse(retrieveContact.responseText).d.firstname;
        if (
firstname.Value == null)
        {
            
alert(firstname);
        }

Старый 28.06.2011, 12:59   #19  
webmaster is offline
webmaster
Участник
 
19 / 10 (1) +
Регистрация: 28.06.2011
Адрес: Новосибирск
Цитата:
Сообщение от griefon Посмотреть сообщение
Вот пример для строкового поля (new_contact - лукап на контакты):

PHP код:
if (Xrm.Page.getAttribute("new_contact").getValue()!=null)
{
        var 
contactid Xrm.Page.getAttribute("new_contact").getValue()[0].id;
   
        var 
retrieveContact = new XMLHttpRequest();
        
retrieveContact.open("GET"ODataPath "/ContactSet(guid'" contactid "')?$select=firstname,lastname"false);
        
retrieveContact.setRequestHeader("Accept""application/json");
        
retrieveContact.setRequestHeader("Content-Type""application/json; charset=utf-8");
        
retrieveContact.send();

        var 
firstname JSON.parse(retrieveContact.responseText).d.firstname;
        if (
firstname.Value == null)
        {
            
alert(firstname);
        }

Я так понимаю у вас здесь частный случай? А не ничего не изменилось в предложенном решении SoapException относительно CRM 5.0?
Старый 28.06.2011, 13:36   #20  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Не совсем понимаю ваш вопрос. В 5.0 все еще можно использовать SOAP EndPoint, как это было в 3.0/4.0, но теперь добавилась поддержка новых протоколов, например, REST/ATOM. Работать из JS с ними значительно удобнее, так как код получается меньше и более читаем.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Получить данные из формы родителя DinDim Dynamics CRM: Разработка 3 19.02.2009 15:38
Как пограммно получить имя сущности Lookup-а ZooY Dynamics CRM: Разработка 6 21.07.2008 18:17
Обновление поля во внешней сущности через JScript Sergio_che Dynamics CRM: Разработка 4 06.06.2008 23:44
Как взять текстовое значение из поля LookUp tatra Dynamics CRM: Разработка 2 21.11.2007 08:20
Два лукапа одной сущности нга одной форме Dr.Kurpatov Dynamics CRM: Разработка 16 22.01.2007 20:23
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:51.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.