2010-07-16 13 views
1

Je ne trouve aucune information à ce sujet. J'ai un appel de CRM qui se déclenche à partir d'un formulaire, et j'ai besoin d'ajouter à l'un des champs; par exemple, le champ peut avoir quelque chose comme "BH", et j'ai besoin de la légende pour faire des calculs et modifier le champ pour qu'il se lise "BH002129" ou autre, mais peu importe comment je l'essaie, il finit juste écraser entièrement le champ (dans ce cas, il suffira de dire "002129"). Je n'arrive pas à l'ajouter, et je n'arrive pas non plus à comprendre comment lire la valeur de cet attribut, donc je peux juste l'ajouter à la chaîne que la légende met là. Il doit y avoir un moyen de le faire, n'est-ce pas? Mais comment?Comment puis-je ajouter un champ à un formulaire dans une légende CRM?

Edit: Extrait de code:


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; 
    }

Une autre edit: je viens d'essayer cette idée, que j'ai trouvé en ligne et qui provoque en fait une erreur de serveur CRM lors de l'enregistrement:



      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(); 
+0

Pouvez-vous envoyer votre code? C'est absolument possible, mais il est difficile de voir ce que vous pourriez faire de mal sans un exemple. – Matt

+0

Eh bien, je ne sais pas si je fais quelque chose de mal, même si je ne sais pas comment le faire en premier lieu, mais je vais mettre à jour ma question avec l'extrait de code approprié en une seconde. – extarbags

Répondre

1

J'utilise cette classe pour travailler witn entité xml callout

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; 
    } 

} 

}