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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.06.2013, 01:34   #1  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Multi LookUp и кроссбаузерность
Подскажите, как можно обойти такую проблему.
Есть LookUp, который на onLoad формы превращается в мулти и заполняется данными из некого скрытого поля.
Код:
   document.getElementById(fieldName).setAttribute("lookupstyle", "multi");
   var temp = Xrm.Page.getAttribute(hiddenField).getValue();
//преобразование данных в массив значений для LookUp
...
   var value = new Array();
      for(i = 0; ...)
      {
         value[i] = new Object();
         value[i].id = id[i];
         value[i].name = name[i];
         value[i].typename = typename;
      }
document.getElementById(fieldName).DataValue = value;
На onSave обратная процедура
Код:
 var value =  document.getElementById(fieldName).DataValue;
...
  Xrm.Page.getAttribute(hiddenField).setValue(temp);
   Xrm.Page.getAttribute(fieldName).setValue(null);
   document.getElementById(fieldName).setAttribute("lookupstyle", "single");
Всё это дело работает только в ИЕ. Причем, вместо document.getElementById(fieldName).DataValue = value; можно писать crmForm.all[fieldName].DataValue = value; Работает. Но не работает в Хроме. crmForm Хром не признает в принципе, вываливает ошибку. А вот код document.getElementById(fieldName).DataValue = value; где в качестве fieldName указан мульти лукап проглатывает молча, ничего при этом не отображая. Как побороть эту проблему, не понятно.

Поиски гуглом навели на совет использовать вместо crmForm.all[fieldName] конструкцию Xrm.Page.getAttribute(fieldName), именно так советует МС. Но с записью массива значений такой фокус не проходит.

Последний раз редактировалось vasya-serega; 25.06.2013 в 01:37.
Старый 25.06.2013, 10:17   #2  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Задать значение для Лукапа
Xrm.Page.getAttribute('new_fieldid').setValue([{ id: 'guid', name: fullName, entityType: 'entityTypeName'}]);

Так задается массив.
__________________
Мой блог https://procrm.tv
Старый 25.06.2013, 13:01   #3  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Это если нужно установить одно значение. А в моему случае может понадобится сразу несколько.
Код
Код:
 var value = new Array();
      for(i = 0; i<n; i++)
      {
         value[i] = new Object();
         value[i].id = id[i];
         value[i].name = name[i];
         value[i].typename = typename;
      }
Xrm.Page.getAttribute(fieldName).setValue(value);
не работает.
Старый 25.06.2013, 15:57   #4  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
хм... ну и правильно у вас будет ошибка так как в простой лукап вы пробуете запихнуть несколько записей.
Вам нужно расширить его ну читайте полную статью как это сделать тут, там все есть и картинки
Старый 25.06.2013, 16:15   #5  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от spectr Посмотреть сообщение
хм... ну и правильно у вас будет ошибка так как в простой лукап вы пробуете запихнуть несколько записей.
Вам нужно расширить его ну читайте полную статью как это сделать тут, там все есть и картинки
Всё супер, только из-за особенностей написания кода выплывает несколько проблем:
1. Эндпоинты 4.0 (которые там используются) в одном из следующих роллапов будут вырезаны.
2. Код написан не кроссбраузерно, соответственно под хром или ФФ не заработает. selectNodes, selectSingleNode понимаете ли.

Но как мануал, куда копать - годится.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 25.06.2013, 16:37   #6  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Если тот громоздкий пример по ссылке не кроссбраузерный, то зачем он нужен? Под ИЕ у меня и так всё прекрасно работает. Как раз вся соль и состоит в том, чтобы под Хромом найти способ в лукап помещать и считывать обратно несколько значений.
Старый 25.06.2013, 20:29   #7  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
Можно и по другому сделать
На клик по лукапу сделать это и применить вместо стандартного вот это

p.s. нет времени все описывать и делать готовый правильный код, я даю только направления
Старый 21.08.2013, 01:34   #8  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Занимаясь другой задачей, правда тоже связанной с настраиваемым лукапом столкнулся с одной неприятностью. При вызове окна выбора связанной сущности появляется ошибка, но без возможности просмотреть лог. Можно ли как-то принудительно заставить все ошибки писать в лог так, чтобы они потом были доступны?
Миниатюры
Нажмите на изображение для увеличения
Название: nologerror.jpg
Просмотров: 414
Размер:	103.6 Кб
ID:	8368  
Старый 18.10.2013, 21:28   #9  
kalina is offline
kalina
Участник
MCBMSS
 
25 / 16 (1) ++
Регистрация: 12.07.2011
Адрес: Израиль
Тоже столкнулся с проблемой изменения обычного лукапа в мульти.
Сразу скажу, что проверял в IE10 и Chrome для СРМ 2011 на ролапе 13.

