Personalizar conjuntos de opciones globales

 

Publicado: enero de 2017

Se aplica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Normalmente, usa conjuntos de opciones globales para definir campos de manera que los campos diferentes puedan compartir el mismo conjunto de opciones, que se mantiene en una ubicación. Puede volver a usar conjuntos de opciones globales. También los verá usados en los parámetros de solicitudes de manera similar a una enumeración.

Cuando define un valor de opción mediante OptionMetadata, se recomienda dejar que el sistema asigne un valor. Realice esta acción al pasar un valor null al crear la nueva instancia de OptionMetadata. Al definir una opción, contendrá un determinada prefijo de valor de opción específico del contexto del editor establecido para la solución en la que se crea el conjunto de opciones. Este prefijo ayuda a reducir la oportunidad de crear conjuntos de opciones duplicados para una solución administrada, y en cualquier conjunto de opciones que están definidos en organizaciones donde está instalada la solución administrada. Para obtener más información, vea Combinar opciones del conjunto de opciones.

En este tema

Recuperar un conjunto de opciones globales

Creación de un conjunto de opciones global

Crear una lista desplegable que usa un conjunto de opciones global

Actualizar un conjunto de opciones global

Recuperar todos los conjuntos de opciones globales

Eliminar un conjunto de opciones global

Recuperar un conjunto de opciones globales

El siguiente ejemplo muestra cómo recuperar un conjunto de opciones globales por nombre mediante el mensaje de RetrieveOptionSetRequest:


// Use the RetrieveOptionSetRequest message to retrieve  
// a global option set by it's name.
RetrieveOptionSetRequest retrieveOptionSetRequest =
    new RetrieveOptionSetRequest
    {
        Name = _globalOptionSetName
    };

// Execute the request.
RetrieveOptionSetResponse retrieveOptionSetResponse =
    (RetrieveOptionSetResponse)_serviceProxy.Execute(
    retrieveOptionSetRequest);

Console.WriteLine("Retrieved {0}.",
    retrieveOptionSetRequest.Name);

// Access the retrieved OptionSetMetadata.
OptionSetMetadata retrievedOptionSetMetadata =
    (OptionSetMetadata)retrieveOptionSetResponse.OptionSetMetadata;

// Get the current options list for the retrieved attribute.
OptionMetadata[] optionList =
    retrievedOptionSetMetadata.Options.ToArray();

' Use the RetrieveOptionSetRequest message to retrieve  
' a global option set by it's name.
Dim retrieveOptionSetRequest As RetrieveOptionSetRequest = New RetrieveOptionSetRequest With {
 .Name = _globalOptionSetName
}

' Execute the request.
Dim retrieveOptionSetResponse As RetrieveOptionSetResponse =
 CType(_serviceProxy.Execute(retrieveOptionSetRequest), RetrieveOptionSetResponse)

Console.WriteLine("Retrieved {0}.", retrieveOptionSetRequest.Name)

' Access the retrieved OptionSetMetadata.
Dim retrievedOptionSetMetadata As OptionSetMetadata =
 CType(retrieveOptionSetResponse.OptionSetMetadata, OptionSetMetadata)

' Get the current options list for the retrieved attribute.
Dim optionList() As OptionMetadata = retrievedOptionSetMetadata.Options.ToArray()

Creación de un conjunto de opciones global

Use el mensaje de CreateOptionSetRequest para crear un nuevo conjunto de opciones global. Definir la propiedad de IsGlobal en true para indicar que el conjunto de opciones es global. El siguiente ejemplo de código crea un conjunto de opciones global denominado "Conjunto de opciones de ejemplo":


#region How to create global option set
// Define the request object and pass to the service.
CreateOptionSetRequest createOptionSetRequest = new CreateOptionSetRequest
{
    // Create a global option set (OptionSetMetadata).
    OptionSet = new OptionSetMetadata
    {
        Name = _globalOptionSetName,
        DisplayName = new Label("Example Option Set", _languageCode),
        IsGlobal = true,
        OptionSetType = OptionSetType.Picklist,
        Options = 
    {
        new OptionMetadata(new Label("Open", _languageCode), null),
        new OptionMetadata(new Label("Suspended", _languageCode), null),
        new OptionMetadata(new Label("Cancelled", _languageCode), null),
        new OptionMetadata(new Label("Closed", _languageCode), null)
    }
    }
};

