Espanol Foro

Expand all | Collapse all

problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

  • 1.  problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Feb 28, 2020 08:09 PM
    Tengo un campo nuevo


    Trabaja correctamente en mi formulario, pero cuando quiero regresar los valores por medio de programacion, no se como hacerlo, algún ejemplo de como recuperar los valores.
    por ejemplo mi programa recupera un valor 742570000, pero este no me permite ver la descripción por ejemplo (IFE)
    el valor 742570001 me debe recuperar el nombre de ACTA DE NACIMIENTO.

    o si cuentan con algún ejemplo de como recuperar las etiquetas de cada uno de los que están seleccionados.

    Gracias
    Federico Facio Delgado

    ------------------------------
    Federico Facio Delgado
    Nacer-Global.Com
    ------------------------------


  • 2.  RE: problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Mar 02, 2020 07:07 AM
    Hola Federico,

    puedes intentar lo siguiente
    1. Acceder a los Entity.FormattedValues. En caso de estar disponible es lo más fácil, depende de el contexto en que corre tu código.
    Nunca lo he probado para este tipo de control. Debe ser algo así, mira a ver que te devuelve:
    bool success = account.FomatedValues("mi_campo", out string labels);
    if(success)
      // ahi lo tienes en labels
    else
      // pasa al paso dos

    2. Obtenter las Etiquetas usando los Metadatos del campo, siempre funciona, es más complejo, necesitas hacer un request a CRM, por lo que es más "lento".
    Te dejo el código para OptionSetValue (PicklistAttributeMetadata) solo tienes que cambiarlo y utilizar MultiSelectPicklistAttributeMetadata (puede que funcione sin cambios ya que ambos tipos heredan de EnumAttributeMetadata)

        public static class OrganizationServiceMetadataExtensions
        {
            public static AttributeMetadata GetAttributeMetadata(this IOrganizationService service, string entityType, string attributeName)
            {
                if (service == null || string.IsNullOrWhiteSpace(entityType) || string.IsNullOrWhiteSpace(attributeName))
                    return null;
    
                var request = new RetrieveAttributeRequest
                {
                    EntityLogicalName = entityType,
                    LogicalName = attributeName,
                    RetrieveAsIfPublished = true
                };
                var response = (RetrieveAttributeResponse)service.Execute(request);
                var result = response?.AttributeMetadata;
                return result;
            }
            
            public static Dictionary<int, string> GetOptionSetValueLabels(this IOrganizationService service, string entityType, string attribute)
            {
                AttributeMetadata attributeMeta = service.GetAttributeMetadata(entityType, attribute);
                var optionMeta = attributeMeta as EnumAttributeMetadata;
                var result = optionMeta?.OptionSet?.Options?
                                .Where(o => o?.Value != null)
                                .ToDictionary(o => o.Value.Value, o => o.Label?.UserLocalizedLabel?.Label);
                return result;
            }
        }
    
    // Call example:
    var labels = service.GetOptionSetValueLabels("account", "mi_campo);var labelIFE = labels[7425700000]


    Te mandé código de C# porque preguntaste por una clase del SDK, pero se puede hacer lo mismo en JavaScript (mira aquí en el WebAPI)

    OJO con lo que harás con estos Labels nunca hagas algo como  "if (label == "IFE") ... " esto es un Display Name que se puede cambiar sin mucha "precaución" y cambia dependiendo del idioma del usuario, para esto usa me mejor los "valores" en un Enum si quieres que sea más legible: if (value == Account.Enums.MiCampo,IFE) ... avisa si necesitas más información sobre esto,

    Espero te sirva.

    Saludos
    Angel A.

    ------------------------------
    Angel A. Rodríguez, Msc
    Technischer Architekt
    ORBIS Austria GmbH
    ------------------------------



  • 3.  RE: problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Mar 05, 2020 11:36 AM
    Buen día angel

    Te antemano muchas gracias por la pronta respuesta, como mencionan Enrique y tú la opción es correcta ya que la inserte en mi programa y funciono correctamente, la rutina que me adicionas es para picklist pero funciona correctamente con multiselectpicklist​, termine de probarla y todo super bien muchas gracias.

    Federico Facio Delgado

    ------------------------------
    Federico Facio Delgado
    Nacer-Global.Com
    ------------------------------



  • 4.  RE: problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Mar 02, 2020 07:29 AM
    Hola Federico!

    Encantado de saludarte. Comentarte de antemano que este es un comportamiento normal y tiene su sentido puesto que una vez desarrollado nuestro código podemos cambiar la etiqueta sin problemas ya que desde el código estamos haciendo referencia a este número interno (en tu caso 742570000).

    Una vez aclarado esto para poder recuperar este descriptivo tenemos que realizar una consulta adicional. En .Net te paso el siguiente ejemplo que puede guiarte (Sustituye EntityName por el nombre de la entidad y FieldName el nombre del campo que quieres recuperar del tipo PickList.

    string EntityName = "account";
    string FieldName = "address1_addresstypecode";
    RetrieveEntityRequest req = new RetrieveEntityRequest()
    {
          EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.Attributes,
          LogicalName = EntityName,
    };
    
    RetrieveEntityResponse response = (RetrieveEntityResponse)service.Execute(req);
    
    var MyAttributes = ((EntityMetadata)response.Results["EntityMetadata"]).Attributes;
    dynamic result = MyAttributes.Where(o =>  o.LogicalName == FieldName).FirstOrDefault();
    var options = result.OptionSet as OptionSetMetadata;


    Segunda Opción! Si deseas obtenerlo mediante javascript puedes obtenerlo mediante la API de cliente de Dynamics 365:https://docs.microsoft.com/es-es/powerapps/developer/common-data-service/webapi/query-metadata-web-api


    Y ya tercera y última: Mi recomendación: Para .Net yo suelo utilizar elementos tipo enum donde asigno internamente el número y utilizo el descriptivo como etiqueta:

    public enum MiDesplegable
    {
       Opcion1 = 742570000,
       Opcion2 = 742570001
    }
    Y lo puedes instanciar así:
      new OptionSetValue((int)MiDesplegable.Opcion1);



    Espero que ayude a aclararte y cualquier duda no dudes en contactar con la comunidad!
    Te deseo buen día!



    ------------------------------
    Enrique Romero
    Consultor
    Innovar Tecnologías
    Madrid
    ------------------------------



  • 5.  RE: problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Mar 02, 2020 09:47 AM
    Hola Enrique:

    Gracias por cooperar, es básicamente lo mismo que he puesto, pero te hago una observación. Con el RetrieveEntityRequest estas descargándote todos los atributos de la entidad cuando solo necesitas uno RetrieveAttributeRequest debe tener mejor rendimiento. No crees?

    Saludos

    ------------------------------
    Angel A. Rodríguez, Msc
    Technischer Architekt
    ORBIS Austria GmbH
    ------------------------------



  • 6.  RE: problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Mar 02, 2020 09:54 AM
    Hola Ángel!

    Cierto, hemos debido de estar elaborando la respuesta al mismo tiempo prácticamente! Y eso me alegra ya que, ambos coincidimos en el criterio elegido.

    Y si, coincido con tu propuesta es mucho mejor el rendimiento si vamos exactamente al elemento que queremos

    Saludos!

    ------------------------------
    Enrique Romero
    Consultor
    Innovar Tecnologías
    Madrid
    ------------------------------



  • 7.  RE: problema con Microsoft.Xrm.Sdk.OptionSetValueCollection

    Posted Mar 05, 2020 11:37 AM
    Buen día

    Enrique muchas gracias por tu aporte lo tengo en mi programación, gracias por tu ayuda


    Federico Facio Delgado


    ------------------------------
    Federico Facio Delgado
    Nacer-Global.Com
    ------------------------------