Usar grades editáveis no Dynamics 365

 

Publicado: janeiro de 2017

Aplicável a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

A grade editável é um novo controle personalizado do Microsoft Dynamics 365 que fornece recursos de edição embutidos na Web e nos clientes móveis (Dynamics 365 para telefones e Dynamics 365 para tablets), incluindo a capacidade de agrupar, classificar e filtrar na mesma grade para que você não precise alternar registros e exibições. O controle de grade editável é suportado na grade principal e nas subgrades de um formulário no cliente Web e nos painéis e grades de formulário nos clientes móveis. Embora o controle de grade editável forneça a capacidade de edição, ele mantém os metadados de grade somente leitura e as configurações de segurança no nível do campo. As grades editáveis também suportam regras de negócios e script de formulários, de forma que você possa aplicar a lógica de negócios personalizadas de acordo com os requisitos da organização.

Observação

A grade editável foi apresentada no Atualização de dezembro de 2016 para Dynamics 365 (online e local).

Neste tópico

Habilitar grades editáveis

Suporte para script de formulário

Entidades e exibições compatíveis com a grade editável

Habilitar grades editáveis

É possível habilitar grades editáveis em nível de entidade para usar na grade principal ou em nível de formulário para substituir subgrades somente para leitura (grades associadas) com uma grade editável.

