|
|
#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) |
|
|
|
|
#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). | |
|
|
#3 |
|
Kostya Afendikov
|
Почитайте официальный SDK , это вам сэкономит кучу времени, чем разбираться в чужом коде
Плюс воспользуйтесь советом от slivka_83, он, кстати, привел пример из SDK |
|
|
|
|
#4 |
|
Участник
|
рецепт slivka_83 - помог в одном случае. прайс лист один.. а вот для штук оказалось есть тонкость оно не одно по умолчанию а разное.
SDK я скачал, вот проблема что искать - как правильно сформулировать мысль .... |
|
|
|
|
#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). | |
|
|
#6 |
|
Участник
|
[QUOTE=Bondonello;212425]Сущность: "Продукты для возможной сделки"
Поле: "Продукт" Событие: "OnChange", вставите следующий код А для продуктов для предложения все аналогично? |
|
|
|
|
#7 |
|
Участник
|
Здорово! Работает
. Спасибо!
|
|
|
|
|
#8 |
|
Участник
|
Да, действительно супер все работает.
Но последний вопрос остаеться открытым как или точнее что надо было искать в SDK , для подобной ситуации. Ведь в правильно заданном вопросе уже содержится до 90% ответа =). |
|
|
|
|
#9 |
|
Консультант-джедай
|
в SDK вы редко найдете готовоый код идеально подходящий под Вашу ситуацию
там представлены различые примеры, разобравшись в которых можно состаить нужный код
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога
|
|
|
|
|
#10 |
|
Kostya Afendikov
|
Цитата:
По сути это же обычная справка и искать надо по ключевым словам конечно же + на форумах люди обычно не жадные, помогают, но все таки пытайтесь осилить вначале сами. |
|
|
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|