如何在CRM标注中附加到表单上的字段?

时间:2010-07-16 18:35:18

标签: c# dynamics-crm callouts dynamics-crm-3

我找不到任何有关此内容的信息。我有一个来自表单的CRM标注,我需要附加到其中一个字段;例如,字段中可能包含类似“BH”的字符,我需要使用callout进行一些计算并更改字段以使其显示为“BH002129”或其他任何内容,但无论我如何尝试,它最终只是完全覆盖该字段(所以在这种情况下,它只会说“002129”)。我似乎无法让它追加,我也无法弄清楚如何读取该属性的值,所以我可以将它添加到callout放在那里的字符串。必须有办法做到这一点,对吧?但是如何?

编辑:代码段:


public override PreCalloutReturnValue PreCreate(CalloutUserContext userContext, CalloutEntityContext entityContext, ref string entityXml, ref string errorMessage)
  {
  // Variables
   string prefix = "no_init";

   XmlDocument entityDoc = new XmlDocument();
   entityDoc.LoadXml(entityXml);

   XmlNodeList propertyList = entityDoc.GetElementsByTagName("Property");
   XmlElement competitorNumberValue = null;
   XmlElement properties = (XmlElement) entityDoc.GetElementsByTagName("Properties")[0];
   XmlElement competitorNumberElement = entityDoc.CreateElement("Property");

   // Find prefix -- this is the part I don't know how to do
   prefix = Convert.ToString(?????);

           /*
               Other stuff gets calculated here, which works fine. New value gets written to the attribute here as well.
           */

   return PreCalloutReturnValue.Continue;   
  }

另一个编辑:我刚试过这个想法,我在网上找到了这个想法,实际上在保存时会导致CRM服务器错误:



            string nameSpaceValue = entityDoc.ChildNodes[0].Attributes["xmlns"].Value;
            XmlNamespaceManager xsn = new XmlNamespaceManager(entityDoc.NameTable);
            xsn.AddNamespace("z", nameSpaceValue);   
            string entityXpath = "//z:new_name";
            XmlNode new_nameNode = entityDoc.SelectSingleNode(entityXpath, xsn);

            // Find prefix
            prefix = ((XmlElement)new_nameNode).GetAttribute("new_name").ToString();

2 个答案:

答案 0 :(得分:1)

我使用此类来处理callout entity xml

public abstract class EntityXmlParser
{
    public abstract bool isValueExists(params string[] arrParamName);
    public abstract string GetSingleValue(string sParamName, string sDefaultValue);
    public abstract int GetSingleValue(string sParamName, int nDefaultValue);
    public abstract decimal GetSingleValue(string sParamName, decimal nDefaultValue);
    public abstract Guid GetSingleValue(string sParamName, Guid idDefaultValue);
    public abstract DateTime GetSingleValue(string sParamName, DateTime dtDefaultValue);
}

public class EntityCrmCalloutXmlParser : EntityXmlParser
{
    private XmlDocument m_xmlDoc = null;
    private NameTable m_xmlNameTable = null;
    private XmlNamespaceManager m_xmlNameMgr = null;
    private const string ms_sURIXmlns = @"http://schemas.microsoft.com/crm/2006/WebServices";
    private const string ms_sURIXsi = @"http://www.w3.org/2001/XMLSchema-instance";
    private bool m_blChangeEntityXml = false;

public EntityCrmCalloutXmlParser(string sCalloutEntityXml)
{
    /*m_xd = new XPathDocument(new System.IO.StringReader(sCalloutEntityXml));
    m_xn = m_xd.CreateNavigator();*/
    m_xmlNameTable = new NameTable();
    m_xmlNameMgr = new XmlNamespaceManager(m_xmlNameTable);
    // Add the required prefix/namespace pairs to the namespace manager. Add a default namespace first.
    m_xmlNameMgr.AddNamespace("crm", ms_sURIXmlns);
    m_xmlNameMgr.AddNamespace("xsi", ms_sURIXsi);
    // загрузка xml-строки
    m_xmlDoc = new XmlDocument();
    m_xmlDoc.LoadXml(sCalloutEntityXml);
}

public string EntityXml
{
    get { return m_xmlDoc.OuterXml; }
}

public bool IsChangeEntityXml
{
    get { return m_blChangeEntityXml; }
}

public string GetEntityName()
{
    XmlNodeList xmllstItem = m_xmlDoc.SelectNodes("/crm:BusinessEntity/@Name", m_xmlNameMgr);
    if ((null == xmllstItem) || (1 != xmllstItem.Count))
        throw new CrmInternalException("Название сущности не найдено.");
    return xmllstItem[0].InnerText;
}

public override string GetSingleValue(string sParamName, string sDefaultValue)
{
    XmlNodeList xiter = m_xmlDoc.SelectNodes("//crm:Property[@Name='" + sParamName + "']/crm:Value", m_xmlNameMgr);
    if (0 == xiter.Count)
        return sDefaultValue;
    if ((1 != xiter.Count) /* || !xiter.MoveNext()*/)
        throw new System.ApplicationException("Ошибка при разборе входных значений. Неудалось однозначно определить параметр '" + sParamName + "'.");
    // проверка на значение null.
    XmlAttribute xmlIsNullAttribute = xiter.Item(0).Attributes["IsNull"];
    bool blNull = false;
    if (null != xmlIsNullAttribute)
        blNull = bool.Parse(xiter.Item(0).Attributes["IsNull"].Value);
    return (blNull) ? sDefaultValue : xiter.Item(0).InnerText;
}
public override Guid GetSingleValue(string sParamName, Guid idDefaultValue)
{
    return new Guid(GetSingleValue(sParamName, idDefaultValue.ToString("B")));
}

public override decimal GetSingleValue(string sParamName, decimal nDefaultValue)
{
    return decimal.Parse(GetSingleValue(sParamName, nDefaultValue.ToString(CalloutManager.Instance.NumberFormatInfo)), CalloutManager.Instance.NumberFormatInfo);
}

public override int GetSingleValue(string sParamName, int nDefaultValue)
{
    return int.Parse(GetSingleValue(sParamName, nDefaultValue.ToString()));
}

public override DateTime GetSingleValue(string sParamName, DateTime dtDefaultValue)
{
    return DateTime.Parse(GetSingleValue(sParamName, dtDefaultValue.ToString(CalloutManager.Instance.CRMFullDateFormat)));
}

