none
Mostrar datos de una entidad que se encuentran en otra entidad CRM 2011 RRS feed

  • Pregunta

  • Hola, estoy trabajando en CRM 2011, tengo una entidad que se llama carreras, donde estoy poniendo el nombre de la carrera y un campo picklist con el nivel de academico de la carrera, y en la entidad de cliente potencial tengo un campo de tipo lookup, donde se debe indicar la carrera de ese cliente potencial.

    Desde la entidad de cliente potencial yo necesito seleccionar la carrera del cliente potencial por medio del campo lookup, pero adicionalmente al seleccionar la carrera necesito ver cual es el nivel academico de la carrera seleccionada, para esto estuve investigando, lo estoy haciendo por medio de javaScript, en donde lo que quiero lograr es seleccionar la carrera y en una variable almacenar este nivel academico, adjuntó el código que encontre, que me pareció me podia servir pero no me esta funcionando, por favor si me pudieran brindar su ayuda.

     

    function mostrar_campos()
    {
     // Check to confirm that the window.opener is present.
     if (window.opener)
     {
      // Get the values of the parent form.
      var oParentCrmForm = window.top.opener.parent.all.crmForm;
       
      // Check that you obtained the values of the parent form and
      // that the parent form is an carrera.
      if (oParentCrmForm && oParentCrmForm.ObjectTypeCode == 1)
      {
       // Obtiene el nivel academico de la carrera seleccionada

       var nivel = oParentCrmForm.all.new_nivel_academico.getValue();
    alert(nivel);
         }
     }
    }

     

    Gracias de antemano.


    jueves, 21 de julio de 2011 21:52

Respuestas

  • Hola Lucia,

    Cuando yo quiero traer información desde una entidad a otra en CRM 2011 hago lo siguiente:

    1. Desarrollo un fectch xml para realizar la consulta. Te puedes apoyar en la nueva funcionalidad de CRM 2011 el cual te genera el fetch desde una búsqueda avanzada.

    2. una vez desarrollado el fetch lo asigno a una variable:

    ejem:
    var FXML ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"+
     "<entity name='[mi_entidad]'>"+
        "<attribute name='[atributo_a_buscar]' />"+
        "<filter type='and'>"+
        "  <condition attribute='[atributo_parametro_de_busqueda]' operator='eq' value='" + [valor_para_buscar]+ "' />"+
        "</filter>"+
     "</entity>"+
     "</fetch>";

    3.una vez que tengo el fetch en una variable, coloco el siguiente código:

    var XmlDoc = Fetch(FXML);
     var results = XmlDoc.getElementsByTagName('result');  
     var cod = "";
        for (i=0;i < results.length;i++)
        {
      if(results[i].selectSingleNode('./[atributo_a_buscar]') != null)
       cod = results[i].selectSingleNode('./[atributo_a_buscar]').nodeTypedValue;
        }

    4. Copiar las siguientes funciones:

    function Fetch(xml)
    {
     var Xml = "<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\">"
     Xml += GenerateAuthenticationHeader()
     Xml += "<soap:Body>";
     Xml += "<Fetch xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">";
     Xml += "<fetchXml>";
     Xml += FetchEncode(xml); // Microsoft _HtmlEncode function 
     Xml += "</fetchXml>";
     Xml += "</Fetch>";
     Xml += "</soap:Body>";
     Xml += "</soap:Envelope>";

     var XmlHttp = CreateXmlHttpObject(); // Microsot CreateXmlHttp function 
     XmlHttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false); //Sync Request 
     XmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
     XmlHttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
     XmlHttp.send(Xml);

     var XmlDoc = new ActiveXObject("Msxml2.DOMDocument");
     XmlDoc.async = false;
     XmlDoc.resolveExternals = false;                   
     XmlDoc.loadXML(XmlHttp.responseXML.text);
     return XmlDoc;

    }

    function CreateXmlHttpObject() //CreateXmlHttp 
    {
     var oXmlHttp = null;
     if (window.XMLHttpRequest) {
      oXmlHttp = new XMLHttpRequest();
     }
     else {
       var arrProgIds = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
       for (var iCount = 0; iCount < arrProgIds.length; iCount++) {
        try {
         oXmlHttp = new ActiveXObject(arrProgIds[iCount]);
         break;
        }
        catch (e) { }
       }
     }
     return oXmlHttp;
    }

    function FetchEncode(strInput) //_HtmlEncode 
    {
     var c;
     var HtmlEncode = '';
     if (strInput == null) {
       return null;
     }
     if (strInput == '') {
       return '';
     }
     for (var cnt = 0; cnt < strInput.length; cnt++) {
       c = strInput.charCodeAt(cnt);
       if (((c > 96) && (c < 123)) ||
      ((c > 64) && (c < 91)) ||
      (c == 32) ||
      ((c > 47) && (c < 58)) ||
      (c == 46) ||
      (c == 44) ||
      (c == 45) ||
      (c == 95)) {
        HtmlEncode = HtmlEncode + String.fromCharCode(c);
       }
       else {
        HtmlEncode = HtmlEncode + '&#' + c + ';';
      }
     }

     return HtmlEncode;
    }

     

     

    Espero que esto te pueda ayudar, cualquier duda házmela saber. Éxitos.


    Julio
    viernes, 22 de julio de 2011 21:15

