AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.11.2009, 18:46   #1  
e.pasechny is offline
e.pasechny
Участник
 
42 / 10 (1) +
Регистрация: 10.12.2007
Извлечение значения полей из атрибута на форме
Задача : упростить ввод типовых операций для пользователя.
Пример : Возможная Сделка - постоянно надо указывать поле - Прайс-Лист.
Продукты - надо указывать поле - Шт.

Оба эти поля я завел в Пользователя где выбрал для них значения.

Как я понял на прямую получить что-то кроме текстового поля я из атрибута не могу.

У меня даже есть готовый пример,оставшийся от внедренцев:

В папке 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  
slivka_83 is offline
slivka_83
Консультант-джедай
Аватар для slivka_83
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
1,683 / 374 (16) ++++++
Регистрация: 18.12.2008
Адрес: default city
А почему на онлоаде не прописать Прайс-Лист, Шт.? узнаете 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  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Почитайте официальный SDK , это вам сэкономит кучу времени, чем разбираться в чужом коде
Плюс воспользуйтесь советом от slivka_83, он, кстати, привел пример из SDK
Старый 10.11.2009, 12:34   #4  
e.pasechny is offline
e.pasechny
Участник
 
42 / 10 (1) +
Регистрация: 10.12.2007
рецепт slivka_83 - помог в одном случае. прайс лист один.. а вот для штук оказалось есть тонкость оно не одно по умолчанию а разное.

SDK я скачал, вот проблема что искать - как правильно сформулировать мысль ....
Старый 10.11.2009, 12:41   #5  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от e.pasechny Посмотреть сообщение
рецепт slivka_83 - помог в одном случае. прайс лист один.. а вот для штук оказалось есть тонкость оно не одно по умолчанию а разное.

SDK я скачал, вот проблема что искать - как правильно сформулировать мысль ....
Сущность: "Продукты для возможной сделки"
Поле: "Продукт"
Событие: "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  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
[QUOTE=Bondonello;212425]Сущность: "Продукты для возможной сделки"
Поле: "Продукт"
Событие: "OnChange", вставите следующий код


А для продуктов для предложения все аналогично?
Старый 10.11.2009, 13:07   #7  
Elka is offline
Elka
Участник
Аватар для Elka
 
431 / 22 (1) +++
Регистрация: 02.12.2008
Адрес: г. Ростов-на-Дону
Здорово! Работает . Спасибо!
Старый 10.11.2009, 13:29   #8  
e.pasechny is offline
e.pasechny
Участник
 
42 / 10 (1) +
Регистрация: 10.12.2007
Да, действительно супер все работает.
Но последний вопрос остаеться открытым как или точнее что надо было искать в SDK , для подобной ситуации.
Ведь в правильно заданном вопросе уже содержится до 90% ответа =).
Старый 10.11.2009, 13:44   #9  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Цитата:
Сообщение от e.pasechny Посмотреть сообщение
Да, действительно супер все работает.
Но последний вопрос остаеться открытым как или точнее что надо было искать в SDK , для подобной ситуации.
Ведь в правильно заданном вопросе уже содержится до 90% ответа =).
Это странный вопрос немного. Начинайте для начала его читать, ознакомьтесь с разделами и содержанием, в голове уже что-то будет откладываться. Со временем и опытом будете знать, что предположительно найти и как. По-другому, наверно, не получится

По сути это же обычная справка и искать надо по ключевым словам конечно же + на форумах люди обычно не жадные, помогают, но все таки пытайтесь осилить вначале сами.
Старый 10.11.2009, 13:44   #10  
slivka_83 is offline
slivka_83
Консультант-джедай
Аватар для slivka_83
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
1,683 / 374 (16) ++++++
Регистрация: 18.12.2008
Адрес: default city
в SDK вы редко найдете готовоый код идеально подходящий под Вашу ситуацию там представлены различые примеры, разобравшись в которых можно состаить нужный код
__________________
Крокодил, крокожу и буду крокодить.
Человек человеку - волк , а зомби зомби - зомби.
Экстремал и буду экстремать!
Блога
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Присвоение одного атрибута сущности значения другого атрибута связанной сущности vital.mih Dynamics CRM: Функционал 38 08.09.2010 10:53
Мелкомягкий CRM: Отображение в Lookup’е произвольного поля вместо основного атрибута Blog bot Dynamics CRM: Blogs 3 26.04.2010 19:10
не сохраняются значения новых полей zhenek Dynamics CRM: Разработка 18 05.06.2009 18:28
пустые значения при перегонки данных через migration Manager valk Dynamics CRM: Функционал 2 02.09.2008 19:52
Как сделать две одинаковые ссылки на одной форме? tatra Dynamics CRM: Разработка 5 21.09.2007 18:26

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:08.