    public bool SetPropertyValue(string sPropertyName, DateTime dtPropertyValue)
    {
        XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr);
        if (null == xmlRootPropNode)
            throw new ApplicationException("Ошибка при получении xml элемента BusinessEntity.");
        // поиск элемента в xml-структуре
        XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr);
        if (null == xmlPropValueElem)
        {   // элемент не найден
            // создание элемента
            XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns));
            xmlPropElem.SetAttribute("type", ms_sURIXsi, "CrmDateTimeProperty");
            xmlPropElem.SetAttribute("Name", sPropertyName);
            xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns));
        }
        if (DateTime.MinValue.Equals(dtPropertyValue))
            xmlPropValueElem.SetAttribute("IsNull", string.Empty, "true");
        else
            xmlPropValueElem.InnerText = dtPropertyValue.ToString("s");

        m_blChangeEntityXml = true;
        return true;
    }


    public bool SetPropertyValue(string sPropertyName, string sPropertyValue)
    {
        XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr);
        if (null == xmlRootPropNode)
            throw new ApplicationException("Ошибка при получении xml элемента BusinessEntity.");
        // поиск элемента в xml-структуре
        XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr);
        if (null == xmlPropValueElem)
        {   // элемент не найден
            // создание элемента
            XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns));
            xmlPropElem.SetAttribute("type", ms_sURIXsi, "StringProperty");
            xmlPropElem.SetAttribute("Name", sPropertyName);
            xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns));
        }
        xmlPropValueElem.InnerText = sPropertyValue;
        m_blChangeEntityXml = true;
        return true;
    }

    public bool SetPropertyValue(string sPropertyName, Guid idPropertyValue)
    {
        XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr);
        if (null == xmlRootPropNode)
            throw new CrmInternalException("Ошибка при получении xml элемента BusinessEntity.");
        // поиск элемента в xml-структуре
        XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr);
        if (null == xmlPropValueElem)
        {   // элемент не найден
            // создание элемента
            XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns));
            xmlPropElem.SetAttribute("type", ms_sURIXsi, "LookupProperty");
            xmlPropElem.SetAttribute("Name", sPropertyName);
            xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns));
        }
        if (idPropertyValue.Equals(Guid.Empty))
            xmlPropValueElem.SetAttribute("IsNull", string.Empty, "true");
        else
            xmlPropValueElem.InnerText = idPropertyValue.ToString("B");
        m_blChangeEntityXml = true;
        return true;
    }

    public bool SetPropertyValue(string sPropertyName, int nPropertyValue)
    {
        XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr);
        if (null == xmlRootPropNode)
            throw new CrmInternalException("Ошибка при получении xml элемента BusinessEntity.");
        // поиск элемента в xml-структуре
        XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr);
        if (null == xmlPropValueElem)
        {   // элемент не найден
            // создание элемента
            XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns));
            xmlPropElem.SetAttribute("type", ms_sURIXsi, "CrmNumberProperty");
            xmlPropElem.SetAttribute("Name", sPropertyName);
            xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns));
        }
        xmlPropValueElem.InnerText = nPropertyValue.ToString();
        m_blChangeEntityXml = true;
        return true;
    }

    public bool SetPropertyValue(string sPropertyName, decimal dPropertyValue)
    {
        XmlNode xmlRootPropNode = m_xmlDoc.SelectSingleNode("crm:BusinessEntity/crm:Properties", m_xmlNameMgr);
        if (null == xmlRootPropNode)
            throw new CrmInternalException("Ошибка при получении xml элемента BusinessEntity.");
        // поиск элемента в xml-структуре
        XmlElement xmlPropValueElem = (XmlElement)xmlRootPropNode.SelectSingleNode("crm:Property[@Name='" + sPropertyName + @"']/crm:Value", m_xmlNameMgr);
        if (null == xmlPropValueElem)
        {   // элемент не найден
            // создание элемента
            XmlElement xmlPropElem = (XmlElement)xmlRootPropNode.AppendChild(m_xmlDoc.CreateElement("Property", ms_sURIXmlns));
            xmlPropElem.SetAttribute("type", ms_sURIXsi, "CrmMoneyProperty");
            xmlPropElem.SetAttribute("Name", sPropertyName);
            xmlPropValueElem = (XmlElement)xmlPropElem.AppendChild(m_xmlDoc.CreateElement("Value", ms_sURIXmlns));
        }
        xmlPropValueElem.InnerText = dPropertyValue.ToString(System.Globalization.CultureInfo.InvariantCulture);
        m_blChangeEntityXml = true;
        return true;
    }

}

}

答案 1 :(得分:0)

我认为您应该将它包装在Dynamic实体中,以便您可以直接访问每个属性。

查看http://blogs.msdn.com/b/sureshm/archive/2007/05/07/dynamic-crm-3.0-callouts-2d00-_5b00_generic-callout-implementation_5d00_.aspx