// Execute the request.
CreateOptionSetResponse optionsResp =
    (CreateOptionSetResponse)_serviceProxy.Execute(createOptionSetRequest);

'                    #Region "How to create global option set"
' Define the request object and pass to the service.
Dim createOptionSetRequest As CreateOptionSetRequest = New CreateOptionSetRequest()
Dim createOptionSetOptionSet As OptionSetMetadata = New OptionSetMetadata() With {
 .Name = _globalOptionSetName,
 .DisplayName = New Label("Example Option Set", _languageCode),
 .IsGlobal = True,
 .OptionSetType = OptionSetType.Picklist
}
createOptionSetOptionSet.Options.AddRange(
 {
  New OptionMetadata(New Label("Open", _languageCode), Nothing),
  New OptionMetadata(New Label("Suspended", _languageCode), Nothing),
  New OptionMetadata(New Label("Cancelled", _languageCode), Nothing),
  New OptionMetadata(New Label("Closed", _languageCode), Nothing)
 }
)

createOptionSetRequest.OptionSet = createOptionSetOptionSet
' Create a global option set (OptionSetMetadata).

' Execute the request.
Dim optionsResp As CreateOptionSetResponse =
 CType(_serviceProxy.Execute(createOptionSetRequest), CreateOptionSetResponse)

Crear una lista desplegable que usa un conjunto de opciones global

El siguiente ejemplo muestra cómo crear un atributo de lista desplegable que usa un conjunto de opciones global con CreateAttributeRequest:


// Create a Picklist linked to the option set.
// Specify which entity will own the picklist, and create it.
CreateAttributeRequest createRequest = new CreateAttributeRequest
{
    EntityName = Contact.EntityLogicalName,
    Attribute = new PicklistAttributeMetadata
    {
        SchemaName = "sample_examplepicklist",
        LogicalName = "sample_examplepicklist",
        DisplayName = new Label("Example Picklist", _languageCode),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),

        // In order to relate the picklist to the global option set, be sure
        // to specify the two attributes below appropriately.
        // Failing to do so will lead to errors.
        OptionSet = new OptionSetMetadata
        {
            IsGlobal = true,
            Name = _globalOptionSetName
        }
    }
};

_serviceProxy.Execute(createRequest);

' Create a Picklist linked to the option set.
' Specify which entity will own the picklist, and create it.
Dim createRequest As CreateAttributeRequest = New CreateAttributeRequest With {
 .EntityName = Contact.EntityLogicalName,
 .Attribute = New PicklistAttributeMetadata With {
  .SchemaName = "sample_examplepicklist", .LogicalName = "sample_examplepicklist",
  .DisplayName = New Label("Example Picklist", _languageCode),
  .RequiredLevel = New AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
  .OptionSet = New OptionSetMetadata With {
   .IsGlobal = True,
   .Name = _globalOptionSetName
  }
 }
}
' In order to relate the picklist to the global option set, be sure
' to specify the two attributes below appropriately.
' Failing to do so will lead to errors.

_serviceProxy.Execute(createRequest)

Actualizar un conjunto de opciones global

El siguiente ejemplo muestra cómo actualizar la etiqueta para un conjunto de opciones global por nombre mediante UpdateOptionSetRequest:


// Use UpdateOptionSetRequest to update the basic information of an option
// set. Updating option set values requires different messages (see below).
UpdateOptionSetRequest updateOptionSetRequest = new UpdateOptionSetRequest
{
    OptionSet = new OptionSetMetadata
    {
        DisplayName = new Label("Updated Option Set", _languageCode),
        Name = _globalOptionSetName,
        IsGlobal = true
    }
};

_serviceProxy.Execute(updateOptionSetRequest);

