Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Добавление связей из формы объекта
Запись от Артем Enot Грунин размещена 04.11.2009 в 16:24
Теги advanced find, fetch, java script, unsupport
В CRM 3.0 в свое время был исправлен один интересный "баг": если на форме организации заполнить поле "основной контакт", то этот контакт не появится в списке контактов от организации. Почему я написал баг в ковычках? А это и не баг вовсе, а вполне логичное поведение системы. Разные связи между объектами - разные списки и контролы. В этом смысле основному контакту вообще не обязательно быть связанным с самой организацией. Мнение заказчика, тем не менее, может существенно отличаться от моего. Выход - при заполнении лукапов добавлять соответствующую связь между объектами. Адепты поддерживаемых методов, коим я сам когда-то был, даже скажут вам как: нужно писать плагин на PostSave. Иногда, впрочем, результат нужно отразить немедленно и остается стучаться в веб сервисы CRM через Java Script. Все мы помним как страшно выглядит этот фаршированный XML'ем код в жалком окне обработчика... И вот тут глаз падает на кнопочку "Добавить существующий" на панели связанного объекта... Все верно - там проще!
По нажатии на эту кнопку вызывается либо функция
либо
в зависимости от типа связи. Обе функции расположены в файле CRMWeb\_static\_grid\action.js. Они вызывают лукап выбора и передают выбранные значения в дальнейшую обработку. В случае когда связь 1:N логику ф-ции придется повторить, а вот для N:N вполне можно написать универсальный гибкий код. Что я и сделал в приложении для примера из своего поста Укрощение Advanced Find, часть 2 - написал функцию, которая связывает найденные в поиске продукты с оригинальным Интересом. Подход имеет неожиданный подводный камень: попытка заново связать уже связанные объекты приводит к ошибке ядра, после чего на форму вылетит пугающее не информативное окно. Иными словами, перед связыванием объектов необходимо убедиться в уникальности создаваемой связи.
Думаю, вам не составит труда адаптировать код под свои нужды.
По нажатии на эту кнопку вызывается либо функция
Код:
locAssocOneToMany(iType, sRelationshipName);
Код:
locAssocObj(iType , sSubType, sAssociationName, iRoleOrdinal)
Код:
var oTypeThis = crmForm.ObjectTypeCode; var oTypeThisName = crmForm.ObjectTypeName; var oTypeAssociated = Product; var oTypeAssociatedName = "product"; var oAssociationName = "new_productsForLead"; var oAssociationRecordName = "new_productsforlead"; function initAction() { if (oFrameAF.readyState != "complete") { onError(oErrorFrameNotReady); return; } var oDoc = oFrameAF.contentWindow.document; var oResultFrame = oDoc.getElementById("resultFrame"); var oGridFrameDoc = oResultFrame.contentWindow.document; var oGrid = oGridFrameDoc.getElementById("crmGrid"); // Дочерний фрейм всегда готов, но не факт что что-то содержит! if (oGrid == null) { onAlert(oErrorResultsNotReady); return; } var oSelectedRecords = oGrid.InnerGrid.SelectedRecords; if (oSelectedRecords == null || oSelectedRecords.length == 0) { onAlert(oErrorNoSelected); return; } var oAssociatedRecords = getAssociatedRecordsIds(); var oNewItemsIds = getMegredItems(oAssociatedRecords, oSelectedRecords); AssociateObjects(crmForm.ObjectTypeCode, crmForm.ObjectId, oTypeAssociated, oNewItemsIds, false, "", oAssociationName); var addedCount = oNewItemsIds.items.length; var skippedCount = oSelectedRecords.length - addedCount; onAlert("Добавлено записей: " + addedCount + ". Пропущено записей: " + skippedCount); } function getAssociatedRecordsIds() { var oFetchXML = "<fetch mapping='logical'>" + "<entity name='" + oAssociationRecordName + "'>" + "<attribute name='" + oTypeAssociatedName + "id'/>" + "<filter type='and'>" + "<condition attribute='" + oTypeThisName + "id' operator='eq' value='" + crmForm.ObjectId + "'/>" + "</filter>" + "</entity>" + "</fetch>"; oFetchXML = oFetchXML.replace(/</g, '<'); oFetchXML = oFetchXML.replace(/>/g, '>'); var oSOAP = "<?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'>" + GenerateAuthenticationHeader() + "<soap:Body>" + "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" + "<fetchXml>" + oFetchXML + "</fetchXml>" + "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; var oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); oXmlHttp.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); oXmlHttp.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch"); oXmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); oXmlHttp.setRequestHeader("Content-Length", oSOAP.length); oXmlHttp.send(oSOAP); var oResponseText = oXmlHttp.responseXML.text; var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; oXmlDoc.loadXML(oResponseText); var results = oXmlDoc.getElementsByTagName(oTypeAssociatedName + "id"); var associatedRecordsIds = new Array(results.length); for (var i = 0; i < results.length; i++) { associatedRecordsIds[i] = results[i].text; } return associatedRecordsIds; } function getMegredItems(oAssociatedRecords, oSelectedRecords) { var oMergedIds = new LookupArgsClass(); var oItems = new Array(); for (var i=0; i < oSelectedRecords.length; i++) { var doExist = false; var oCandidate = oSelectedRecords[i][0]; for (var j=0; j < oAssociatedRecords.length; j++) { if (oAssociatedRecords[j] == oCandidate) { doExist = true; break; } } if (doExist == false) { oItems.push(new Item(oSelectedRecords[i][0])) } } oMergedIds.items = oItems; return oMergedIds; } function onAlert(oMessage, oType) { alert(oMessage); } function Item(oId) { this.id = oId; }
Всего комментариев 0