19.08.2009, 13:40 | #1 |
Участник
|
Можно ли посчитать связанные сущности?
Добрый день.
Ситауция: есть сущность "Строка контракта" с ней связана сущность "Оборудование" (отношение N:N), т.е. в одну строку контракта набирается некоторое количество оборудования. Нужно: посчитать количество добавленных строк Оборудования и сумму вставить в поле "Количество оборудования" на форме Строка контракта. Вроде SOAP нужен, только вот с чего начать не могу понять, помогите... |
|
19.08.2009, 13:52 | #2 |
Moderator
|
Fecth запросы теперь, действительно поддерживают агрегацию. Читайте Using Count Aggregation in FetchXML в SDK
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
19.08.2009, 13:56 | #3 |
Чайный пьяница
|
Цитата:
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
19.08.2009, 13:56 | #4 |
Moderator
|
Хотя я бы, скорее всего, плагины для этого использовал.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
20.08.2009, 08:03 | #5 |
Участник
|
Доброе утро.
Составил Fetch, ставлю на OnSave пишет ошибка на странице и тишина......... Что-то тут не так, знающие люди посмотрите код Спасибо function getFetchXml(){ return '<fetch mapping='logical' aggregate='SUM'> <entity name='equipment'> <attribute name='name'/> <link-entity name='new_equipment_contractdetail' from='equipmentid' to='equipmentid'/> </entity> </fetch>'; } crmForm.all.new_count.DataValue = return; |
|
20.08.2009, 08:09 | #6 |
Консультант-джедай
|
вопервых, берите эту софтину и проверяйте работает ли Ваш фетч http://mmcrm.ru/?p=494
далее... для фетча нужен соап запрос вот такой http://msdn.microsoft.com/en-us/library/cc677073.aspx
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
20.08.2009, 09:24 | #7 |
Участник
|
В проге fetch проверил, нормально возвращает id всех сущностей оборудования (хотя мне нужно количество сущностей вернуть):
Код: <fetch mapping='logical'> <entity name='equipment'> <no-attrs/> <link-entity name='new_equipment_contractdetail' from='equipmentid' to='equipmentid'/> </entity> </fetch> Всё равно где-то допускаю ошибку, пишет "ошибка на странице", код такой: Код: // Prepare variables to fetch accounts. var fetchMapping = "logical"; var entityName = "equipment"; var linkEntityname ="new_equipment_contractdetail"; var linkEntityfrom ="equipmentid"; var linkEntityto ="equipmentid"; var authenticationHeader = GenerateAuthenticationHeader(); // Prepare the SOAP message. var 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'>"+ authenticationHeader+ "<soap:Body>"+ "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ "<fetchXml><fetch mapping='"+fetchMapping+"'>"+ "<entity name='"+entityName+"'>"+ "<link-entity name='"+linkEntityname+"' from='"+linkEntityfrom+"'>" to='"+linkEntityto+"'>"+ "</link-entity>"+ "</entity>"+ "</fetch></fetchXml>"+ "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; // Prepare the xmlHttpObject and send the request. var xHReq = new ActiveXObject("Msxml2.XMLHTTP"); xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch"); xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xHReq.setRequestHeader("Content-Length", xml.length); xHReq.send(xml); // Capture the result. var resultXml = xHReq.responseXML; // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg); } // Process and display the results. else { // Capture the result and UnEncode it. var resultSet = new String(); resultSet = resultXml.text; resultSet.replace('<','<'); resultSet.replace('>','>'); // Create an XML document that you can parse. var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; // Load the XML document that has the UnEncoded results. oXmlDoc.loadXML(resultSet); // Display the results. var results = oXmlDoc.getElementsByTagName('result'); var msg = "\equipment Id\t\t\t\tequipment Name\r"; msg +="--------------------------------------------------------------------------------\r"; for (i=0;i < results.length;i++) { var idValue = results[i].selectSingleNode('./equipmentid').nodeTypedValue; var name = results[i].selectSingleNode('./name').nodeTypedValue; msg += idValue +"\t"+ name+"\r"; alert(idValue); } |
|
20.08.2009, 10:00 | #8 |
Консультант-джедай
|
Вы убрали из фетча возвращаемые поля, но не добавили <no-attrs/>
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога Последний раз редактировалось slivka_83; 20.08.2009 в 10:05. |
|
20.08.2009, 10:06 | #9 |
Консультант-джедай
|
А запрос с суммой у Вас в фетчбилдере работает?
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
20.08.2009, 11:16 | #10 |
Участник
|
|
|
20.08.2009, 11:35 | #11 |
Консультант-джедай
|
попробуйте так:
X++: var authenticationHeader = GenerateAuthenticationHeader(); // Prepare the SOAP message. var 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'>"+ authenticationHeader+ "<soap:Body>"+ "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ "<fetch mapping='logical'><entity name='equipment'><no-attrs/><link-entity name='new_equipment_contractdetail' from='equipmentid' to='equipmentid'/></entity></fetch>"+ "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; // Prepare the xmlHttpObject and send the request. var xHReq = new ActiveXObject("Msxml2.XMLHTTP"); xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); xHReq.setRequestHeader("SOAPAction","[URL]http://schemas.microsoft.com/crm/2007/WebServices/Fetch[/URL]"); xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xHReq.setRequestHeader("Content-Length", xml.length); xHReq.send(xml); // Capture the result. var resultXml = xHReq.responseXML; // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg + "0"); } // Process and display the results. else { // Capture the result and UnEncode it. var resultSet = new String(); resultSet = resultXml.text; resultSet.replace('<','<'); resultSet.replace('>','>'); // Create an XML document that you can parse. var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; // Load the XML document that has the UnEncoded results. oXmlDoc.loadXML(resultSet); // Display the results. var results = oXmlDoc.getElementsByTagName('result'); var msg = "\equipment Id\t\t\t\tequipment Name\r"; msg +="--------------------------------------------------------------------------------\r"; for (i=0;i < results.length;i++) { var idValue = results[i].selectSingleNode('./equipmentid').nodeTypedValue; msg += idValue +"\t"; alert(idValue); }
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
20.08.2009, 11:55 | #12 |
Чайный пьяница
|
2 Slivka_83:
код работать не будет 100%. Строка - xHReq.setRequestHeader("SOAPAction","URLhttp://schemas.microsoft.com/crm/2007/WebServices/Fetch/URL");
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
20.08.2009, 12:04 | #13 |
Консультант-джедай
|
ну это уже движок форума чего то нахимичил
var authenticationHeader = GenerateAuthenticationHeader(); // Prepare the SOAP message. var 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'>"+ authenticationHeader+ "<soap:Body>"+ "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ "<fetch mapping='logical'><entity name='equipment'><no-attrs/><link-entity name='new_equipment_contractdetail' from='equipmentid' to='equipmentid'/></entity></fetch>"+ "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; // Prepare the xmlHttpObject and send the request. var xHReq = new ActiveXObject("Msxml2.XMLHTTP"); xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch"); xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xHReq.setRequestHeader("Content-Length", xml.length); xHReq.send(xml); // Capture the result. var resultXml = xHReq.responseXML; // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg + "0"); } // Process and display the results. else { // Capture the result and UnEncode it. var resultSet = new String(); resultSet = resultXml.text; resultSet.replace('<','<'); resultSet.replace('>','>'); // Create an XML document that you can parse. var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; // Load the XML document that has the UnEncoded results. oXmlDoc.loadXML(resultSet); // Display the results. var results = oXmlDoc.getElementsByTagName('result'); var msg = "\equipment Id\t\t\t\tequipment Name\r"; msg +="--------------------------------------------------------------------------------\r"; for (i=0;i < results.length;i++) { var idValue = results[i].selectSingleNode('./equipmentid').nodeTypedValue; msg += idValue +"\t"; alert(idValue); }
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
20.08.2009, 12:25 | #14 |
Участник
|
Так Ошибки на странице уже нет, но и результата тоже нет, тишина.
|
|
20.08.2009, 14:16 | #15 |
Консультант-джедай
|
Попробуйте это
var authenticationHeader = GenerateAuthenticationHeader(); // Prepare the SOAP message. var 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'>"+ authenticationHeader+ "<soap:Body>"+ "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ "<fetchXml><fetch mapping='logical'><entity name='equipment'><no-attrs/></entity></fetch></fetchXml>"+ "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; // Prepare the xmlHttpObject and send the request. var xHReq = new ActiveXObject("Msxml2.XMLHTTP"); xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch"); xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xHReq.setRequestHeader("Content-Length", xml.length); xHReq.send(xml); // Capture the result. var resultXml = xHReq.responseXML; // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg); } // Process and display the results. else { // Capture the result and UnEncode it. var resultSet = new String(); resultSet = resultXml.text; resultSet.replace('<','<'); resultSet.replace('>','>'); // Create an XML document that you can parse. var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; // Load the XML document that has the UnEncoded results. oXmlDoc.loadXML(resultSet); // Display the results. var results = oXmlDoc.getElementsByTagName('result'); var msg = "\Account Id\t\t\t\tAccount Name\r"; msg +="--------------------------------------------------------------------------------\r"; for (i=0;i < results.length;i++) { var idValue = results[i].selectSingleNode('./equipmentid').nodeTypedValue; msg += idValue +"\t"; } alert(msg); }
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
20.08.2009, 15:11 | #16 |
Участник
|
Отлично! Работает, выводит все id`шники связанных сущностей.
Есть ещё один вопросик, если позволите Как теперь получить количество этих id ? В fetch пишу aggregate='sum' и 'count' , но в полученном тексте количества нет. |
|
20.08.2009, 15:22 | #17 |
Чайный пьяница
|
А чем results.length не угодила - вот вам и количество этих идентификаторов.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Dekan (1). |
20.08.2009, 15:28 | #18 |
Участник
|
Точно. Всем спасибо
PS: Мне уже не дают плюсики вам ставить лимит кончился......... Последний раз редактировалось Dekan; 20.08.2009 в 15:30. |
|
20.08.2009, 15:41 | #19 |
Консультант-джедай
|
а вот так с помощью фетча считает
<fetch mapping='logical' aggregate='true'> <entity name='equipment'> <attribute name='equipmentid' alias='sum' aggregate='count'/> </entity> </fetch>
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
20.08.2009, 15:50 | #20 |
Участник
|
Сейчас всё протестировал, получается, что считаются всё количество оборудования в системе, а не связанное со строкой контракта. Как их отфильтровать?
|
|