Я пытался изменить обычный лукап на мульти, в котором можно выбрать несколько записей одного типа.
Но у меня проблема была в том, что такого кода...
Код:
document.getElementById("someentitynameid").setAttribute("lookupstyle", "multi");
...хватало только для визуальной имитации мульти лукапа:
  • onChange срабатывал только для первого выбранного значения
  • getValue давал только одно значение
  • если лукап был пустым, то onChange не срабатывал, а getValue давал NULL
Одним словом было понятно, что лукап остался single.

В моем случае не понадобилось ничего вроде этого (ниже), т.к. не нужно да и не помогает и ничего не дает:
Код:
document.getElementById("someentitynameid").setAttribute("lookuptypes", "10063");
document.getElementById("someentitynameid").setAttribute("lookuptypenames", "someentityname:10063:Someentityname");
document.getElementById("someentitynameid").setAttribute("lookuptypeIcons", "/_imgs/ico_18_customEntity.gif");
document.getElementById("someentitynameid").setAttribute("defaulttype", "10063");
После многочасового реверсинжиниринга Майкрософтовского кода (не без помощи Konstantin Katsovich, за что ему огромное спасибо), я нашел переменную, которая получает значение для каждого лукапа на форме во время загрузки формы:
  • "single" = 1
  • "multi" = 2
  • "subject" = 3 (без понятия, для какого случая)
Когда закрывается окно выбора для лукапа, есть проверка этой переменной, и если у вас в лукапе много значений (это они умеют проверить, не смотря на то, что getValue дает только одно значение или NULL), а она не равна 2, то извините...

Решение:
к вышеупомянутой строчке, добавить еще одну:
Код:
document.getElementById("someentitynameid").setAttribute("lookupstyle", "multi");
Xrm.Page.getAttribute("someentitynameid")._attribute.$1a_2 = 2;
Если кому интересно, переменная находится в обьекте Mscrm.LookupAttribute.prototype, а получает значение в функции initializeFromDomElement. Все это находится в файле: CRMFolderPath\CRMWeb\_static\_forms\Form.js

Конечно, это total unsupport, но работает.
Если кто знает более поддерживамое решение, прошу поделиться

Последний раз редактировалось kalina; 18.10.2013 в 21:30.
Старый 19.10.2013, 01:43   #10  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от kalina Посмотреть сообщение
Если кто знает более поддерживамое решение, прошу поделиться
Поддерживаемого (supported) решения для решения этой задачи без разработки своих вебресурсов без DOM инъекций - попросту нет.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 22.10.2013, 11:27   #11  
Skyway is offline
Skyway
Участник
 
78 / 10 (1) +
Регистрация: 07.08.2009
У меня тоже возникла подобная проблема, свое решение описал вот здесь
http://crmcustom.blogspot.ru/

С a33ik полностью согласен, для этих целей в CRM используется связь N:N и сабгрид.
Старый 22.10.2013, 13:32   #12  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
a33ik можно сделать (полу-supported) решение на основании web-ресурсов.
На основании двух проектов под кодовыми названиями Mirage и ELL(emulation links lookup) могу сказать что отлично все работает в всех браузерах через lookupinfo.aspx если с выходом нового UR изменится архитектура в lookupinfo.aspx то слетит только работа web-ресурса, а это не критично в 99% так как за основу таких лукапов взята обратная связь или N:N и 99.9% что ничего критичного там не поменяется.

Пример ELL:

И часть Mirage (коммерческая тайна, ну или чтобы было меньше нытья в мою сторону):
Миниатюры
Нажмите на изображение для увеличения
Название: mirage.png
Просмотров: 821
Размер:	10.3 Кб
ID:	8488  
Изображения
 

Последний раз редактировалось spectr; 22.10.2013 в 13:39.
За это сообщение автора поблагодарили: kalina (1).
Старый 22.10.2013, 13:48   #13  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
И чтобы вы меня не "шпыняли" скажу что решения готового еще нет (руки не доходят), но соединив ELL идеи и возможности Mirage это легко для всех вариантов (одиночний, мульти, патилист или темы)
Старый 23.10.2013, 11:46   #14  
kalina is offline
kalina
Участник
MCBMSS
 
