none
Subgrid con más de un campo en común en formulario de entidad de CRM 2011 RRS feed

  • Pregunta

  • Hola, estoy creando un subgrid con el fin de mostrar registros relacionados con una entidad principal y además acceder al formulario para crear registros. Me explico:

    Tengo una entidad principal A y otra entidad B que tiene en común 3 campos con la entidad A, al darle al botón de agregar nueva entidad B me abre el formulario principal de esta y quiero que me rellene automáticamente esos 3 campos en común.

    Esto mismo lo tengo en otras entidades pero que tenían únicamente un campo en común, con lo que al darle al botón automáticamente me rellenaba el valor debido a que estaban relacionados los campos.

     

    En mi nuevo escenario he tenido que crearme un campo de enlace entre ambas entidades y en el evento on load del formulario de la entidad B cargar con Jscript los valores correspondientes. Lo he conseguido pero me gustaría saber si habría alguna manera más sencilla de hacerlo (o que fuera automática como si estuviera únicamente un campo relacionado).

     

    Muchas gracias por vuestra atención.

    jueves, 2 de junio de 2011 17:07

Respuestas

  • Claro que si es posible estimado,

    Te recomendaría que revises en la relación creada de 1 a muchos entre la entidad principal (A) y la entidad relacionada (B).

    Hay una opción llamada asignaciones en la barra de navecgación de la izquierda, en ella vas a poder crear los mapping entre el campo de origen proveniente de la entidad Principal, y el campo destino proveniente de la entidad Relacionada.

    Hay algunas consideraciones que hay que tener cuando definimos los mapeos entre campos, alguna de estas son: 

    Los campos de origen y destino deben de tener el mismo tipo de dato, y la longitud del campo de destino debe de ser igual o mayor que la del campo de origen.

    Espero haberte ayudado.


    [MVP]-Microsoft Dynamics CRM | My blog: http://jimmylarrauri.blogspot.com | My twitter: http://twitter.com/jimlarrauri
    jueves, 2 de junio de 2011 18:43
    Moderador

