none
Obtener el GUID de un registro usando XrmServiceContext RRS feed

  • Pregunta

  • Hola, estoy desarrollando un programa en c# para poder dar de alta cuentas en el CRM 2011, he generado el fichero Context con la utilidad crmsvcutil.exe y me va todo estupendo, la unica cuestión es que tengo campos Lookup que son referenciados a otras entidades y en el campo de la entidad Cuenta tengo que poner el valor GUID del registro que quiero de la otra entidad. Como puedo obtener el GUID de un registro de otra entidad? puedo hacerlo con el XrmServiceContext? Os pongo el inicio del codigo que tengo:

    string sCadena = "Url=http://servidor:port/Organizacion; Domain=dominio; Username=Administrador; Password=pass";
    ConnectionStringSettings oConnectionSS = new ConnectionStringSettings("Xrm", sCadena);
    var xrm = new XrmServiceContext(new CrmConnection(oConnectionSS));

    var oCuenta = new Xrm.Account();
    oCuenta.AccountNumber = sCuenta;
    oCuenta.Name = sNombre;

    xrm.AddObject(oCuenta);
    xrm.SaveChanges();

    Os agradeceria vuestra ayuda, gracias.

    miércoles, 8 de junio de 2011 16:37

Respuestas

  • Ok.

    Lo que debe suceder ahí es que no te está retornando ningun registro. Por ello el error al querer traer el .First().

    Me da la impresión que el where es lo que deberías ajustar.

    Puedes probar haciendo algo del estilo: where contact.lastname.StartsWith("A") // o alguna otra letra . El objetivo es que hagas la consulta tipada y además que seguro tenga que devolverte registros.

    A partir de ahi seguro vas a poder resolverlo.

     

    Aguardo tus comentarios. Espero te vaya bien con esta prueba, saludos.

    PP


    Microsoft MVP Dynamics CRM | My Twitter: http://twitter.com/pabloperalta | My blog: http://weblogs.asp.net/pabloperalta | Blog en Español: http://wwww.elblogdedynamicscrm.com
    viernes, 10 de junio de 2011 12:33

