Trabajar con definiciones de columnas

Este tema describe una serie de operaciones comunes que se pueden aplicar a las definiciones de columna (metadatos de atributos).

Crear columnas

Las columnas (atributos) se crean definiendo uno de los tipos AttributeMetadata y pasándolo luego al mensaje CreateAttributeRequest.

El siguiente ejemplo de código define AttributeMetadata para varios tipos diferentes de columnas y las agrega a un List<AttributeMetadata>. Al final del código, las definiciones de columna se pasan a una instancia de la clase CreateAttributeRequest y la columna se crea utilizando IOrganizationService.Execute Método.

El siguiente código de ejemplo presupone que el prefijo actual de personalización es 'nuevo' porque ese es el prefijo de personalización predeterminado para el editor de soluciones de la organización. Debe usar el prefijo de personalización para el editor de soluciones que mejor se ajuste al contexto de la solución.

// Create storage for new  being created
var addedColumns = new List<AttributeMetadata>();
int languageCode = 1033; //English


// Create a yes/no column
var boolColumn = new BooleanAttributeMetadata
{
    // Set base properties
    SchemaName = "new_Boolean",
    LogicalName = "new_boolean",
    DisplayName = new Label("Sample Boolean", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("Boolean Column", languageCode),
    // Set extended properties
    OptionSet = new BooleanOptionSetMetadata(
        new OptionMetadata(new Label("True", languageCode), 1),
        new OptionMetadata(new Label("False", languageCode), 0)
        )
};

// Add to list
addedColumns.Add(boolColumn);

// Create a date time column
var dateTimeColumn = new DateTimeAttributeMetadata
{
    // Set base properties
    SchemaName = "new_Datetime",
    LogicalName = "new_datetime",
    DisplayName = new Label("Sample DateTime", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("DateTime Column", languageCode),
    // Set extended properties
    Format = DateTimeFormat.DateOnly,
    ImeMode = ImeMode.Disabled
};

// Add to list
addedColumns.Add(dateTimeColumn);

// Create a decimal column   
var decimalColumn = new DecimalAttributeMetadata
{
    // Set base properties
    SchemaName = "new_Decimal",
    LogicalName = "new_decimal",
    DisplayName = new Label("Sample Decimal", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("Decimal Column", languageCode),
    // Set extended properties
    MaxValue = 100,
    MinValue = 0,
    Precision = 1
};

// Add to list
addedColumns.Add(decimalColumn);

// Create a integer column   
var integerColumn = new IntegerAttributeMetadata
{
    // Set base properties
    SchemaName = "new_Integer",
    LogicalName = "new_integer",
    DisplayName = new Label("Sample Integer", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("Integer Column", languageCode),
    // Set extended properties
    Format = IntegerFormat.None,
    MaxValue = 100,
    MinValue = 0
};

// Add to list
addedColumns.Add(integerColumn);

// Create a memo column 
var memoColumn = new MemoAttributeMetadata
{
    // Set base properties
    SchemaName = "new_Memo",
    LogicalName = "new_memo",
    DisplayName = new Label("Sample Memo", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("Memo Column", languageCode),
    // Set extended properties
    Format = StringFormat.TextArea,
    ImeMode = ImeMode.Disabled,
    MaxLength = 500
};

// Add to list
addedColumns.Add(memoColumn);

// Create a money column   
var moneyColumn = new MoneyAttributeMetadata
{
    // Set base properties
    SchemaName = "new_Money",
    LogicalName = "new_money",
    DisplayName = new Label("Sample Money", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("Money Column", languageCode),
    // Set extended properties
    MaxValue = 1000.00,
    MinValue = 0.00,
    Precision = 1,
    PrecisionSource = 1,
    ImeMode = ImeMode.Disabled
};

// Add to list
addedColumns.Add(moneyColumn);

// Create a choice column   
var picklistColumn =
    new PicklistAttributeMetadata
    {
        // Set base properties
        SchemaName = "new_Picklist",
        LogicalName = "new_picklist",
        DisplayName = new Label("Sample Picklist", languageCode),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
        Description = new Label("Picklist Attribute", languageCode),
        // Set extended properties
        // Build local picklist options
        OptionSet = new OptionSetMetadata
        {
            IsGlobal = false,
            OptionSetType = OptionSetType.Picklist,
            Options =
            {
               new OptionMetadata(
                  new Label("Created", languageCode), null),
               new OptionMetadata(
                  new Label("Updated", languageCode), null),
               new OptionMetadata(
                  new Label("Deleted", languageCode), null)
            }
        }
    };

// Add to list
addedColumns.Add(picklistColumn);

// Create a string column
var stringColumn = new StringAttributeMetadata
{
    // Set base properties
    SchemaName = "new_String",
    LogicalName = "new_string",

    DisplayName = new Label("Sample String", languageCode),
    RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    Description = new Label("String Column", languageCode),
    // Set extended properties
    MaxLength = 100
};

// Add to list
addedColumns.Add(stringColumn);

//Multi-select column requires version 9.0 or higher.
if (_productVersion > new Version("9.0"))
{

    // Create a multi-select Choices column
    var multiSelectChoiceColumn = new MultiSelectPicklistAttributeMetadata()
    {
        SchemaName = "new_MultiSelectOptionSet",
        LogicalName = "new_multiselectoptionset",
        DisplayName = new Label("Choices column", languageCode),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
        Description = new Label("Choices columndescription", languageCode),
        OptionSet = new OptionSetMetadata()
        {
            IsGlobal = false,
            OptionSetType = OptionSetType.Picklist,
            Options = {
               new OptionMetadata(new Label("First Option",languageCode),null),
               new OptionMetadata(new Label("Second Option",languageCode),null),
               new OptionMetadata(new Label("Third Option",languageCode),null)
            }
        }
    };
    // Add to list
    addedColumns.Add(multiSelectChoiceColumn);

    // Create a BigInt column
    var bigIntColumn = new BigIntAttributeMetadata
    {
        // Set base properties
        SchemaName = "new_BigInt",
        LogicalName = "new_bigint",
        DisplayName = new Label("Sample Big Int", languageCode),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
        Description = new Label("Big Int Column", languageCode)
       

    };
    // Add to list
    addedColumns.Add(bigIntColumn);

}

foreach (AttributeMetadata aColumn in addedColumns)
{
    // Create the request.
    var createAttributeRequest = new CreateAttributeRequest
    {
        EntityName = Contact.EntityLogicalName,
        Attribute = aColumn
    };

    // Execute the request using IOrganizationService instance
    service.Execute(createAttributeRequest);

    Console.WriteLine($"Created the {aColumn.SchemaName} column.");
}

Recuperar una columna

En este ejemplo de código se muestra cómo recuperar AttributeMetadata para una columna utilizando el método RetrieveAttributeRequest. Esta muestra recupera la definición de una columna StringAttributeMetadata personalizada llamada 'new_string' de la tabla de contactos que se creó en Crear columnas.

Nota

Como RetrieveAsIfPublished es verdadero, esta solicitud devuelve la definición actual no publicada de esta columna. Puede usar esto si está creando un editor de columnas y desea recuperar la definición no publicada de la columna. De lo contrario, no debe especificar RetrieveAsIfPublished. Más información: Recuperación de definiciones no publicadas.

// Create the request
RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
    EntityLogicalName = Contact.EntityLogicalName,
    LogicalName = "new_string",
    RetrieveAsIfPublished = true
};

// Execute the request using IOrganizationService instance
RetrieveAttributeResponse attributeResponse =
    (RetrieveAttributeResponse)service.Execute(attributeRequest);

Console.WriteLine("Retrieved the attribute {0}.",
    attributeResponse.AttributeMetadata.SchemaName);

Actualizar una columna

Este código de ejemplo muestra cómo actualizar una columna (atributo). Este ejemplo usa la UpdateAttributeRequest para cambiar al AttributeMetadata.DisplayName propiedad de una columna personalizada recuperada previamente para la tabla Contact.

// Modify the retrieved attribute
AttributeMetadata retrievedAttributeMetadata =
    attributeResponse.AttributeMetadata;
retrievedAttributeMetadata.DisplayName =
    new Label("Update String Attribute", 1033); // English

// Update an attribute retrieved via RetrieveAttributeRequest
UpdateAttributeRequest updateRequest = new UpdateAttributeRequest
{
    Attribute = retrievedAttributeMetadata,
    EntityName = Contact.EntityLogicalName,
    MergeLabels = false
};

// Execute the request using IOrganizationService instance
service.Execute(updateRequest);

Console.WriteLine("Updated the attribute {0}.",
    retrievedAttributeMetadata.SchemaName);

Crear una columna de búsqueda

Se crea una columna de búsqueda utilizando CreateOneToManyRequest.

CreateOneToManyRequest req = new CreateOneToManyRequest()
{
    Lookup = new LookupAttributeMetadata()
    {
        Description = new Label("The referral (lead) from the bank account owner", 1033),
        DisplayName = new Label("Referral", 1033),
        LogicalName = "new_parent_leadid",
        SchemaName = "New_Parent_leadId",
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.Recommended)
    },
    OneToManyRelationship = new OneToManyRelationshipMetadata()
    {
        AssociatedMenuConfiguration = new AssociatedMenuConfiguration()
        {
            Behavior = AssociatedMenuBehavior.UseCollectionName,
            Group = AssociatedMenuGroup.Details,
            Label = new Label("Bank Accounts", 1033),
            Order = 10000
        },
        CascadeConfiguration = new CascadeConfiguration()
        {
            Assign = CascadeType.Cascade,
            Delete = CascadeType.Cascade,
            Merge = CascadeType.Cascade,
            Reparent = CascadeType.Cascade,
            Share = CascadeType.Cascade,
            Unshare = CascadeType.Cascade
        },
        ReferencedEntity = "lead",
        ReferencedAttribute = "leadid",
        ReferencingEntity = _customEntityName,
        SchemaName = "new_lead_new_bankaccount"
    }
};
// Execute the request using IOrganizationService instance
service.Execute(req);

Crear una columna de búsqueda de clientes

A diferencia de una columna de búsqueda, una columna de búsqueda de clientes se crea utilizando el mensaje CreateCustomerRelationshipsRequest, que agrega dos relaciones a la columna de búsqueda: una a la tabla Account y la otra a la tabla Contact. No puede agregar una relación a ninguna otra tabla excepto Account y Contact para una columna de búsqueda de clientes.

CreateCustomerRelationshipsRequest createCustomerReq = new CreateCustomerRelationshipsRequest
{
    Lookup = new LookupAttributeMetadata
    {
        Description = new Label("The owner of the bank account", 1033),
        DisplayName = new Label("Account owner", 1033),
        RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.ApplicationRequired),
        SchemaName = "new_customerid"
    },
    OneToManyRelationships = new OneToManyRelationshipMetadata[]
    {
        new OneToManyRelationshipMetadata()
        {
            ReferencedEntity = "account",
            ReferencingEntity = _customEntityName,
            SchemaName = "new_bankaccount_customer_account",
        },
        new OneToManyRelationshipMetadata()
        {
            ReferencedEntity = "contact",
            ReferencingEntity = _customEntityName,
            SchemaName = "new_bankaccount_customer_contact",
        }
    },
};
// Execute the request using IOrganizationService instance
service.Execute(createCustomerReq);

Crear una columna de opciones que utilice opciones globales

Este código de ejemplo muestra cómo crear una columna de opciones PicklistAttributeMetadata que está asociada con elecciones globales.

La siguiente muestra utiliza CreateAttributeRequest para configurar las opciones de una columna PicklistAttributeMetadata para usar opciones globales con un nombre representado por la variable de cadena _globalOptionSetName. Más información: Personalizar opciones

// 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", 1033), //English
        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
        }
    }
};
// Execute the request using IOrganizationService instance
service.Execute(createRequest);