Todas las respuestas

  • Buenas, varias cosas:

    - llegas a cliente potencial (donde segun entiendo, quieres llevar el valor del nivel academico  una vez seleccionada la carrera) desde la entidad carrera? Acceder a la parentform te lleva al registro de la entidad hija (en este caso, podrias acceder a los datos de carrera desde cliente potencial).

    - Si los clientes potenciales los creas desde la carrera, podrias intentar crear un mapping. asi conseguirias ambos campos, tanto la carrera como el nivel academico asociado.

    - estas usando el esquema de javascript para CRM 4.0. El de 2011 es ligeramente distinto.

    Saludos

    viernes, 22 de julio de 2011 8:04
  • Hola, es correcto desde la entidad de cliente potencial, se desea seleccionar la carrera desde un campo tipo lookup, y segun esa dato obtener el nivel academico del cliente potencial, pero ese dato no lo deseo visualizar dentro de la entidad de cliente potencial, lo deseo almacenar en una variable y según ese dato realizar unas validaciones dentro de esta entidad, como puedo obtener este dato?

    viernes, 22 de julio de 2011 20:18
  • Hola Lucia,

    Cuando yo quiero traer información desde una entidad a otra en CRM 2011 hago lo siguiente:

    1. Desarrollo un fectch xml para realizar la consulta. Te puedes apoyar en la nueva funcionalidad de CRM 2011 el cual te genera el fetch desde una búsqueda avanzada.

    2. una vez desarrollado el fetch lo asigno a una variable:

    ejem:
    var FXML ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"+
     "<entity name='[mi_entidad]'>"+
        "<attribute name='[atributo_a_buscar]' />"+
        "<filter type='and'>"+
        "  <condition attribute='[atributo_parametro_de_busqueda]' operator='eq' value='" + [valor_para_buscar]+ "' />"+
        "</filter>"+
     "</entity>"+
     "</fetch>";

    3.una vez que tengo el fetch en una variable, coloco el siguiente código:

    var XmlDoc = Fetch(FXML);
     var results = XmlDoc.getElementsByTagName('result');  
     var cod = "";
        for (i=0;i < results.length;i++)
        {
      if(results[i].selectSingleNode('./[atributo_a_buscar]') != null)
       cod = results[i].selectSingleNode('./[atributo_a_buscar]').nodeTypedValue;
        }

    4. Copiar las siguientes funciones:

    function Fetch(xml)
    {
     var Xml = "<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\">"
     Xml += GenerateAuthenticationHeader()
     Xml += "<soap:Body>";
     Xml += "<Fetch xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">";
     Xml += "<fetchXml>";
     Xml += FetchEncode(xml); // Microsoft _HtmlEncode function 
     Xml += "</fetchXml>";
     Xml += "</Fetch>";
     Xml += "</soap:Body>";
     Xml += "</soap:Envelope>";

     var XmlHttp = CreateXmlHttpObject(); // Microsot CreateXmlHttp function 
     XmlHttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false); //Sync Request 
     XmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
     XmlHttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
     XmlHttp.send(Xml);

     var XmlDoc = new ActiveXObject("Msxml2.DOMDocument");
     XmlDoc.async = false;
     XmlDoc.resolveExternals = false;                   
     XmlDoc.loadXML(XmlHttp.responseXML.text);
     return XmlDoc;

    }

    function CreateXmlHttpObject() //CreateXmlHttp 
    {
     var oXmlHttp = null;
     if (window.XMLHttpRequest) {
      oXmlHttp = new XMLHttpRequest();
     }
     else {
       var arrProgIds = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
       for (var iCount = 0; iCount < arrProgIds.length; iCount++) {
        try {
         oXmlHttp = new ActiveXObject(arrProgIds[iCount]);
         break;
        }
        catch (e) { }
       }
     }
     return oXmlHttp;
    }

    function FetchEncode(strInput) //_HtmlEncode 
    {
     var c;
     var HtmlEncode = '';
     if (strInput == null) {
       return null;
     }
     if (strInput == '') {
       return '';
     }
     for (var cnt = 0; cnt < strInput.length; cnt++) {
       c = strInput.charCodeAt(cnt);
       if (((c > 96) && (c < 123)) ||
      ((c > 64) && (c < 91)) ||
      (c == 32) ||
      ((c > 47) && (c < 58)) ||
      (c == 46) ||
      (c == 44) ||
      (c == 45) ||
      (c == 95)) {
        HtmlEncode = HtmlEncode + String.fromCharCode(c);
       }
       else {
        HtmlEncode = HtmlEncode + '&#' + c + ';';
      }
     }

     return HtmlEncode;
    }

     

     

    Espero que esto te pueda ayudar, cualquier duda házmela saber. Éxitos.


    Julio
    viernes, 22 de julio de 2011 21:15
  • Hola, muchas gracias por tu ayuda, la única duda que tengo por el momento sería, esa variable a la que le asignó el fetch, el codigo y las funciones donde introduzco eso, sería en el evento OnLoad del formulario o en otro evento.

     

    Gracias de antemano.

    viernes, 22 de julio de 2011 23:09
  • Hola Lucía,

    Resolviendo un poco tus dudas:

    El motivo por el cual se crea una variable es para asignarle el fetch creado y poder pasarselo como parámetro a la funcion "Fetch" : Fetch(FXML);

    Con respecto al código en general deberías colocarlo como parte de un solo Recurso Web YYY, es decir tendrías las siguientes funciones en total:
    * function Fetch
    * function CreateXmlHttpObject
    * function FetchEncode
    * y una funcion: XXX donde coloques los pasos 2 y 3 (Recuerda que para el paso 2 necesitas el valor de [valor_para_buscar] el cual lo debes obtener anteriormente).

    En el evento OnLoad debes agregar a la biblioteca tu recurso web YYY y debes invocar a la función XXX.

    Cualquier otra duda que tengas nos las haces saber que gustososamente te ayudaremos.


    Julio
    sábado, 23 de julio de 2011 23:09
  • Buenas,

    No se que tipo de validaciones necesitas, pero has considerado lanzar un workflow en el onchange del campo lookup?

    O un plugin en el create/update del nuevo registro de esa entidad, sobre ese campo?

    lunes, 25 de julio de 2011 7:03
  • Buenas,

    No se que tipo de validaciones necesitas, pero has considerado lanzar un workflow en el onchange del campo lookup?

    O un plugin en el create/update del nuevo registro de esa entidad, sobre ese campo?


    No creo que el workflow sea una buena opción por los siguientes motivos:
    * EL workflow puede demorarse en disparar.
    * Si lo realizas mediante workflow, tienes que volver a refrescar el formulario para apreciar los cambios
    * Imagina que hayas seleccionado un valor  en el campo lookup (Carrera) de la entidad cliente potencial que no sea el correcto, debes vover a seleccionar otro valor, entonces el workflow se tendría que ejecutar más de una vez.
    Julio
    lunes, 25 de julio de 2011 13:51
  • Muchas gracias por la ayuda por parte de los 2, pero es correcto Julio no creo que un workflow sea una buena opción, por lo tanto me pondre a trabajar en los datos que me brindaste para poder visualizar esta información, y te estaré comentando como me fue.

     

    Gracias.

    martes, 26 de julio de 2011 15:42
  • Hola Julio, estoy teniendo algunos problemas con el Fetch, con ese campo [valor_para_buscar]  a que te refieres?

    Tengo entendido que estoy hiria asi:

    var FXML ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"+
     "<entity name='[new_carreras]'>"+
        "<attribute name='[new_nivel_academico]' />"+
        "<filter type='and'>"+
        "  <condition attribute='[atributo_parametro_de_busqueda]' operator='eq' value='" + [valor_para_buscar]+ "' />"+
        "</filter>"+
     "</entity>"+
     "</fetch>";

    3.una vez que tengo el fetch en una variable, coloco el siguiente código:

    var XmlDoc = Fetch(FXML);
     var results = XmlDoc.getElementsByTagName('result');  
     var cod = "";
        for (i=0;i < results.length;i++)
        {
      if(results[i].selectSingleNode('./[new_nivel_academico]') != null)
       cod = results[i].selectSingleNode('./[new_nivel_academico]').nodeTypedValue;
        }

     

    yo tengo la entidad de carreras la cual tiene el nombre de la carrera y el campo de nivel academico, y tengo la entidad de cliente potencial, donde debo seleccionar por un campo de busquedad la carrera y de alguna manera nenesito saber cual es el nivel academico de la carrera seleccionada, en el campo [atributo_parametro_de_busqueda] sería el detalle del campo de busquedad de la carrera seleccionada de la entidad de cliente potencial? y el campo [valor_para_buscar] que datos sería, te agradecería tu ayuda.

     

    Muchas Gracias.

    jueves, 11 de agosto de 2011 16:14
  • Hola Lucia,

     [atributo_parametro_de_busqueda] sería el campo por el cual vas a buscar y 

    [valor_para_buscar] sería el valor del campo.

    Sería un simil a la instrucción de un WHERE de SQL:

    where [atributo_parametro_de_busqueda] [valor_para_buscar]

    Un ejemplo podría ser:

     "  <condition attribute='accountid' operator='eq' value='" +'5BCD3644-CDCD-DDDD-AD58-005056906B89'+ "' />"+

    En este caso accountid es el [atributo_parametro_de_busqueda] 5BCD3644-CDCD-DDDD-AD58-005056906B89 es el [valor_para_buscar]  :

    Otro punto a comentar es que no deberías usar [ ni ], sólo es como referencia.

     


    Julio
    jueves, 11 de agosto de 2011 16:55
  • Hola Julio, gracias por tu respuesta, te adjuntó el código para ver si ya todo esta bien:

     

    function traerdatos()
    {

    var lookupItem = new Array;

    lookupItem = Xrm.Page.getAttribute("new_carrera_interes_1").getValue();
    var carrera = lookupItem[0].id;


    var FXML ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"+
     "<entity name='new_carreras'>"+
        "<attribute name='new_nivel_academico' />"+
        "<filter type='and'>"+
        "  <condition attribute='new_carrera_interes_1' operator='eq' value='" + carrera+ "' />"+
        "</filter>"+
     "</entity>"+
     "</fetch>";


    var XmlDoc = Fetch(FXML);
    var results = XmlDoc.getElementsByTagName('result');  
    var cod = "";
        for (i=0;i < results.length;i++)
        {
      if(results[i].selectSingleNode('./new_nivel_academico') != null)
       cod = results[i].selectSingleNode('./new_nivel_acedemico').nodeTypedValue;
        }
    }

    te comento un poco, esto:

    lookupItem = Xrm.Page.getAttribute("new_carrera_interes_1").getValue();
    var carrera = lookupItem[0].id;

    lo pongo para obtener el valor de la carrera, después este dato "<attribute name='new_nivel_academico' />"+ , ese campo new_nivel_academico viene de la entidad carreras que sería el dato que necesito jalar, y esto sería  "  <condition attribute='new_carrera_interes_1' operator='eq' value='" + carrera+ "' />"+, en este caso 'new_carrera_interes_1' es el campo de busuedad de la entidad cliente potencial y carrera es la variable a la que le asigne el valor, y después esta dos líneas:

     if(results[i].selectSingleNode('./new_nivel_academico') != null)
       cod = results[i].selectSingleNode('./new_nivel_acedemico').nodeTypedValue;
    el campo new_nivel_academico es el campo de la entidad carreras que deseo jalar, me parece q todo esta bien, por favor si me puedes indicar, el siguiente paso sería como hago para obtener el dato que estoy jalando donde lo puedo visualizar, cual de estas variables obtiene ese dato?


    De antemano gracias por tu ayuda.

     

    Lucia F.

    jueves, 11 de agosto de 2011 18:12
  • Hola Julio, ya me funcionó, muchisimas gracias por el apoyo, excelente tu ayuda, el problema que tenia era en el fectch xml.

     

    Lucia F.

    jueves, 11 de agosto de 2011 21:12
  • Hola.

    tengo una situacioon muy similar a la de Lucia.

    en mi caso necesito filtrar datos de una entidad llamada Requisitos, mediante un campo llamado linea de poliza de la entidad oportuniad_linea_poliza, en otras palabras necesito filtrar los requisitos que tiene cada linea de poliza.

    ya tengo hecho el fetch pero quiero saber si es posible visualizar los resultados obtenidos en un subgrid, y la pregunta la hago, ya que el subgrid, si no me equivoco, no soporta la propiedad addCustomView.

     

    function filtrarRequisitos(){

            var idProd = new Array();
            idProd = Xrm.Page.getAttribute("psi_oportunidadlineapoliza").getValue();
            var idProducto = idProd[0].id;  
      
            var viewId = "{65EC9B46-EE81-4F89-BAF6-E8603FF9E1E4}";
            var entityName = "psi_requisitolineapoliza";
            var viewDisplayName = "Requisitos Linea Poliza";
            var viewIsDefault = true;
            var fetchXml = 
                  "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
                  "<entity name='psi_requisitolineapoliza'>" +             
                  "<attribute name='psi_requisitoid' />" +            
                  "<order attribute='psi_requisitoid' descending='false' />" +
                  "<filter type='and'>" +
                  "<condition attribute='psi_oportunidadlineapoliza' operator='eq' value='" + idProducto+ "' />" +
                  "</filter>" +
                  "</entity>" +
                  "</fetch>";
        
         var XmlDoc = Fetch(fetchXml);
                  var results = XmlDoc.getElementsByTagName('result');  
                  var cod = "";
         for (i=0;i < results.length;i++)
         {
       if(results[i].selectSingleNode('./psi_requisitoid') != null)
       cod = results[i].selectSingleNode('./psi_requisitoid').nodeTypedValue;
         }
     }

    agradezco la ayuda..

     

    miércoles, 14 de diciembre de 2011 16:11
  • Excelente, muchas gracias!!!
    jueves, 22 de noviembre de 2012 1:31
  • Hola Lucia,

     [atributo_parametro_de_busqueda] sería el campo por el cual vas a buscar y 

    [valor_para_buscar] sería el valor del campo.

    Sería un simil a la instrucción de un WHERE de SQL:

    where [atributo_parametro_de_busqueda] [valor_para_buscar]

    Un ejemplo podría ser:

     "  <condition attribute='accountid' operator='eq' value='" +'5BCD3644-CDCD-DDDD-AD58-005056906B89'+ "' />"+

    En este caso accountid es el [atributo_parametro_de_busqueda] 5BCD3644-CDCD-DDDD-AD58-005056906B89 es el [valor_para_buscar]  :

    Otro punto a comentar es que no deberías usar [ ni ], sólo es como referencia.

     


    Julio

    Hola Julio, una pregunta... me funcionaba excelente el script pero a partir del update de la semana pasada ya no funciona... alguien tiene algún detalle?!
    miércoles, 16 de enero de 2013 1:19
  • Hola Elda, el nuevo Rollup 12 (UR12) incluye modificaciones (especialmente en el JavaScript) para el tema de multinavegadores. Es por eso que muchos javascripts (no soportados como estos) que antes funcionaban, ahora dejan de hacerlo.

    Para esto te recomiendo que leas las buenas prácticas de desarrollo en JavaScript que se incluyen en la nueva versión de la SDK en este artículo: http://msdn.microsoft.com/en-us/library/hh771584.aspx (la versión 5.0.13 puedez descargarla de aquí: http://www.microsoft.com/en-us/download/details.aspx?id=24004)

    Allí por ejemplo recomiendan utilizar librerías multinavegadores, como jQuery.

    Además te recomiendo que pases todo tu código JavaScript por el "Microsoft Dynamics CRM 2011 Custom Code Validation Tool" (http://www.microsoft.com/en-us/download/details.aspx?id=30151) que te detecta que partes de tu código dejan de ser compatible en Dynamics CRM y deberías modificar.

    espero que te sirva,

    un saludo,


    Demian Adolfo Raschkovan Blog: http://crmtoall.blogspot.com If this post answers your question, please click "Mark As Answer" on the post and "Mark as Helpful"

    miércoles, 16 de enero de 2013 7:50
    Moderador
  • Gracias Demian, voy a revisar esto que mencionas!!!

    Un saludo...

    miércoles, 16 de enero de 2013 17:00
  • Hola Tengo un caso parecido, tengo que acumular el valor total de las facturas en otra entidad
    lunes, 22 de abril de 2013 19:27