Todas las respuestas

  • Hola caromu,

    Yo generalmente asigno directamente la entidad y creo una clase estatica, por ejemplo XrmHelpers.cs que busque por algún campo la entidad y la retorne. Por ejemplo, para la moneda de una cuenta, busco por el ISO code y devuelvo la entidad como tal.

    Te pego un ejemplo a continuacion:

     

            public static transactioncurrency GetCurrencyByISOCode(string isocurrencycode)
            {
                transactioncurrency currencyToReturn = null;

                var crm = new MyDataContextDataContext(crmConnectionString);

                var returnedCurrencies = crm.transactioncurrencytransactioncurrencies.Where(t => t.isocurrencycode == isocurrencycode);
                if (returnedCurrencies != null && returnedCurrencies.Count() > 0)
                    currencyToReturn = returnedCurrencies.First();

                return currencyToReturn;
            }

    Espero te sirva, me avisas si puedo ayudarte con algun otro ejemplo,

    saludos

    PP


    Microsoft MVP Dynamics CRM | My Twitter: http://twitter.com/pabloperalta | My blog: http://weblogs.asp.net/pabloperalta | Blog en Español: http://wwww.elblogdedynamicscrm.com
    miércoles, 8 de junio de 2011 18:04
  • Buenas Pablo nuevamente, he puesto lo que me has dicho y aparentemente se compila bien, pero no se porque cuando lo ejecuto y llega a la linea de comprobacion del if( returnedCurrencies != null && returnedCurrencies.Count() > 0), me dice que el metodo .Count() no es soportado. No se por donde va esto, lo he depurado pero no entiendo que pasa, a ver si me puedes indicar por donde va la cosa.

    Gracias.

    jueves, 9 de junio de 2011 11:03
  • Buenas caromu,

    La verdad es extraño. A mi eso me funciona bien pero lo tengo hecho para CRM 4.0.

    Te sugiero que quizá ahora quites eso y veas si realmente te devuelve la transactioncurrency.

    Quizás es un cambio en el modelo de 2011. Prueba a ver si te devuelve la entidad y la puedes asociar.

     

    Me avisas como te fue, saludos.

    PP


    Microsoft MVP Dynamics CRM | My Twitter: http://twitter.com/pabloperalta | My blog: http://weblogs.asp.net/pabloperalta | Blog en Español: http://wwww.elblogdedynamicscrm.com
    jueves, 9 de junio de 2011 13:40
  • Hola Pablo, yo creo que es algún cambio de versión lo que pasa es que para mi esto no se como corregirlo.

    Yo hago lo siguiente:

    if (iTipoID != 0)
    {
       var returnedTipoid = xrm.new_tipoidentificacionSet.Where(t => t.new_Codigo == iTipoID);
       if (returnedTipoid != null && returnedTipoid .Count() > 0)
       {
           var regTipoId = new Xrm.new_tipoidentificacion();
           regTipoId = returnedTipoid.First();
           oCuenta.new_TipoId = new CrmEntityReference(regTipoId.LogicalName, regTipoId.Id);
       }
    }

    Tengo un campo Lookup en la entidad cuenta que es TipoID que esta relacionado con una entidad llama tipo identificacion (new_tipoidentificacion), aqui como ves si la propiedad de la clase tiene un valor <> 0 hago lo que tu me has dicho, la consulta se ejecuta sin problemas (var returnedTipoid = xrm.new_tipoidentificacionSet.Where(t => t.new_Codigo == iTipoID) ) y el elemento se presenta en memoria asi:

    -returnedTipoid
     +ElementType       = {Name = "new_tipoidentificacion" FullName = "Xrm.new_tipoidentificacion"}
       EntityLogicalName = null
     +Expression           = {value(Microsoft.Xrm.Sdk.Linq.Query`1[Xrm.new_tipoidentificacion]).Where(t => (t.new_Codigo == Convert(value(SBnet.CRM2011.Plugin.CRMCuenta).iTipoID)))}

                                      System.Linq.Expressions.Expression {System.Linq.Expressions.MethodCallExpressionN}

     +Provider          = {Microsoft.Xrm.Sdk.Linq.QueryProvider} System.Linq.IQueryProvider {Microsoft.Xrm.Sdk.Linq.QueryProvider}

    Esto es lo que veo en memoria, a ver si tu me puedes guiar, lo he probado tambien sobre la entidad Contactos buscando el valor de un contacto y el resultado es el mismo. Dime si se te ocurre que puedo hacer.

    Gracias.

    jueves, 9 de junio de 2011 14:22
  • Ok, ahora el que no entiende el problema soy yo :p). Te pido disculpas.

    Lo que intentaba sugerirte en mi respuesta anterior era quitarle el '&& returnedTipoid .Count() > 0' para que de esa forma evites el error.

    Dime si esto te ayuda o sino te pido si es posible me ayudes un poco mas a entender donde exactamente tienes el problema para sugerirte mejor.

    saludos!

    PP


    Microsoft MVP Dynamics CRM | My Twitter: http://twitter.com/pabloperalta | My blog: http://weblogs.asp.net/pabloperalta | Blog en Español: http://wwww.elblogdedynamicscrm.com
    jueves, 9 de junio de 2011 14:27
  • Pablo lo que me decias lo hice pero me daba error en el  regTipoId = returnedTipoid.First(); Este es el codigo:

    if (iTipoID != 0)
    {
       var returnedTipoid = xrm.new_tipoidentificacionSet.Where(t => t.new_Codigo == iTipoID);
       if (returnedTipoid != null)          //&& returnedTipoid .Count() > 0)  <--- da error
          {
              var regTipoId = new Xrm.new_tipoidentificacion();
              regTipoId = returnedTipoid.First();             // <--- da error  (no se puede conectar automaticamente al servidor. Error de conexion con el servidor xxx.xxx.xxx.xxx
              oCuenta.new_TipoId = new CrmEntityReference(regTipoId.LogicalName, regTipoId.Id);
          }
    }

    Por lo que he visto por ahi, no se si estoy equivocado el tema puede ir por aqui:

    var result = (from contact in xrmDataContext.CreateQuery("contact")
                  where contact.Attributes["lastname"].Equals("Apellidos contacto")
                  select contact);

    Estoy probando pero no me funciona, dime algo cuando puedas.

    jueves, 9 de junio de 2011 15:08
  • Ok.

    Lo que debe suceder ahí es que no te está retornando ningun registro. Por ello el error al querer traer el .First().

    Me da la impresión que el where es lo que deberías ajustar.

    Puedes probar haciendo algo del estilo: where contact.lastname.StartsWith("A") // o alguna otra letra . El objetivo es que hagas la consulta tipada y además que seguro tenga que devolverte registros.

    A partir de ahi seguro vas a poder resolverlo.

     

    Aguardo tus comentarios. Espero te vaya bien con esta prueba, saludos.

    PP


    Microsoft MVP Dynamics CRM | My Twitter: http://twitter.com/pabloperalta | My blog: http://weblogs.asp.net/pabloperalta | Blog en Español: http://wwww.elblogdedynamicscrm.com
    viernes, 10 de junio de 2011 12:33
  • Ya lo tengo arreglado Pablo gracias, solo cambiaba un poco la sintaxis: var returnedTipoid = xrm.new_tipoidentificacionSet.Where(t => t.new_Codigo == iTipoID).SingleOrDefault();

    Con esto obtienes el registro y ya puedes hacer lo que quieras.

    Gracias, ahora retomare otro hilo que tu tambien me respondiste sobre un Plugin que estaba haciendo, nos vemos.

    martes, 14 de junio de 2011 7:56
  • Excelente!

    Me alegra, muy util por cierto lo que mencionas.

    Saludos,

    PP


    Microsoft MVP Dynamics CRM | My Twitter: http://twitter.com/pabloperalta | My blog: http://weblogs.asp.net/pabloperalta | Blog en Español: http://wwww.elblogdedynamicscrm.com
    martes, 14 de junio de 2011 22:13