Insertar un nuevo valor de estado

Este código de ejemplo muestra cómo insertar una nueva opción de razón para el estado para la columna StatusAttributeMetadata.

El siguiente código de ejemplo usa InsertStatusValueRequest para especificar una nueva opción para la columna Contact.StatusCode de la tabla Contact que es válida cuando Contact.StateCode es 0 (activo). La propiedad IOrganizationService.Execute método procesa la solicitud.

El siguiente código de ejemplo permite dos opciones de razón para el estado para los contactos activos: Activo y Latente.

// Use InsertStatusValueRequest message to insert a new status 
// in an existing status attribute. 
// Create the request.
InsertStatusValueRequest insertStatusValueRequest =
    new InsertStatusValueRequest
{
    AttributeLogicalName = "statuscode",
    EntityLogicalName = Contact.EntityLogicalName,
    Label = new Label("Dormant", 1033), //English
    StateCode = 0
};

// Execute the request using IOrganizationService instance and store newly inserted value 
// for cleanup, used later part of this sample. 
_insertedStatusValue = ((InsertStatusValueResponse)service.Execute(
    insertStatusValueRequest)).NewOptionValue;

Console.WriteLine("Created {0} with the value of {1}.",
    insertStatusValueRequest.Label.LocalizedLabels[0].Label,
    _insertedStatusValue);

