24.09.2007, 13:54 | #1 |
Участник
|
Как получить значение поля одной сущности при обработке формы другой сущности
Например, в сущности Product создано новые поля "Оптовое количество" и "Оптовая цена". Требуется, чтобы в форме "Продукт для заказа" при указании количества более или равное оптовому, цена менялась с цены по умолчанию на специальную оптовую.
Так вот, как в событии OnChange для поля "Количество" формы "Продукт для заказа" получить эти самые значения сущности Product "Оптовое количество" и "Оптовая цена", чтобы потом подставить оптовую цену? Какие функции для этого использовать и как? Писать SQL запрос на JavaScript в событии я оставил на самый крайний случай, потому что думаю есть более удобные варианты |
|
25.09.2007, 10:14 | #2 |
Moderator
|
Попробуйте использовать LookupControlItem
|
|
25.09.2007, 10:27 | #3 |
Участник
|
Пример не приведете? И вообще синтаксис использования этой функции, поскольку то что я видел в sdk по ней не совсем подходит, по моему мнению, в данной ситуации
|
|
12.10.2007, 09:34 | #4 |
Moderator
|
Да, извините, я, видимо, невнимательно прочитал. К сожалению в CRM нельзя доставать из полей полноценные объекты. Видимо придется сделать аналогично примеру duplicatedetection из того же SDK - вычитать нужные данные и передать их в XML.
Спросите Lud - она в этом деле больший специалист чем я. |
|
15.10.2007, 00:57 | #5 |
Участник
|
Эта задача вообще без програмирования решается...
В вашем варианте нужно использовать Discount List (наверное "список скидок", извиняюсь, нет под рукой русской версии продукта) |
|
15.10.2007, 11:38 | #6 |
Moderator
|
Тоже об этом подумал, еще есть вариант - использовать разные прайс листы (оптовый и розничный), но тут, я так понял своя специфика?
|
|
15.10.2007, 13:48 | #7 |
Участник
|
Именно, специфика своя. Я тоже обращал внимание на все эти скидки, но дело в том, что для каждого продукта разный оптовый порог, нет единой формулы для скидки и не для каждого продукта она вообще предусмотрена. Поэтому в базе хранится для каждой записи своя информация и её нужно как-то добыть из другой формы
Последний раз редактировалось zhenek; 15.10.2007 в 14:05. |
|
15.10.2007, 17:38 | #8 |
Участник
|
В таком случае, нужно использовать разные прайс листы.
Согласен, что это менее удобно, чем все писать в карточке продукта, но зато "правильно" с точки зрения "идиологии" 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; } Код: 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 |
Участник
|
Спасибо огромнейшее, буду пробовать
|
|
30.03.2009, 12:34 | #10 |
Участник
|
А подскажите, плиз, неопытному куда вставлять код создания функции? Вызов то понятно на событии...
|
|
30.03.2009, 12:41 | #11 |
Участник
|
Цитата:
Раздел "Параметры" - > Меню "Настройка" -> "Настроить объекты" -> 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 |
Участник
|
да я уж понял что в одном скрипте все пишется. спасибо
Подскажите, плиз, что есть productid в строке: var oProduct = crmForm.all.productid; |
|
30.03.2009, 15:15 | #13 |
Участник
|
|
|
30.03.2009, 22:17 | #14 |
Участник
|
|
|
19.02.2011, 20:26 | #15 |
Участник
|
Цитата:
Сообщение от 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; } Код: 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& abortProcessing)</faultstring> <detail /> </soap:Fault> </soap:Body> </soap:Envelope> --------------------------- ОК --------------------------- Уже кучу способов перепробовал, а результат один . Подскажите пожалуйста, в чем моя ошибка? |
|
21.02.2011, 01:20 | #16 |
Участник
|
|
|
28.06.2011, 09:30 | #17 |
Участник
|
Доброго времени суток. А как будет выглядеть скрипт реализации данной задачи для crm 5.0?
|
|
28.06.2011, 11:21 | #18 |
Участник
|
Цитата:
PHP код:
|
|
28.06.2011, 12:59 | #19 |
Участник
|
Цитата:
Сообщение от griefon
Вот пример для строкового поля (new_contact - лукап на контакты):
PHP код:
|
|
28.06.2011, 13:36 | #20 |
Moderator
|
Не совсем понимаю ваш вопрос. В 5.0 все еще можно использовать SOAP EndPoint, как это было в 3.0/4.0, но теперь добавилась поддержка новых протоколов, например, REST/ATOM. Работать из JS с ними значительно удобнее, так как код получается меньше и более читаем.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|