Principales respuestas
Obtener el GUID de un registro usando XrmServiceContext

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.
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- Propuesto como respuesta Pablo Peralta, MS MVPMVP martes, 14 de junio de 2011 22:13
- Marcado como respuesta Jimmy LarrauriModerator lunes, 20 de junio de 2011 2:38
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 -
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.
-
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 -
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.
-
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 -
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.
-
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- Propuesto como respuesta Pablo Peralta, MS MVPMVP martes, 14 de junio de 2011 22:13
- Marcado como respuesta Jimmy LarrauriModerator lunes, 20 de junio de 2011 2:38
-
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.
- Propuesto como respuesta Pablo Peralta, MS MVPMVP martes, 14 de junio de 2011 22:13
-