|  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 | Цитата: По сути это же обычная справка и искать надо по ключевым словам конечно же + на форумах люди обычно не жадные, помогают, но все таки пытайтесь осилить вначале сами. | 
|  | 
|  | 
| 
 |