Actualizar un valor de estado

Este código de ejemplo muestra cómo cambiar la etiqueta de una opción en unaj columna StateAttributeMetadata.

El siguiente código de muestra usa UpdateStateValueRequest para cambiar la etiqueta de opción Contact.StateCode de Activo a Abierto.

// Modify the state value label from Active to Open.
// Create the request.
UpdateStateValueRequest updateStateValue = new UpdateStateValueRequest
{
    AttributeLogicalName = "statecode",
    EntityLogicalName = Contact.EntityLogicalName,
    Value = 1,
    Label = new Label("Open", 1033) //English
};

// Execute the request using IOrganizationService instance
service.Execute(updateStateValue);

Console.WriteLine(
    "Updated {0} state attribute of {1} entity from 'Active' to '{2}'.",
    updateStateValue.AttributeLogicalName,
    updateStateValue.EntityLogicalName,
    updateStateValue.Label.LocalizedLabels[0].Label
    );

No puede agregar ni quitar opciones StateCode, pero puede cambiar las etiquetas de las opciones.

Inserte una nueva opción en las opciones locales

Este código de muestra muestra cómo agregar una nueva opción a las opciones locales. La siguiente muestra utiliza InsertOptionValueRequest para agregar una nueva opción a una columna PicklistAttributeMetadata personalizada para la tabla Contact.

