27.05.2008, 11:28 | #1 |
Участник
|
Обращение к полю сущности
Здравствуйте, только начинаю разбираться с MS CRM 3.0 и вот застряла на очень уж простом.
Есть 2 сущности. В OnChange поля 1ой сущности обращаюсь crmForm.all.имя_поля к полям данной формы. А как следует обратиться к полям 2ой сущности из того же OnChange? Последний раз редактировалось MFCшный Wizard; 27.05.2008 в 12:09. |
|
27.05.2008, 12:20 | #2 |
CRM
|
Только через веб-сервисы.
X++: function Retrieve(mEntity) { var sXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; sXml += "<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\">"; sXml += "<soap:Body>"; sXml += "<entityName xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">"+mEntity.get("Name")+"</entityName>"; sXml += "<id xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">"+hParams.get("currentEntityId")+"</id>"; sXml += "<columnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\" xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">"; sXml += "<q1:Attributes>"; var fields = mEntity.get("Fields"); var fKeys = fields.keys(); for (var i=0; i<fKeys.length; i++) { if (fields.get(fKeys[i]).get("schema") != null) sXml += "<q1:Attribute>" + fields.get(fKeys[i]).get("schema") + "</q1:Attribute>"; } sXml += "</q1:Attributes>"; sXml += "</columnSet>"; sXml += "</soap:Body>"; sXml += "</soap:Envelope>"; var oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); oXmlHttp.Open("POST", "/MsCrmServices/2006/CrmService.asmx", false); oXmlHttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2006/WebServices/Retrieve"); oXmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); oXmlHttp.setRequestHeader("Content-Length", sXml.length); oXmlHttp.send(sXml); if(oXmlHttp.responseXML != null) return oXmlHttp.responseXML.selectSingleNode("/soap:Envelope/soap:Body/RetrieveResult"); return null; }
__________________
MS CRM 3.0/4.0 Sharepoint 2003, MOSS 2007/2010 |
|
|
За это сообщение автора поблагодарили: MFCшный Wizard (1). |
27.05.2008, 12:24 | #3 |
Moderator
|
Что вы понимаете под сущностями? Если значения, которые вы видите в полях лукап (с лупой), то спешу вас разочаровать: все не так просто. crmForm.all позволяет обращаться лишь к полям данной формы. Если вы открыли форму организации, то через эту ссылку вы получите доступ только к полям объекта Организация. К атрибутам, например, "Основного контактного лица" так не подобраться.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: MFCшный Wizard (1). |
27.05.2008, 12:26 | #4 |
Moderator
|
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
29.05.2008, 14:38 | #5 |
Участник
|
Спасибо за пример. Стала разбираться и выяснила, что не работает или не подключается сам веб сервис
ошибка "Service was unable to process request" В IIS веб службы для CRM включены/разрешены. Что не правильно делаю? Может надо проект в студии делать? В общем, если не трудно, подскажите какое-нибудь решение и направление куда двигаться дальше |
|
29.05.2008, 15:01 | #6 |
Учаснег
|
мы писали собственные веб-службы (достаточно простые), наверное просто, так нам было быстрее (насчет оптимальности решения, сомневаюсь, возможно через JS работает быстрее). Задается метод, который возвращает нужные аттрибуты.
P.S. Очень рекомендую книгу Working with MS crm 3.0 http://www.amazon.com/Working-Micros.../dp/0735622590 Тем таких много поднималось, что непонятно, можно в личку.. |
|
29.05.2008, 15:13 | #7 |
Участник
|
Цитата:
ошибка "Service was unable to process request"
В IIS веб службы для CRM включены/разрешены. Что не правильно делаю? и еще вот здесь Цитата:
oXmlHttp.Open("POST", "/MsCrmServices/2006/CrmService.asmx", false);
|
|
29.05.2008, 15:40 | #8 |
Moderator
|
Если говорит не может обработать запрос - значит он с ошибкой. Вклюите трассировку ошибок и посмотрите ее код или описание в логе. Скорее всего вы просто формируете сообщение с ошибками
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
29.05.2008, 15:46 | #9 |
Участник
|
Путь добавила, результат не поменялся.
код следующий : X++: 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; [B]alert(xmlHttpRequest.responseText);[/B] --- , "Service was unable to process request" var retValue = ''; if (doc.selectSingleNode('//RetrieveResult/' + attributeName) != null) retValue = doc.selectSingleNode('//RetrieveResult/' + attributeName).text; return retValue; } На буржуйских форумах смысл тот же: можно делать проект, а можно с помощью javascript брать атрибут сущности. Для моей задачи мне достаточно брать нужный атрибут из сущности, и этот код вроде должен справляться, одна загвоздка - веб служба не запускается. |
|
29.05.2008, 15:46 | #10 |
Участник
|
А как включить трассировку?
|
|
29.05.2008, 15:49 | #11 |
Участник
|
Проблема с картинкой, если не трудно посмотреть, то вот так выглядит то, что передаю на сервер http://bondonello.narod.ru/1.bmp
Последний раз редактировалось MFCшный Wizard; 29.05.2008 в 15:53. |
|
29.05.2008, 15:50 | #12 |
Участник
|
Цитата:
Путь добавила, результат не поменялся.
Цитата:
xmlHttpRequest.Open('POST', '/mscrmservices/2006/CrmService.asmx', false);
|
|
29.05.2008, 15:58 | #13 |
Участник
|
Спасибо, что тратите свое время.
Вот исправила код X++: 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'); //var xmlHttpRequest = new ActiveXObject('Microsoft.XMLHTTP'); xmlHttpRequest.Open('POST', 'http://localhost:5555/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(doc); alert(xmlHttpRequest.responseText); var retValue = ''; if (doc.selectSingleNode('//RetrieveResult/' + attributeName) != null) retValue = doc.selectSingleNode('//RetrieveResult/' + attributeName).text; return retValue; } [ на < Ошибка точно та же |
|
29.05.2008, 16:00 | #14 |
Участник
|
Подождите, у меня кавычки двойные везде в скрипте
и уберите строки Цитата:
xml = xml.replace(/\</gi, String.fromCharCode(60));
xml = xml.replace(/\>/gi, String.fromCharCode(62)); xml = xml.replace(/\\`/gi, String.fromCharCode(34)); |
|
29.05.2008, 16:01 | #15 |
Участник
|
вот мой скрипт, который работает
Цитата:
var ownerLookupItem = new Array;
ownerLookupItem = crmForm.all.ownerid.DataValue; var lookupData = new Array(); var bUnitLookupItem= new Object(); if (ownerLookupItem != null) { if (ownerLookupItem[0] != null) { var oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); var serverurl = "http://inftb:5555/"; sGUID=ownerLookupItem[0].id; if (sGUID != null) { var sEntityName="systemuser"; var sAttributeName="businessunitid"; var bUID =""; crmForm.all.new_debug.DataValue = sEntityName + " | " + sGUID + " | "+ sAttributeName; bUID = GetAttributeValue(sEntityName, sGUID, sAttributeName); var bUEntityName ="businessunit"; var bUEntityType ="name"; crmForm.all.new_debug.DataValue +=bUEntityName + " | " + bUID + " | "+ bUEntityType; var bUName = GetAttributeValue(bUEntityName, bUID, bUEntityType); bUnitLookupItem.id = bUID; bUnitLookupItem.typename = bUEntityName; bUnitLookupItem.name = bUName; lookupData[0] = bUnitLookupItem; crmForm.all.new_businessunit_phonecall.DataValue = lookupData; crmForm.all.new_debug.DataValue += " >>" + lookupData[0].id + " | "+ lookupData[0].name; } } else { //alert("crmForm.all.ownerid is Null"); } } function GetAttributeValue(sEntityName, sGUID, sAttributeName) { var xml = ""; xml +="<?xml version=\"1.0\" encoding=\"utf-8\"?>"; xml +="<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\">"; //xml += GenerateAuthenticationHeader(); xml +="<soap:Body>"; xml +="<entityName xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" + sEntityName + "</entityName>"; xml +="<id xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" + sGUID + "</id>"; xml +="<columnSet xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\" xmlns:q=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q:ColumnSet\">"; xml +="<q:Attributes>"; xml +="<q:Attribute>" + sAttributeName + "</q:Attribute>"; xml +="</q:Attributes>"; xml +="</columnSet>"; xml +="</soap:Body>"; xml +="</soap:Envelope>"; var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP"); xmlHttpRequest.Open("POST", serverurl + "/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); crmForm.all.new_debug.DataValue +=xml; var doc = xmlHttpRequest.responseXML; crmForm.all.new_debug.DataValue +=xmlHttpRequest.responseText; var retValue = ""; if (doc.selectSingleNode("//RetrieveResult/q1:" + sAttributeName) != null) retValue = doc.selectSingleNode("//RetrieveResult/q1:" + sAttributeName).text; else crmForm.all.new_debug.DataValue += xmlHttpRequest.responseXML; return retValue; } Последний раз редактировалось Bakai Madybaev; 29.05.2008 в 16:04. |
|
|
За это сообщение автора поблагодарили: MFCшный Wizard (1). |
30.05.2008, 06:44 | #16 |
CRM
|
MFCшный Wizard, судя по картинке, которую вы прикрепили http://bondonello.narod.ru/1.bmp там явно написано, что обращение происходит к неизвестной сущности (см. поле description)
'\r\n' - не обязательно Поставьте себе Fiddler и при помощи его отлавливайте запросы к серверу и ответы от него же. Если ничего не выйдет, то xml-строку, которую Вы отправляете серверу выложите здесь вместе с ответом. Постараюсь помочь.
__________________
MS CRM 3.0/4.0 Sharepoint 2003, MOSS 2007/2010 |
|
30.05.2008, 09:52 | #17 |
Заноза в заднице
|
Есть ещё вариант создать aspx-страничку, которая на шарпе будет получать нужную вам сущность (да в принципе любые нужные данные из любого места), а вызов этой странички на клиенте будет выглядеть примерно так:
var sXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); X++: var sUserNo = crmForm.all.ownerid.DataValue[0].id; var sXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); sXmlDoc.async = false; sXmlDoc.load("http://crmserver/ExtentCRM/GetPriceByUser.aspx?userno=" + sUserNo); var strsNode = sXmlDoc.selectSingleNode("childPricelevel").text; Сей способ я кстати, подглядел в книжке Снайдера и Стеггера, на которую имеется упоминание выше.
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! Последний раз редактировалось Likefire; 30.05.2008 в 09:56. |
|
30.05.2008, 11:45 | #18 |
Участник
|
Цитата:
Поставьте себе Fiddler и при помощи его отлавливайте запросы к серверу и ответы от него же.
Если ничего не выйдет, то 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"> <soap:Body> <entityName xmlns="http://schemas.microsoft.com/crm/2006/WebServices">1088</entityName> <id xmlns="http://schemas.microsoft.com/crm/2006/WebServices">{8149AC6D-B72B-DD11-8420-000C293DD0FD}</id> <columnSet xmlns="http://schemas.microsoft.com/crm/2006/WebServices" xmlns:q="http://schemas.microsoft.com/crm/2006/Query" xsi:type="q:ColumnSet"> <q:Attributes> <q:Attribute>name</q:Attribute> </q:Attributes> </columnSet> </soap:Body> </soap:Envelope>" ошибка осталась |
|
30.05.2008, 12:25 | #19 |
Участник
|
Вы сейчас выложили только запрос поступающий в Веб-сервис,
выложите еще response - ответ исходящий От веб-сервиса. alert("") функцией воспользуйтесь - посмотрите, что в строке ответа. Цитата:
<entityName xmlns="http://schemas.microsoft.com/crm/2006/WebServices">1088</entityName>
и что за сущность с именем 1088 ? это созданная Вами сущность? Последний раз редактировалось Bakai Madybaev; 30.05.2008 в 12:28. |
|
02.06.2008, 07:28 | #20 |
CRM
|
Созданные сущности имеют id начиная с 10000. Ну ошибка уже видна: надо писать не 1088, а имя сущности, например, account или contact, в вашем случае это SalesOrder.
__________________
MS CRM 3.0/4.0 Sharepoint 2003, MOSS 2007/2010 |
|
|
|