//Publish the OptionSet
PublishXmlRequest pxReq1 = new PublishXmlRequest { ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>", _globalOptionSetName) };
_serviceProxy.Execute(pxReq1);

' Use UpdateOptionSetRequest to update the basic information of an option
' set. Updating option set values requires different messages (see below).
Dim updateOptionSetRequest As UpdateOptionSetRequest = New UpdateOptionSetRequest With {
 .OptionSet = New OptionSetMetadata With {
  .DisplayName = New Label("Updated Option Set", _languageCode),
  .Name = _globalOptionSetName,
  .IsGlobal = True
 }
}

_serviceProxy.Execute(updateOptionSetRequest)

'Publish the OptionSet
Dim pxReq1 As PublishXmlRequest = New PublishXmlRequest With {
 .ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>", _globalOptionSetName)
}
_serviceProxy.Execute(pxReq1)

Opciones de ordenación

El siguiente ejemplo muestra cómo se pueden ordenar las opciones en un conjunto de opciones global por nombre mediante OrderOptionRequest:


// Change the order of the original option's list.
// Use the OrderBy (OrderByDescending) linq function to sort options in  
// ascending (descending) order according to label text.
// For ascending order use this:
var updateOptionList =
    optionList.OrderBy(x => x.Label.LocalizedLabels[0].Label).ToList();

// For descending order use this:
// var updateOptionList =
//      optionList.OrderByDescending(
//      x => x.Label.LocalizedLabels[0].Label).ToList();

// Create the request.
OrderOptionRequest orderOptionRequest = new OrderOptionRequest
{
    // Set the properties for the request.
    OptionSetName = _globalOptionSetName,
    // Set the changed order using Select linq function 
    // to get only values in an array from the changed option list.
    Values = updateOptionList.Select(x => x.Value.Value).ToArray()
};

// Execute the request
_serviceProxy.Execute(orderOptionRequest);

//Publish the OptionSet
PublishXmlRequest pxReq4 = new PublishXmlRequest { ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>", _globalOptionSetName) };
_serviceProxy.Execute(pxReq4);

' Change the order of the original option's list.
' Use the OrderBy (OrderByDescending) linq function to sort options in  
' ascending (descending) order according to label text.
' For ascending order use this:
Dim updateOptionList = optionList.OrderBy(Function(x) x.Label.LocalizedLabels(0).Label).ToList()

' For descending order use this:
' var updateOptionList =
'      optionList.OrderByDescending(
'      x => x.Label.LocalizedLabels[0].Label).ToList();

' Create the request.
Dim orderOptionRequest As OrderOptionRequest =
 New OrderOptionRequest With {
  .OptionSetName = _globalOptionSetName,
  .Values = updateOptionList.Select(Function(x) x.Value.Value).ToArray()
 }
' Set the properties for the request.
' Set the changed order using Select linq function 
' to get only values in an array from the changed option list.

' Execute the request
_serviceProxy.Execute(orderOptionRequest)

'Publish the OptionSet
Dim pxReq4 As PublishXmlRequest =
 New PublishXmlRequest With {
  .ParameterXml = String.Format("<importexportxml><optionsets><optionset>{0}</optionset></optionsets></importexportxml>",
                                _globalOptionSetName)
 }
_serviceProxy.Execute(pxReq4)

Recuperar todos los conjuntos de opciones globales

El siguiente ejemplo muestra cómo recuperar todos los conjuntos de opciones globales mediante RetrieveAllOptionSetsRequest:


// Use RetrieveAllOptionSetsRequest to retrieve all global option sets.
// Create the request.
RetrieveAllOptionSetsRequest retrieveAllOptionSetsRequest =
    new RetrieveAllOptionSetsRequest();

// Execute the request
RetrieveAllOptionSetsResponse retrieveAllOptionSetsResponse =
    (RetrieveAllOptionSetsResponse)_serviceProxy.Execute(
    retrieveAllOptionSetsRequest);

// Now you can use RetrieveAllOptionSetsResponse.OptionSetMetadata property to 
// work with all retrieved option sets.
if (retrieveAllOptionSetsResponse.OptionSetMetadata.Count() > 0)
{
    Console.WriteLine("All the global option sets retrieved as below:");
    int count = 1;
    foreach (OptionSetMetadataBase optionSetMetadata in
        retrieveAllOptionSetsResponse.OptionSetMetadata)
    {
        Console.WriteLine("{0} {1}", count++,
            (optionSetMetadata.DisplayName.LocalizedLabels.Count >0)? optionSetMetadata.DisplayName.LocalizedLabels[0].Label : String.Empty);
    }
}

' Use RetrieveAllOptionSetsRequest to retrieve all global option sets.
' Create the request.
Dim retrieveAllOptionSetsRequest As New RetrieveAllOptionSetsRequest()

' Execute the request
Dim retrieveAllOptionSetsResponse As RetrieveAllOptionSetsResponse =
 CType(_serviceProxy.Execute(retrieveAllOptionSetsRequest), RetrieveAllOptionSetsResponse)

' Now you can use RetrieveAllOptionSetsResponse.OptionSetMetadata property to 
' work with all retrieved option sets.
If retrieveAllOptionSetsResponse.OptionSetMetadata.Count() > 0 Then
 Console.WriteLine("All the global option sets retrieved as below:")
 Dim count As Integer = 1
 For Each optionSetMetadata As OptionSetMetadataBase In retrieveAllOptionSetsResponse.OptionSetMetadata
                       Console.WriteLine("{0} {1}",
                                         count,
                                         If(optionSetMetadata.DisplayName.LocalizedLabels.Count > 0,
                                            optionSetMetadata.DisplayName.LocalizedLabels(0).Label,
                                            String.Empty))
  count += 1
 Next optionSetMetadata
End If

Eliminar un conjunto de opciones global

El siguiente ejemplo muestra cómo comprobar si otro componente de la solución está usando un conjunto de opciones global con RetrieveDependentComponentsRequest, y cómo eliminarlo mediante DeleteOptionSetRequest:


// Create the request to see which components have a dependency on the
// global option set.
RetrieveDependentComponentsRequest dependencyRequest =
    new RetrieveDependentComponentsRequest
    {
        ObjectId = _optionSetId,
        ComponentType = (int)componenttype.OptionSet
    };

RetrieveDependentComponentsResponse dependencyResponse =
    (RetrieveDependentComponentsResponse)_serviceProxy.Execute(
    dependencyRequest);

// Here you would check the dependencyResponse.EntityCollection property
// and act as appropriate. However, we know there is exactly one 
// dependency so this example deals with it directly and deletes 
// the previously created attribute.
DeleteAttributeRequest deleteAttributeRequest =
    new DeleteAttributeRequest
{
    EntityLogicalName = Contact.EntityLogicalName,
    LogicalName = "sample_examplepicklist"
};

_serviceProxy.Execute(deleteAttributeRequest);

Console.WriteLine("Referring attribute deleted.");
#endregion How to delete attribute

#region How to delete global option set

// Finally, delete the global option set. Attempting this before deleting
// the picklist above will result in an exception being thrown.
DeleteOptionSetRequest deleteRequest = new DeleteOptionSetRequest
{
    Name = _globalOptionSetName
};

_serviceProxy.Execute(deleteRequest);

' Create the request to see which components have a dependency on the
' global option set.
Dim dependencyRequest As RetrieveDependentComponentsRequest =
 New RetrieveDependentComponentsRequest With {
  .ObjectId = _optionSetId,
  .ComponentType = componenttype.OptionSet
 }

Dim dependencyResponse As RetrieveDependentComponentsResponse =
 CType(_serviceProxy.Execute(dependencyRequest), RetrieveDependentComponentsResponse)

' Here you would check the dependencyResponse.EntityCollection property
' and act as appropriate. However, we know there is exactly one 
' dependency so this example deals with it directly and deletes 
' the previously created attribute.
Dim deleteAttributeRequest As DeleteAttributeRequest =
 New DeleteAttributeRequest With {
  .EntityLogicalName = Contact.EntityLogicalName,
  .LogicalName = "sample_examplepicklist"
 }

_serviceProxy.Execute(deleteAttributeRequest)

Console.WriteLine("Referring attribute deleted.")
'#End Region ' How to delete attribute

'#Region "How to delete global option set"

' Finally, delete the global option set. Attempting this before deleting
' the picklist above will result in an exception being thrown.
Dim deleteRequest As DeleteOptionSetRequest =
 New DeleteOptionSetRequest With {
  .Name = _globalOptionSetName
 }

_serviceProxy.Execute(deleteRequest)

Ver también

Personalizar aplicaciones de Microsoft Dynamics 365
Usar el servicio de la organización con metadatos de Dynamics 365
Insertar, actualizar, elimina, y ordenar las opciones globales del conjunto de opciones
Mensajes del conjunto de opciones global
Valores de metadatos de conjunto de opciones globales
Ejemplo: crear un conjunto de opciones globales
Ejemplo: Trabajo con los conjuntos de opciones globales
Ejemplo: volcar la información del conjunto de opciones globales a un archivo

Microsoft Dynamics 365

© 2017 Microsoft. Todos los derechos reservados. Copyright