Você pode editar o controle de grades editáveis em uma entidade usando a ferramenta de personalização na guia Dynamics 365 (Configurações > Personalizações > Personalizar o sistema > Entidades > [Entity_Name] > Controles.

Para habilitar a grade editável de uma grade em um formulário, abra o editor do formulário, clique duas vezes na grade somente para leitura que deseja substituir pela grade editável e, em seguida, adicione/habilite a grade editável na guia Controles.

É possível reverter para a grade não editável a qualquer momento para uma grade principal e grades associadas, se necessário. Além disso, no tempo de execução, os usuários podem alternar entre grades editáveis e grades somente para leitura.

Para obter mais informações:TechNet: Tornar grades (listas) editáveis no Dynamics 365 usando o controle personalizado Grade editável

Suporte para script de formulário

As grades editáveis permitem eventos e métodos do cliente que podem ser usados para escrever extensões cliente personalizadas de acordo com sua necessidade de negócios.Para obter mais informações:Objetos e métodos de grade editável (referência do cliente)

Entidades e exibições compatíveis com a grade editável

Nem todas as entidades e exibições permitem o uso da grade editável.

No cliente Web, uma entidade permitirá a grade editável se todas as seguintes condições forem verdadeiras:

  • A entidade é personalizável (IsCustomizable = verdadeiro)

  • A entidade está entidade atualizada (IsAIRUpdated = verdadeiro) ou personalizada (IsCustomEntity = verdadeiro)

  • A entidade não é uma entidade secundária (IsChildEntity = falso)

No cliente móvel do Dynamics 365, uma entidade permitirá grades editáveis se for possível exibir a entidade no mapa do site do cliente móvel.

Para obter informações sobre as entidades que suportam grades editáveis, consulte a seção Entidades integradas suportadas em TechNet: Tornar grades (listas) editáveis no Dynamics 365 usando o controle personalizados Grade Editável

As grades editáveis não permitem exibições associadas por valor acumulado (Tipo de valor acumulado = Related).

Use o seguinte código de exemplo para gerar um arquivo XML que você possa abrir no Microsoft Excel como uma tabela XML para exibir informações de suporte de entidade para controles editáveis. O Excel descobrirá o esquema automaticamente e exibirá as informações nas seguintes colunas:

  • LogicalName: nome lógico da entidade.

  • DisplayName: nome de exibição da entidade.

  • CanEnableEditableGridWeb: status da exibição (verdadeiro ou falso) se a grade editável for compatível com a entidade no cliente Web.

  • CanEnableEditableGridMobile: status da exibição (verdadeiro ou falso) se a grade editável for compatível com a entidade nos clientes móveis. (Dynamics 365 para telefones e Dynamics 365 para tablets).

using System;
using System.Linq;
using System.Xml.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Xml;
using System.IO;

// These namespaces are found in the Microsoft.Xrm.Sdk.dll assembly
// found in the SDK\bin folder.
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Messages;

// This namespace is found in Microsoft.Crm.Sdk.Proxy.dll assembly
// found in the SDK\bin folder.
using Microsoft.Crm.Sdk.Messages;

namespace Microsoft.Crm.Sdk.Samples
{
    /// <summary>
    /// This sample generates an XML table to display the entity-support information for 
    ///  editable controls.
    /// </summary>
    public class DumpEditableGridEntityInfo
    {
        #region Class Level Members

        /// <summary>
        /// Stores the organization service proxy.
        /// </summary>
        OrganizationServiceProxy _serviceProxy;

        // Create storage for new attributes being created
        public List<AttributeMetadata> addedAttributes;

        // Specify which language code to use in the sample. If you are using a language
        // other than US English, you will need to modify this value accordingly.
        // See https://msdn.microsoft.com/en-us/library/0h88fahh.aspx
        public const int _languageCode = 1033;

        // Define the IDs/variables needed for this sample.
        public int _insertedStatusValue;

        #endregion Class Level Members

        #region How To Sample Code
        /// <summary>
        /// </summary>
        /// <param name="serverConfig">Contains server connection information.</param>
        /// <param name="promptForDelete">When True, the user will be prompted to delete all
        /// created entities.</param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptForDelete)
        {
            try
            {

                // Connect to the Organization service. 
                // The using statement assures that the service proxy will be properly disposed.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri, serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // This statement is required to enable early-bound type support.
                    _serviceProxy.EnableProxyTypes();

                    //<snippetDumpEditableGridEntityInfo1>
                    RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest()
                    {
                        EntityFilters = EntityFilters.Entity,
                        RetrieveAsIfPublished = true
                    };

                    // Retrieve the MetaData.
                    RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)_serviceProxy.Execute(request);


                    // Create an instance of StreamWriter to write text to a file.
                    // The using statement also closes the StreamWriter.
                    // To view this file, right click the file and choose open with Excel. 
                    // Excel will figure out the schema and display the information in columns.

                    String filename = String.Concat("EditableGridEntityInfo.xml");
                    using (StreamWriter sw = new StreamWriter(filename))
                    {
                        // Create Xml Writer.
                        XmlTextWriter metadataWriter = new XmlTextWriter(sw);

                        // Start Xml File.
                        metadataWriter.WriteStartDocument();

                        // Metadata Xml Node.
                        metadataWriter.WriteStartElement("Metadata");

                        foreach (EntityMetadata currentEntity in response.EntityMetadata)
                        {
                            // Start Entity Node
                            metadataWriter.WriteStartElement("Entity");

                            bool canBeDisplayedInSitemap = currentEntity.IsCustomizable.Value;

                            if (canBeDisplayedInSitemap)
                            {
                                metadataWriter.WriteElementString("LogicalName", currentEntity.LogicalName);
                                metadataWriter.WriteElementString("DisplayName", currentEntity.DisplayName.UserLocalizedLabel?.Label);
                                metadataWriter.WriteElementString("CanEnableEditableGridWeb", (!(bool)currentEntity.IsChildEntity && ((bool)currentEntity.IsAIRUpdated || (bool)currentEntity.IsCustomEntity)).ToString());
                                metadataWriter.WriteElementString("CanEnableEditableGridMobile", (currentEntity.IsVisibleInMobileClient.Value || currentEntity.IsVisibleInMobileClient.CanBeChanged).ToString());
                            }

                            // Write the Entity's Information.

                            //End Entity Node
                            metadataWriter.WriteEndElement();
                        }

                        // End Metadata Xml Node
                        metadataWriter.WriteEndElement();
                        metadataWriter.WriteEndDocument();

                        // Close xml writer.
                        metadataWriter.Close();
                        Console.WriteLine("Dumped information in the EditableGridEntityInfo.xml file");
                    }
                }
            }

            // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }
        #endregion How To Sample Code

        #region Main
        /// <summary>
        /// Standard Main() method used by most SDK samples.
        /// </summary>
        /// <param name="args"></param>
        static public void Main(string[] args)
        {
            try
            {
                // Obtain the target organization's Web address and client logon 
                // credentials from the user.
                ServerConnection serverConnect = new ServerConnection();
                ServerConnection.Configuration config = serverConnect.GetServerConfiguration();
                DumpEditableGridEntityInfo app = new DumpEditableGridEntityInfo();
                app.Run(config, false);                
            }
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine("Timestamp: {0}", ex.Detail.Timestamp);
                Console.WriteLine("Code: {0}", ex.Detail.ErrorCode);
                Console.WriteLine("Message: {0}", ex.Detail.Message);
                Console.WriteLine("Plugin Trace: {0}", ex.Detail.TraceText);
                Console.WriteLine("Inner Fault: {0}",
                    null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
            }
            catch (System.TimeoutException ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine("Message: {0}", ex.Message);
                Console.WriteLine("Stack Trace: {0}", ex.StackTrace);
                Console.WriteLine("Inner Fault: {0}",
                    null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("The application terminated with an error.");
                Console.WriteLine(ex.Message);

                // Display the details of the inner exception.
                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe
                        = ex.InnerException
                        as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>;
                    if (fe != null)
                    {
                        Console.WriteLine("Timestamp: {0}", fe.Detail.Timestamp);
                        Console.WriteLine("Code: {0}", fe.Detail.ErrorCode);
                        Console.WriteLine("Message: {0}", fe.Detail.Message);
                        Console.WriteLine("Plugin Trace: {0}", fe.Detail.TraceText);
                        Console.WriteLine("Inner Fault: {0}",
                            null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
                    }
                }
            }
            // Additional exceptions to catch: SecurityTokenValidationException, ExpiredSecurityTokenException,
            // SecurityAccessDeniedException, MessageSecurityException, and SecurityNegotiationException.

            finally
            {

                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }

        }
        #endregion Main

    }
}

Confira Também

Objetos e métodos de grade editável (referência do cliente)
TechNet: Tornar grades (listas) editáveis no Dynamics 365 usando o controle personalizado Grade editável

Microsoft Dynamics 365

© 2017 Microsoft. Todos os direitos reservados. Direitos autorais