25 / 16 (1) ++
Регистрация: 12.07.2011
Адрес: Израиль
Цитата:
Сообщение от Skyway Посмотреть сообщение
У меня тоже возникла подобная проблема, свое решение описал вот здесь
http://crmcustom.blogspot.ru/
Подозреваю, что подобное решение не будет работать, если отключить поддрежку HTC.
Цитата:
Сообщение от Skyway Посмотреть сообщение
С a33ik полностью согласен, для этих целей в CRM используется связь N:N и сабгрид.
И я полностью согласен, но клиент очень крепкий попался: "Не хочу", - говорит, - "таблицу. Ты мне лукап-поле нарисуй."
Старый 29.10.2013, 11:59   #15  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
Возникла проблема с ИЕ 7-8 при повторном открытии значение лукапа теряет название.
Использую код для мультилукапа:
Код:
var sLookup = openStdDlg(getServerUrl("_controls/lookup/lookupinfo.aspx?LookupStyle=multi&objecttypes=10018&ShowNewButton=0&ShowPropButton=1&browse=false&AllowFilterOff=0&DefaultType=10018&DisableQuickFind=0&DisableViewPicker=0"),tm.crm.block[_no-1].new_placeid,600,600,false);
				
				if (sLookup){
					if (!sLookup.items){
						sLookup = JSON.parse(sLookup);
					}
					if (sLookup.items && (sLookup.items.length > 0)){
						_ul.html(tm.mirage.addFieldsLookup(sLookup.items));
						tm.crm.addLookupValues(sLookup.items);
						tm.crm.replaceBlock(_no,{new_placeid:sLookup});
					}else{
						_ul.html("");
						tm.crm.replaceBlock(_no,{new_placeid:null});
					}
				}
При первом выборе:

После выбора получил все нормально в код:

Открываю снова лукап и возвращаю ему объект и получаю гадость:


Весь функционал работает нормально в IE9, Chrome и FF. В IE7-8 функционал кнопок (Свойства и д.р) работает нормально определяет те записи что нужно.
Проблема только в потери названия. Чем там отличается прием данных ?
Кто что знает ?
Миниатюры
Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 801
Размер:	3.6 Кб
ID:	8534  
Изображения
  
Старый 29.10.2013, 13:11   #16  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
нашел сам решение
там есть функция которая отвечает за названия XUI.Html.GetText
вот она в зависимости от браузера берет названия с textContent или value или innerText
потому расширил свою функцию заглушки:
Код:
addLookupValues: function(items){
			var len = items.length;
			for (var i = 0; i < len; i++){
				items[i].getAttribute = tm.crm.getAttribute;
				items[i].textContent = items[i].name;
				items[i].value = items[i].name;
				items[i].innerText = items[i].name;
			}
		},
и вуаля все работает и в ИЕ 7-8
За это сообщение автора поблагодарили: kalina (1).
Старый 08.07.2015, 13:17   #17  
andyandy is offline
andyandy
Даёшь прямые руки!
 
36 / 10 (1) +
Регистрация: 06.02.2014
Всем доброго времени суток!
Отличная тема! Много чего интересного вычетал! Но вот не смог найти решение для своей задачи.
Меня тоже интересует мультилукап, но с возможностью его дальнейшего использования в не интерфейса. Постараюсь описать суть проблемы. Заказчик хочет, чтобы я создал некое поле/сабгрид в котором человек мог бы выбрать произвольное количество записей сущности «Пользователь» и до этого момента всё выше описанное мне подходит! Но вот вторая задача заключается в том, что мне нужно отправить почтовые уведомления этим личностям. В случаи с отношением n:n (сабгрид) экземпляр рабочего процесса не может быть запущен для выбранного пользователя (либо я что-то не так делаю но в списке связных сущностей такой записи не значится). В случаи если хранить строку с вытащенными почтовыми адресами (мультилукап) CRM не даёт назначить это поле как источник для получателей.
Самое простое решение - это напилить некоторое количество лукапных полей и динамически их отображать на мой взгляд не подходит, так как всего может быть назначено порядка 20 юзеров и больше.
Ссылки на подобного рода решения будет достаточно. Заранее всем спасибо за потраченное время, и да прибудет с вами не иссекаемый багаж решений!
Старый 08.07.2015, 13:35   #18  
andyandy is offline
andyandy
Даёшь прямые руки!
 
36 / 10 (1) +
Регистрация: 06.02.2014
Похоже, я поторопился с вопросом. Немного подумав нашёл вот это http://www.mscrmconsultant.com/2013/...script-in.html . Судя по всему с вариантом через сабгрид должно прокатить, главное написать правильный скрипт для вытягивания данных из него!
Теги
crossbrowsing, lookup, multi, rollup 13, кроссбаузерность, crm2011

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Leon's CRM Musings: Setting Multi-Level Categories Against a Record Codelessly Blog bot Dynamics CRM: Blogs 0 26.01.2012 19:12
К чему примотать multi-select lookup Tony Green Dynamics CRM: Разработка 1 20.08.2010 15:32
CRM DE LA CREME! Some more useful javascripts for MS CRM Blog bot Dynamics CRM: Blogs 0 04.05.2010 11:05
mscrmblog: Mini Preview Window for Contact Lookup Field Blog bot Dynamics CRM: Blogs 0 10.03.2010 01:05
Jim Wang: CRM Filtered Lookup Multi Blog bot Dynamics CRM: Blogs 0 06.08.2009 06:11
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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