Todas las respuestas

  • Claro que si es posible estimado,

    Te recomendaría que revises en la relación creada de 1 a muchos entre la entidad principal (A) y la entidad relacionada (B).

    Hay una opción llamada asignaciones en la barra de navecgación de la izquierda, en ella vas a poder crear los mapping entre el campo de origen proveniente de la entidad Principal, y el campo destino proveniente de la entidad Relacionada.

    Hay algunas consideraciones que hay que tener cuando definimos los mapeos entre campos, alguna de estas son: 

    Los campos de origen y destino deben de tener el mismo tipo de dato, y la longitud del campo de destino debe de ser igual o mayor que la del campo de origen.

    Espero haberte ayudado.


    [MVP]-Microsoft Dynamics CRM | My blog: http://jimmylarrauri.blogspot.com | My twitter: http://twitter.com/jimlarrauri
    jueves, 2 de junio de 2011 18:43
    Moderador
  • Muchas gracias por tu respuesta Jimmy, la verdad es que hoy al llegar a la oficina me puse a trastear con las asignaciones y lo conseguí a la primera (quizás el cansancio de anoche no me dejaba pensar bien). 

     

    El problema que tenía era que los campos de origen eran lookups y los de destino no, con lo que al hacer las asignaciones me estaba haciendo un lío.

     

    Saludos y gracias de nuevo.

    viernes, 3 de junio de 2011 6:34
  • Hola, estoy creando un subgrid con el fin de mostrar registros relacionados con una entidad principal y además acceder al formulario para crear registros. Me explico:

    Tengo una entidad principal A y otra entidad B que tiene en común 3 campos con la entidad A, al darle al botón de agregar nueva entidad B me abre el formulario principal de esta y quiero que me rellene automáticamente esos 3 campos en común.

    Esto mismo lo tengo en otras entidades pero que tenían únicamente un campo en común, con lo que al darle al botón automáticamente me rellenaba el valor debido a que estaban relacionados los campos.

     

    En mi nuevo escenario he tenido que crearme un campo de enlace entre ambas entidades y en el evento on load del formulario de la entidad B cargar con Jscript los valores correspondientes. Lo he conseguido pero me gustaría saber si habría alguna manera más sencilla de hacerlo (o que fuera automática como si estuviera únicamente un campo relacionado).

     

    Muchas gracias por vuestra atención.


    Hola tengo una pregunta yo quierio hacer es lo siguiente tengo la entidad A que es la que contiene los datos de la persona como nombre, telefono, correo y quiesiera que cuando en la entidad B abra el formulario y selecciones a la persona quisiera que me trajera la informacion de estos campos nombre, telefono y correo a este formulario intete hacerlo por un flujo de trabajo pero no me trae la informacion he estado buscando a ver si lo puedo hacer en javascrip, pero nada si alquien pudiera darme una sugerecia, idea, recomendacion con gusto
    miércoles, 20 de julio de 2011 19:29
  • Hola, estoy creando un subgrid con el fin de mostrar registros relacionados con una entidad principal y además acceder al formulario para crear registros. Me explico:

    Tengo una entidad principal A y otra entidad B que tiene en común 3 campos con la entidad A, al darle al botón de agregar nueva entidad B me abre el formulario principal de esta y quiero que me rellene automáticamente esos 3 campos en común.

    Esto mismo lo tengo en otras entidades pero que tenían únicamente un campo en común, con lo que al darle al botón automáticamente me rellenaba el valor debido a que estaban relacionados los campos.

     

    En mi nuevo escenario he tenido que crearme un campo de enlace entre ambas entidades y en el evento on load del formulario de la entidad B cargar con Jscript los valores correspondientes. Lo he conseguido pero me gustaría saber si habría alguna manera más sencilla de hacerlo (o que fuera automática como si estuviera únicamente un campo relacionado).

     

    Muchas gracias por vuestra atención.


    Hola tengo una pregunta yo quierio hacer es lo siguiente tengo la entidad A que es la que contiene los datos de la persona como nombre, telefono, correo y quiesiera que cuando en la entidad B abra el formulario y selecciones a la persona quisiera que me trajera la informacion de estos campos nombre, telefono y correo a este formulario intete hacerlo por un flujo de trabajo pero no me trae la informacion he estado buscando a ver si lo puedo hacer en javascrip, pero nada si alquien pudiera darme una sugerecia, idea, recomendacion con gusto

    Hola, yo tampoco controlo mucho de crm pero eso es algo que estoy haciendo en mi proyecto con javascript y jquery basándome en el siguiente enlace del msdn: http://msdn.microsoft.com/en-us/library/gg309549.aspx y algún que otro blog que ahora mismo no me acuerdo donde lo vi.

    La idea es crear una función en la que le puedes pasar el código de la persona y campos que actualizarás (si lo vas a utilizar en más formularios, si no podrías hacerla sin pasar los parámetros). Un esquema podría ser:

     

     

    function f_ObtenerDatos(v_campodestino, v_persona) {
      if ((v_campodestino != null) && (v_persona != null) && (Xrm.Page.getAttribute(v_campodestino) != null)) {
       var context = Xrm.Page.context;
       var serverUrl = context.getServerUrl();
       var ODataPath = "/XRMServices/2011/OrganizationData.svc";
       var oDataUri = serverUrl + ODataPath + "/EntidadA()";
       oDataUri += "?$filter=PersonaId eq guid'" + v_persona[0].id + "'";
    
       //Se obtiene el registro correspondiente a la persona
       $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: oDataUri,
        beforeSend: function (XMLHttpRequest) {
         XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
         var Entidades = data.d.results;
    
         //Aquí se harían las asignaciones
         Xrm.Page.getAttribute(v_campodestino).setValue = Entidades[0].campoaasignar;
        }
       })
      }
    }
    

     

    Luego, en el formulario añadirías la biblioteca jquery y json2 que aparecen en el msdn y debajo de ellas la biblioteca que contenga tu función. En el evento onchange del campo de la persona indicar la función f_ObtenerDatos y en la lista de parámetros: "nombrecampodestino",Xrm.Page.getAttribute("persona").getValue()

    Como comenté un poco más arriba, no hace falta utilizar los parámetros, se puede acceder a los campos directamente con Xrm.Page

     

    Espero que esta idea pueda ayudarte.

    jueves, 21 de julio de 2011 10:09
  • Ok gracias lo pruebo y te comentos a ver como me fue...
    Jrokita
    • Propuesto como respuesta Jrokita jueves, 6 de octubre de 2011 16:19
    • Votado como útil Jrokita jueves, 6 de octubre de 2011 16:20
    jueves, 21 de julio de 2011 13:55
  • esta repuesta me la enviaron por este foro un Chico llamado Julio en otra pregunta q realize de como llamar un campo en otro formulario 

    Usted no puede votar una vez más

    Puedes hacer lo sigiente:

    1. Desarrollar 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_buscar1]' />"+
        "<attribute name='[atributo_a_buscar2]' />"+
        "<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 telefono= "";
     var correo= "";
        for (i=0;i < results.length;i++)
        {
      if(results[i].selectSingleNode('./[atributo_a_buscar]') != null) 
       telefono= results[i].selectSingleNode('./[atributo_a_buscar1]').nodeTypedValue;
      if(results[i].selectSingleNode('./[atributo_a_buscar]') != null) 
       correo = results[i].selectSingleNode('./[atributo_a_buscar2]').nodeTypedValue;
        }

    Al final pudieras crear una funcion similar a esta:

    function ObtenerDatos(){
     var lookupitem = new Array;
     lookupitem = Xrm.Page.getAttribute('customerid').getValue();
     if(lookupitem!=null){
    var FXML ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"+
     "<entity name='[mi_entidad]'>"+
        "<attribute name='[atributo_a_buscar1]' />"+
        "<attribute name='[atributo_a_buscar2]' />"+
        "<filter type='and'>"+
        "  <condition attribute='[atributo_parametro_de_busqueda]' operator='eq' value='" + [valor_para_buscar]+ "' />"+
        "</filter>"+
     "</entity>"+
     "</fetch>";
     var XmlDoc = Fetch(FXML);
     var results = XmlDoc.getElementsByTagName('result');  
     var telefono= "";
     var correo= "";
        for (i=0;i < results.length;i++)
        {
      if(results[i].selectSingleNode('./[atributo_a_buscar1]') != null) 
       telefono= results[i].selectSingleNode('./[atributo_a_buscar1]').nodeTypedValue;
      if(results[i].selectSingleNode('./[atributo_a_buscar2]') != null) 
       correo = results[i].selectSingleNode('./[atributo_a_buscar2]').nodeTypedValue;
        }
     Xrm.Page.getAttribute('[tu_nuevo_campo_telefono]').setValue(telefono);
     Xrm.Page.getAttribute('[tu_nuevo_campo_correo]').setValue(correo);
    }
    }

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

     

     


    Jrokita
    jueves, 6 de octubre de 2011 16:23