// Create a request.
InsertOptionValueRequest insertOptionValueRequest =
    new InsertOptionValueRequest
{
    AttributeLogicalName = "new_picklist",
    EntityLogicalName = Contact.EntityLogicalName,
    Label = new Label("New Picklist Label", 1033) //English
};

// Execute the request using IOrganizationService instance
int insertOptionValue = ((InsertOptionValueResponse)service.Execute(
    insertOptionValueRequest)).NewOptionValue;

Console.WriteLine("Created {0} with the value of {1}.",
    insertOptionValueRequest.Label.LocalizedLabels[0].Label,
    insertOptionValue);

Cambiar el orden de las opciones en las opciones locales

Este código de ejemplo muestra cómo cambiar el orden de las opciones en las opciones locales. La siguiente muestra recupera una columna PicklistAttributeMetadata personalizada y cambia el orden de las opciones originales utilizando la función OrderByLINQ para ordenar los elementos en orden ascendente según el texto de la etiqueta. Después, usa OrderOptionRequest para establecer el nuevo orden de las opciones de la columna.

Use la función OrderByDescending linq para ordenar los artículos por orden descendente.

// Use the RetrieveAttributeRequest message to retrieve  
// a attribute by it's logical name.
RetrieveAttributeRequest retrieveAttributeRequest =
    new RetrieveAttributeRequest
{
    EntityLogicalName = Contact.EntityLogicalName,
    LogicalName = "new_picklist",
    RetrieveAsIfPublished = true
};

// Execute the request using IOrganizationService instance
RetrieveAttributeResponse retrieveAttributeResponse =
    (RetrieveAttributeResponse)service.Execute(
    retrieveAttributeRequest);

// Access the retrieved attribute.
PicklistAttributeMetadata retrievedPicklistAttributeMetadata =
    (PicklistAttributeMetadata)
    retrieveAttributeResponse.AttributeMetadata;

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

// 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.
    AttributeLogicalName = "new_picklist",
    EntityLogicalName = Contact.EntityLogicalName,
    // 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 using IOrganizationService instance
service.Execute(orderOptionRequest);

Console.WriteLine("Option Set option order changed");

Eliminar una columna

Este ejemplo de código muestra cómo eliminar columnas almacenadas en List<AttributeMetadata> que fueron creadas para la tabla Contact en Crear columnas. Para cada AttributeMetadata el DeleteAttributeRequest prepara la solicitud que se procesa mediante IOrganizationService.Execute.

// Delete all attributes created for this sample.
foreach (AttributeMetadata anAttribute in addedAttributes)
{
    // Create the request object
    DeleteAttributeRequest deleteAttribute = new DeleteAttributeRequest
    {
        // Set the request properties 
        EntityLogicalName = Contact.EntityLogicalName,
        LogicalName = anAttribute.SchemaName
    };
    // Execute the request using IOrganizationService instance
    service.Execute(deleteAttribute);
}

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).