09.11.2009, 18:46 | #1 |
Участник
|
Извлечение значения полей из атрибута на форме
Задача : упростить ввод типовых операций для пользователя.
Пример : Возможная Сделка - постоянно надо указывать поле - Прайс-Лист. Продукты - надо указывать поле - Шт. Оба эти поля я завел в Пользователя где выбрал для них значения. Как я понял на прямую получить что-то кроме текстового поля я из атрибута не могу. У меня даже есть готовый пример,оставшийся от внедренцев: В папке C:\Inetpub\wwwroot\ISV\GetFirmAndWarehouse лежит handler.ashx Код: <%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Web; using System.Xml; using Crm.Sdk; public class Handler : IHttpHandler { public void ProcessRequest(HttpContext context) { XmlDocument doc = new XmlDocument(); string fecth = String.Format(@"<fetch mapping='logical'> <entity name='systemuser'> <filter type='and'> <condition attribute='systemuserid' operator='eq' value='{0}'/> </filter> <link-entity name='hr_user1c' from='hr_user1cid' to='hr_user1cid' link-type='inner'> <attribute name='hr_firmid'/> <attribute name='hr_warehouseid'/> </link-entity> </entity> </fetch>", context.Request.Params["userid"]); CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = context.Request.Params["orgname"]; CrmService crmservice = new CrmService(); crmservice.CrmAuthenticationTokenValue = token; crmservice.Credentials = System.Net.CredentialCache.DefaultCredentials; string resultfetch = crmservice.Fetch(fecth); doc.LoadXml(resultfetch); XmlNode hr_firmid_node = doc.SelectSingleNode("//hr_user1cid.hr_firmid"); XmlNode hr_warehouseid_node = doc.SelectSingleNode("//hr_user1cid.hr_warehouseid"); string hr_firmid = string.Empty; string hr_firmidname = string.Empty; string hr_warehouseid = string.Empty; string hr_warehouseidname = string.Empty; string xmlstr = string.Empty; if (hr_firmid_node != null) { hr_firmid = hr_firmid_node.InnerText; hr_firmidname = hr_firmid_node.Attributes["name"].Value; xmlstr+="<hr_firmid name='"+hr_firmidname+"'>"+hr_firmid+"</hr_firmid>"; } if (hr_warehouseid_node != null) { hr_warehouseid = hr_warehouseid_node.InnerText; hr_warehouseidname = hr_warehouseid_node.Attributes["name"].Value; xmlstr += "<hr_warehouseid name='" + hr_warehouseidname + "'>" + hr_warehouseid + "</hr_warehouseid>"; } /*context.Response.ContentType = "text/plain";*/ context.Response.Write("<root>" + xmlstr + "</root>"); } public bool IsReusable { get { return false; } } } и в форме на OnLoad прописано как его вызвать: Код: FillFields() function FillFields() { var req=createRequestObject(); var url ='/ISV/GetFirmAndWarehouse/Handler.ashx?orgname='+ORG_UNIQUE_NAME+'&userid='+crmForm.all.ownerid.DataValue[0].id; req.open('GET', url, false); req.onreadystatechange = function() { if (req.readyState == 4) { if(req.status == 200) { var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.async = false; xmldoc.loadXML(req.responseText); var rootElement = xmldoc.documentElement; var firmNode=rootElement.selectSingleNode('//hr_firmid'); var if(firmNode!=null && crmForm.all.hr_firmid.DataValue==null) { var lookupData = new Array(); var lookupItem= new Object(); lookupItem.id = firmNode.text; lookupItem.typename = 'hr_firm'; lookupItem.name =firmNode.attributes.getNamedItem("name").text; lookupData[0] = lookupItem; crmForm.all.hr_firmid.DataValue=lookupData; } } } } req.send(null); } function createRequestObject() { if (window.XMLHttpRequest) { try { return new XMLHttpRequest(); } catch (e) { } } else if (window.ActiveXObject) { try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) {} try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } return null; } попытался сделать по аналогии ,но у меня не получилось не проходит вот это условие Код: if(req.status == 200) |
|
09.11.2009, 18:56 | #2 |
Консультант-джедай
|
А почему на онлоаде не прописать Прайс-Лист, Шт.? узнаете GUID обоих записей а дальше подставляете в лукап
//Create an array to set as the DataValue for the lookup control. var lookupData = new Array(); //Create an Object add to the array. var lookupItem= new Object(); //Set the id, typename, and name properties to the object. lookupItem.id = '{1AAC1363-01A1-DB11-8432-0003FF9CE217}'; lookupItem.typename = 'account'; lookupItem.name = 'A Bike Store'; // Add the object to the array. lookupData[0] = lookupItem; // Set the value of the lookup field to the value of the array. crmForm.all.parentaccountid.DataValue = lookupData;
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
|
За это сообщение автора поблагодарили: e.pasechny (1). |
09.11.2009, 23:26 | #3 |
Kostya Afendikov
|
Почитайте официальный SDK , это вам сэкономит кучу времени, чем разбираться в чужом коде
Плюс воспользуйтесь советом от slivka_83, он, кстати, привел пример из SDK |
|
10.11.2009, 12:34 | #4 |
Участник
|
рецепт slivka_83 - помог в одном случае. прайс лист один.. а вот для штук оказалось есть тонкость оно не одно по умолчанию а разное.
SDK я скачал, вот проблема что искать - как правильно сформулировать мысль .... |
|
10.11.2009, 12:41 | #5 |
Kostya Afendikov
|
Цитата:
Поле: "Продукт" Событие: "OnChange", вставите следующий код X++: if (crmForm.all.productid.DataValue != null) { var resultXml; var result; var xml; var id = crmForm.all.productid.DataValue[0].id; id = id.replace("{", ""); id = id.replace("}", ""); 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\">" + " <soap:Body>" + " <entityName xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">product</entityName>" + " <id xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" + id + "</id>" + " <columnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\" xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" + " <q1:Attributes>" + " <q1:Attribute>defaultuomid</q1:Attribute>" + " </q1:Attributes>" + " </columnSet>" + " </soap:Body>" + "</soap:Envelope>" + ""; 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); resultXml = xmlHttpRequest.responseXML; result = ReadXml(xmlHttpRequest.responseXML); try { defaultvalueid = result.Envelope.Body.RetrieveResult.defaultuomid; if (isdefined(defaultvalueid)) { var lookupData = new Array(); var lookupItem= new Object(); lookupItem.id = defaultvalueid.value; lookupItem.typename = 'uom'; lookupItem.name = defaultvalueid.xmlAttributes.name; lookupData[0] = lookupItem; } else { lookupData = null; } crmForm.all.uomid.DataValue = lookupData; } catch(e) { crmForm.all.uomid.DataValue = null; } } else { } if(crmForm.all.quantity.DataValue == null) { //crmForm.all.quantity = new Object(); crmForm.all.quantity.DataValue = 0.0; } if((crmForm.all.productid != null) && (crmForm.all.uomid != null)) { crmForm.Save(); } function ReadXml(oXml) { var oReturnValue = new Object(); if (IsNull(oXml)) { return oReturnValue; } var childNodes = oXml.childNodes; for (var i = 0; i < childNodes.length; i++) { var oChildNode = childNodes.item(i); switch (oChildNode.nodeType) { case 1: var oChildObject = ReadXml(oChildNode); if (IsNull(oReturnValue[oChildNode.baseName])) { oReturnValue[oChildNode.baseName] = oChildObject; } else { if (!isArray(oReturnValue[oChildNode.baseName])) { var property = oReturnValue[oChildNode.baseName]; oReturnValue[oChildNode.baseName] = new Array(); oReturnValue[oChildNode.baseName].push(property); } oReturnValue[oChildNode.baseName].push(oChildObject); } break; case 3: oReturnValue["value"] = fromString(oChildNode.nodeValue); break; case 4: return oChildNode.text; default: break; } } if (IsNull(oReturnValue.xmlAttributes)) { var attributes = oXml.attributes; if (!IsNull(attributes)) { if (attributes.length > 0) { oReturnValue.xmlAttributes = new Object(); for (var i = 0; i < attributes.length; i++) { oReturnValue.xmlAttributes[attributes.item(i).baseName] = fromString(attributes.item(i).nodeValue); } } } } return oReturnValue; } function fromString(sValue) { if (sValue.toLowerCase() == "true") { return true; } else if (sValue.toLowerCase() == "false") { return false; } var intValue = parseInt(sValue, 10); if (!isNaN(intValue) && intValue.toString() == sValue) { return intValue; } var floatValue = parseFloat(sValue); if (!isNaN(floatValue) && floatValue.toString() == sValue) { return floatValue; } var dateValue = new Date(sValue); if (!isNaN(dateValue)) { return dateValue; } return sValue; } function isdefined( variable) { return (typeof(variable) == "undefined")? false: true; } |
|
|
За это сообщение автора поблагодарили: e.pasechny (1), Elka (1). |
10.11.2009, 13:02 | #6 |
Участник
|
[QUOTE=Bondonello;212425]Сущность: "Продукты для возможной сделки"
Поле: "Продукт" Событие: "OnChange", вставите следующий код А для продуктов для предложения все аналогично? |
|
10.11.2009, 13:07 | #7 |
Участник
|
Здорово! Работает . Спасибо!
|
|
10.11.2009, 13:29 | #8 |
Участник
|
Да, действительно супер все работает.
Но последний вопрос остаеться открытым как или точнее что надо было искать в SDK , для подобной ситуации. Ведь в правильно заданном вопросе уже содержится до 90% ответа =). |
|
10.11.2009, 13:44 | #9 |
Консультант-джедай
|
в SDK вы редко найдете готовоый код идеально подходящий под Вашу ситуацию там представлены различые примеры, разобравшись в которых можно состаить нужный код
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
10.11.2009, 13:44 | #10 |
Kostya Afendikov
|
Цитата:
По сути это же обычная справка и искать надо по ключевым словам конечно же + на форумах люди обычно не жадные, помогают, но все таки пытайтесь осилить вначале сами. |
|
|
|