Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo tem informações para ajudar a corrigir alguns dos problemas comuns que você pode encontrar ao trabalhar com formulários de aplicativo controlados por modelos.
Importante
- As ferramentas descritas neste artigo são projetadas para fins de solução de problemas; eles não devem ser usados em cenários de produção diários, mesmo que você possa usá-los para solucionar problemas em ambientes de produção.
- Essas ferramentas de solução de problemas afetam apenas a sessão do usuário atual, a menos que especificado de outra forma (por exemplo, quando uma aba do navegador acessa o aplicativo baseado em modelo). Elas não alteram as personalizações do sistema nem afetam outros usuários ou sessões. Depois que a sessão atual for fechada, o efeito não será mais aplicado.
- A maioria das ferramentas está disponível em todos os ambientes de produção. Alguns deles mencionados no artigo podem ainda não ser implantados em sua organização; novas ferramentas são adicionadas periodicamente.
- As ferramentas listadas neste artigo são escritas de maneira orientada a cenários. Você pode usá-los de forma independente para solucionar diferentes tipos de problemas.
- Use parâmetros de URL para desabilitar vários componentes de formulário e Exibir manipuladores de eventos e bibliotecas de formulário registrados no Monitor são ferramentas críticas e fundamentais que você usará frequentemente para diagnosticar muitos problemas.
- Para obter mais informações sobre como usar o Monitor, consulte Use Monitor para solucionar problemas de comportamento de formulário de aplicativo controlado por modelo
Usar parâmetros de URL para desabilitar vários componentes de formulário
Ao solucionar problemas com formulários, você precisa usar os parâmetros de URL para desabilitar componentes enquanto trabalha para isolar o componente específico que causou o problema. Recomendamos que você use os sinalizadores um de cada vez para restringir a causa do problema. Você pode usar os seguintes parâmetros de URL:
DisableFormCommandbar
Desabilita a barra de comandos no formulário. Ele desabilita apenas a barra de comandos em páginas de formulário e não oferece suporte para lista (tabela), painel, etc.
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormCommandbar=trueDesativarFormHandlers
Desabilita todos os manipuladores de formulário. Se você usar o sinalizador DisableFormHandlers=true , ele desabilita os seguintes manipuladores de eventos: OnLoad, OnSave, business rule, OnChange e TabStateChange.
Para saber mais sobre como obter índices de evento ou biblioteca para controles granulares, consulte Exibir manipuladores de eventos e bibliotecas de formulário registrados no monitor.
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormHandlers=true&flags=DisableFormHandlers=eventName
Desabilita o manipulador de formulários especificando o nome do evento, por exemplo, **DisableFormHandlers=onload.
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormHandlers=true&flags=DisableFormHandlers=eventName_index
Desabilita o manipulador de eventos no índice especificado para qualquer nome de evento com suporte. Por exemplo,
DisableFormHandlers=true_0desabilita todos os manipuladores de eventos no índice 0.DisableFormHandlers=onload_2desabilita o manipulador de eventos OnLoad no índice 2.&flags=DisableFormHandlers=eventName_startIndex_endIndex
Desabilita todos os manipuladores de eventos dentro do intervalo especificado especificando
startIndexeendIndexvalores (ambos estão incluídos). Por exemplo,DisableFormHandlers=true_0_2desabilita todos os manipuladores de eventos do índice 0, 1 e 2.DisableFormHandlers=onload_2_5desabilita o manipulador de eventos OnLoad do índice 2, 3, 4 e 5. Se você tiver mais manipuladores de eventos, poderá usar essa abordagem para restringir rapidamente os manipuladores problemáticos.Observação
As regras de negócios são criadas no designer de regras de negócios, compiladas no script do lado do cliente e registradas em vários eventos de formulário, como
OnLoad,OnSaveeOnChange. A maneira de desabilitar regras de negócios é semelhante a outros eventos de formulário. No entanto, há algumas diferenças importantes:- Quando você usa
DisableFormHandlers=true,businessrule,businessrule_*index*oubusinessrule_*startIndex_endIndex*, você está desabilitando todas as regras de negócios em todos os eventos de formulário nos quais eles estão registrados. - Por exemplo, a imagem a seguir mostra instruções sobre como atualizar regras de negócios no back-end. Você só precisa fazer isso uma vez em sua organização e pode reverter suas alterações após a solução de problemas.
- Depois de executar a ação acima e atualizar o formulário, você verá uma mensagem diferente com informações adicionais, conforme mostrado na imagem a seguir:
- Quando você usa
DesabilitarBibliotecasDeFormulários
Desabilita bibliotecas de formulários e impede que as bibliotecas sejam carregadas. Para saber mais sobre como obter índices de evento ou biblioteca para controles granulares, consulte Exibir manipuladores de eventos de formulário registrados e bibliotecas no monitor . O uso é semelhante a
DisableFormHandlers, exceto que ele não tem um nome de evento como o valor.- &flags=DisableFormLibraries=true: desabilite todas as bibliotecas de formulários.
- &flags=DisableFormLibraries=index: desabilite as bibliotecas de formulários no índice especificado.
- &flags=DisableFormLibraries=startIndex_endIndex: desabilitar bibliotecas de formulários no intervalo de startIndex e endIndex (ambos incluídos).
DisableWebResourceControls
Desabilita todos os controles de recursos da Web no formulário.
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableWebResourceControls=true
DesabilitarFormControl
Desativa um controle de formulário. Especifique o nome do controle para desabilitar o controle. Se você vir que o problema desaparece com &flags=DisableWebResourceControls=true e há mais de um controle de recurso da Web no formulário, você pode usar esse sinalizador para identificar ainda mais o controle que está causando o problema.
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormControl=controlnameDisableBusinessProcessFlow
Desabilita todos os fluxos de processo de negócios no formulário.
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableBusinessProcessFlow=trueNavbar Este não é um parâmetro de sinalizador ; em vez disso, use navbar=off na URL.
Você também pode adicionar vários parâmetros de URL separados com uma vírgula (,).
https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormHandlers=true,DisableWebResourceControls=true,DisableFormCommandbar=true,DisableBusinessProcessFlow=true&navbar=off
Observação
A diferença entre DisableFormHandlers e DisableFormLibraries é:
- O sinalizador DisableFormHandlers desabilita os manipuladores de formulário, independentemente das bibliotecas de formulários que contêm. Por outro lado, o sinalizador DisableFormLibraries desabilita as bibliotecas de formulários (recursos da Web), independentemente das funções (manipuladores de eventos) incluídas nas bibliotecas. Simplificando, DisableFormLibraries garante que os arquivos de recurso Web JavaScript especificados não sejam carregados.
- O sinalizador DisableFormHandlers não impede que a biblioteca de formulários que contém seja carregada. Portanto, ele não impede que o código JavaScript presente na biblioteca, mas não registrado como um manipulador de eventos, seja executado. Por exemplo, se uma biblioteca
new_myscript.jsde formulários for escrita da seguinte maneira (prática não recomendada): - Você deve começar com DisableFormHandlers para ver se o problema desaparece e, se não, você pode tentar DisableFormLibraries. Desativar qualquer script sempre envolve alguns riscos potenciais de quebrar seus cenários de formulário. No entanto, este último tende a ter mais efeitos colaterais devido à desabilitação de todos os arquivos JavaScript.
- Supondo que o
myOnloadHandleresteja registrado como umOnLoadmanipulador de eventos, o sinalizadorDisableFormHandlers=truesó impede o segundo alerta, enquanto o sinalizadorDisableFormLibraries=trueimpede ambos os alertas.
Exibir manipuladores e bibliotecas de eventos de formulário registrados no monitor
Para exibir identificadores e bibliotecas de eventos de formulário registrados, você pode exibir a FormEvents operação no Monitor.
Você precisa dos valores de parâmetro eventIndex e libraryIndex ao usar os sinalizadores de URL DisableFormHandlers ou DisableFormLibraries. Depois que um evento ou biblioteca estiver desabilitado, você verá o estado habilitado para eventos em ambas as operações FormEvents (uma exibição geral de todos os manipuladores de eventos registrados de todos os eventos) e FormEvents.operação eventName (detalhes registrados quando um evento específico acontece).
Comportamentos inesperados ao carregar um formulário
Alguns problemas comuns que podem causar um comportamento inesperado quando um formulário de aplicativo controlado por modelo é carregado são:
- Colunas ou controles não têm os valores esperados.
- Os controles não estão desabilitados ou não estão habilitados.
- Os controles não são mostrados ou não estão ocultos.
Como solucionar problemas
Há vários motivos pelos quais comportamentos inesperados ocorrem quando um formulário é aberto. Um dos mais comuns são os scripts OnLoad que são executados de forma síncrona ou assíncrona para alterar o comportamento da coluna ou do controle. Para determinar se o script está causando o problema, você pode desabilitar os manipuladores de formulário acrescentando &flags=DisableFormHandlers=true no final da URL do aplicativo.
Se o comportamento inesperado parar de ocorrer depois que você desabilitou o manipulador de formulários, é uma forte indicação de que o manipulador de formulário específico está causando esse comportamento. Ao identificar o script que está causando esse comportamento, siga o proprietário do script para solucionar ainda mais esse problema.
Mensagem de erro: salvamento em andamento
Às vezes, ao salvar um formulário, você vê uma mensagem de erro Salvando em Andamento .
Esse erro ocorre quando o evento OnSave do formulário é disparado antes da conclusão do evento OnSave anterior. Esse comportamento não tem suporte e o erro aparece por design porque chamar o OnSave evento antes que o evento anterior OnSave seja concluído causa loops de salvamento recursivos com consequências não intencionais.
Uma causa típica para esse erro é o script que chama o save() método no manipulador de eventos OnSave . Outra possível causa pode ser chamadas simultâneas save() no método setTimeout(), o que pode fazer com que o erro apareça intermitentemente, dependendo de a chamada anterior save() ter sido concluída antes de outra chamada save() ser feita.
Como solucionar problemas
No Monitor, a FormEvents.onsave operação fornece todos os detalhes que estão causando o erro (essa pilha de chamadas é modificada para fins de demonstração). A pilha de chamadas informa qual recurso exato da web, função, linha e número de coluna que estão causando esse erro. O verificador de formulário não poderá detectar o erro se o problema não puder ser reproduzido.
Acompanhe o proprietário do script para solucionar ainda mais o problema.
Erros de formulário intermitentes
A causa mais comum de erros de formulário intermitente ou aleatório é o uso de métodos de API do cliente sem suporte. Esses erros têm as seguintes características:
- Elas ocorrem apenas para registros, usuários, regiões ou navegadores específicos ou somente durante períodos em que a carga de rede ou serviço é alta.
- Eles raramente ocorrem em instâncias de suporte.
- Eles podem ocorrer uma vez em um computador e o mesmo erro poderá ocorrer novamente depois que você limpar o cache do navegador.
- formContext.getControl ou formContext.getControl(arg).getAttribute() retorna aleatoriamente nulo para um controle ou coluna válido.
Há muitas maneiras de escrever métodos de API de cliente não suportados, e todos eles compartilham um padrão comum: eles causam uma condição de corrida no pipeline de carregamento de formulário. Como introduzem uma condição de corrida, o problema só ocorre quando o script personalizado é executado antes de o formulário estar completamente pronto para ser acessado pela API do cliente. Muitos fatores podem causar uma condição de corrida:
No recurso Web JavaScript, o código é colocado em um escopo global e é executado imediatamente quando o arquivo de recurso da Web é carregado, sem esperar que o formulário esteja acessível. Verifique se o código é executado dentro de um manipulador de formulário válido, como um manipulador OnLoad .
No arquivo de script de componente da estrutura de componentes do Power Apps, os métodos de API do cliente são acessados dentro da função init ou updateView .
init()eupdateView()funções são executadas imediatamente quando o componente é carregado, sem esperar pelo acesso ao formulário. Você não pode usar métodos de API cliente sem suporte em componentes da estrutura de componentes do Power Apps.
A API do cliente é acessada dentro de uma window.setTimeout() função no arquivo de recurso da Web. O estado da página é imprevisível quando o setTimeout() método executa a função encapsulada. Devido à natureza da função de temporizador, quando a execução ocorre, a página pode estar em um estado de transição (durante o carregamento ou salvamento da página) que não é prontamente acessível pela API do Cliente.
Como solucionar problemas
Usando Monitor, você pode acessar informações que ajudam a determinar quando o acesso não suportado do cliente ocorreu e quando o acesso aconteceu no momento errado devido a uma condição de disputa. No entanto, o Verificador de Formulários não relata esse acesso de cliente sem suporte quando o código sem suporte é executado no momento certo que não causa um problema.
Observação
A pilha de chamadas é modificada para fins de demonstração. A pilha de chamadas mostra detalhes como recurso web, função e a linha que causa o erro.
Acompanhe o proprietário do script para solucionar ainda mais o problema.
O formulário ou registro não é salvo quando você tenta salvar o formulário
Uma causa comum é um manipulador de eventos OnSave que chama o método executionContext.getEventArgs().preventDefault() para cancelar a operação de salvamento.
Como solucionar problemas
No Monitor, a FormEvents.onsave operação fornece todos os detalhes de por que o evento de salvamento é cancelado, mais do que aqueles disponíveis na própria interface do usuário do formulário.
Acompanhe o proprietário do script para solucionar ainda mais o problema.
O formulário congela, carrega lentamente ou lança erros inexplicáveis
Há muitos motivos possíveis para um formulário congelar, carregar lentamente ou lançar um erro de script "O método de recurso da Web não existe" ou um erro que não é um erro de script comum. Alguns dos possíveis motivos incluem:
- Scripts
OnLoadruins. - Controles de recursos da Web.
- Scripts e regras para botões da faixa de opções.
- Solicitações de rede síncronas.
- Plug-ins personalizados.
- Erros de fluxo do processo empresarial.
Como solucionar problemas
Determine se o problema ocorre sem a necessidade de formulários. Se isso acontecer, há uma questão mais ampla que deve ser investigada fora do contexto do formulário. A propriedade real do problema depende dos detalhes específicos caso a caso.
- Se você acredita que esse problema ocorre apenas em formulários, consulte Usar parâmetros de URL para desabilitar vários componentes de formulário para restringir o componente que está causando o problema.
- Se você identificar que determinadas bibliotecas de formulários/arquivos de script causaram o problema, acompanhe o proprietário que fez essas personalizações para descobrir a causa raiz do problema.
- Se você identificar que os controles de recursos da Web são a causa do problema com o sinalizador DisableWebResourceControls, use o sinalizador
DisableFormControlpara desabilitar cada controle individualmente até que o problema não ocorra mais. O último controle desabilitado que não reproduz o problema é aquele que está causando o problema. Acompanhe o proprietário do controle para solucionar ainda mais o problema. - Se você identificar que o problema é causado pela barra de comandos/faixa de opções com o sinalizador DisableFormCommandbar , isso significa que isso não é um problema com o formulário, mas um problema com a barra de comandos. Use o Verificador de Comandos para solucionar problemas de comandos individuais e identificar qual deles está causando o problema.
Uma regra de negócios ou script personalizado não está funcionando
Esse problema ocorre se uma regra de negócios ou script personalizado que costumava funcionar no cliente Web herdado parou de funcionar na Interface Unificada. Um dos principais motivos para esse erro ocorrer é quando uma regra de negócios ou script na Interface Unificada faz referência a um controle que não está disponível na Interface Unificada.
Como solucionar problemas
Um dos motivos pelos quais a regra de negócios ou o script não está funcionando na Interface Unificada é que os controles que fazem parte deles não existem na Interface Unificada.
Os controles compostos existem no cliente Web, mas no controle composto da Interface Unificada é dividido em partes e armazenado de forma diferente. Por exemplo, se a coluna fullname faz parte da regra de negócios ou script personalizado, colunas firstnamemiddlenameou lastname deve ser usada em vez disso.
Depois de iniciar o verificador de formulários, você poderá ver mais detalhes na operação CompositeControl, incluindo o controle composto que está causando o problema. Também verá as colunas que podem ser usadas na regra de negócios ou no script personalizado e uma pilha de chamadas completa (modificada apenas para fins de demonstração).
Acompanhe o proprietário correspondente da regra de negócios ou do script personalizado para alterar o controle sugerido pelo verificador de formulários.
O item de menu relacionado não aparece na guia Relacionado
A maioria dos formulários tem uma guia Relacionado. Ele abre o Menu Relacionado com Itens de Menu Relacionados.
Um item de menu relacionado pode não aparecer conforme o esperado.
Como solucionar problemas
Um item de menu relacionado pode não aparecer porque:
A relação entre a tabela principal e a relacionada não está configurada corretamente
Deve existir uma relação um-para-muitos ou muitos-para-muitos entre a tabela principal e a tabela relacionada. Um formulário mostra uma linha da tabela principal. A tabela relacionada é a que deve aparecer no menu Relacionado do formulário. Se essas relações não existirem, o item de menu relacionado não será exibido.
Para verificar, acesse o portal do Power Apps, selecione Tabelas e selecione a tabela que tem as relações que você deseja exibir.
O Dataverse criou a relação entre a tabela principal e a tabela relacionada e não é personalizável
O menu Relacionado não mostra tabelas relacionadas de determinadas relações criadas pelo Dataverse. Essas relações são marcadas como não personalizáveis.
A propriedade AssociatedMenuConfiguration.IsCustomizable indica se a relação pode ser personalizada. A maneira mais fácil de verificar é consultando o relacionamento usando a Web API para exibir o tipo complexo de dados AssociatedMenuConfiguration.
Suponha que você queira verificar se a relação entre as tabelas Unidade de Negócios e Meta é personalizável. O objetivo desta relação é business_unit_goal. Insira esta URL no navegador:
GET [Organization URI]/api/data/v9.2/RelationshipDefinitions(SchemaName='business_unit_goal')/Microsoft.Dynamics.CRM.OneToManyRelationshipMetadata?$select=AssociatedMenuConfiguration
Você também pode obter os mesmos dados consultando a definição da tabela:
GET [Organization URI]/api/data/v9.2/EntityDefinitions(LogicalName='businessunit')/OneToManyRelationships(SchemaName='business_unit_goal')/AssociatedMenuConfiguration
A resposta de qualquer solicitação pode ter esta aparência:
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#RelationshipDefinitions/Microsoft.Dynamics.CRM.OneToManyRelationshipMetadata(AssociatedMenuConfiguration)/$entity",
"MetadataId": "2124b4bd-f013-df11-a16e-00155d7aa40d",
"AssociatedMenuConfiguration": {
"Behavior": "UseCollectionName",
"Group": "Details",
"Order": null,
"IsCustomizable": false,
"Icon": null,
"ViewId": "00000000-0000-0000-0000-000000000000",
"AvailableOffline": true,
"MenuId": null,
"QueryApi": null,
"Label": {
"LocalizedLabels": [],
"UserLocalizedLabel": null
}
}
}
Observe que IsCustomizable é false. Portanto, a relação não é personalizável e Meta não aparece no menu Relacionado .
A tabela relacionada não está habilitada para o Cliente Unificado
Se a tabela foi criada no Cliente Web (preterida desde 2019), ela pode não aparecer porque está desabilitada para o Unified Client.
Para verificar, acesse o Gerenciador de Soluções e selecione a tabela (entidade). Verifique se Habilitar para o Cliente Unificado está marcado.
As tabelas criadas com o designer moderno não têm esse problema. Eles estão sempre ativados para o Cliente Unificado.
Observação
Determinadas tabelas do sistema não podem ser habilitadas para o Cliente Unificado. Por exemplo, a Sessão de Processo não pode ser usada em aplicativos controlados por modelos.
O Histórico de Auditoria não aparece na guia Relacionado
O Histórico de Auditoria não está no menu Relacionado.
Como solucionar problemas
Não há suporte para o histórico de auditoria nesses casos:
- Tabelas que não estão habilitadas para auditoria. Verifique a propriedade IsAuditEnabled da tabela para confirmar.
- Tabelas do sistema que não dão suporte ao Histórico de Auditoria
- Aplicativos móveis
- Modo offline
- Dynamics for Outlook
Um item inesperado de menu relacionado aparece na aba relacionada
Um item de menu relacionado pode aparecer quando não deveria.
Como solucionar problemas
Um item de menu relacionado pode aparecer porque:
A tabela relacionada possui uma relação autorreferenciada de muitos-para-muitos com a tabela principal.
O sistema ignora personalizações XML de formulário para relacionamentos auto-referenciados muitos para muitos. O sistema ignora essas personalizações porque não é possível indicar se as personalizações são para a tabela primária ou para a tabela relacionada, que são ambas a mesma tabela nesse caso. Portanto, o sistema ignora essas personalizações.
Se você modificar o formulário XML para ocultar o item de menu relacionado, ele ainda será exibido. Todas as personalizações XML de formulário para relações de auto-referência são ignoradas, como alterar a ordem ou o rótulo do item relacionado.
Algumas tabelas do sistema não podem ser ocultadas
Por exemplo, tabelas personalizadas sempre mostram o item de menu Atividades relacionadas . Não é possível ocultá-lo com o designer de formulários ou modificando o XML do formulário.
Os itens de menu relacionados não são traduzidos conforme o esperado
O texto para itens de menu relacionados não está no idioma esperado.
Como solucionar problemas
Se alguns itens de menu relacionados estiverem sendo exibidos em um idioma diferente do idioma do usuário, verifique se o XML do formulário não tem rótulos traduzidos.
Verifique o formulário XML para ver se há rótulos definidos para cada idioma. Por exemplo, esse formulário XML mostra que o navContacts item tem apenas um rótulo de inglês dos EUA (1033): Contacts.
<NavBarByRelationshipItem Id="navContacts" Area="Sales" Sequence="10064" RelationshipName="contact_customer_accounts" Show="true">
<Titles>
<Title LCID="1033" Title="Contacts" />
</Titles>
</NavBarByRelationshipItem>
Para corrigir esse problema, adicione os rótulos traduzidos ao formulário XML. Por exemplo, este formulário XML mostra que o item navContacts possui rótulos tanto em inglês dos EUA (1033) quanto em alemão (1031).
<NavBarByRelationshipItem Id="navContacts" Area="Sales" Sequence="10064" RelationshipName="contact_customer_accounts" Show="true">
<Titles>
<Title LCID="1033" Title="Contacts" />
<Title LCID="1031" Title="Kontakte" />
</Titles>
</NavBarByRelationshipItem>
Se o texto do idioma do usuário não estiver definido, o sistema usará o idioma base da organização. Se isso também não existir, o sistema usará o texto em inglês dos EUA.
Por que um formulário está aparecendo ou não no seletor de formulário?
O seletor de formulário é uma lista suspensa que permite aos utilizadores alternar entre formulários diferentes de uma tabela específica.
Você precisa entender as condições que controlam se o formulário é exibido.
Como solucionar problemas
Um formulário está disponível no seletor quando todas essas condições são atendidas:
- O usuário tem permissão para acessar o formulário.
- O formulário é adicionado ao módulo do aplicativo.
- O formulário não está oculto com a API do Cliente.
- Para formulários de workspace do Dynamics Customer Service, ShowInFormSelector é definido como True.
Se um formulário não estiver sendo exibido no seletor de formulário,
- Verifique as funções de segurança do usuário afetado.
- Verifique se o formulário foi adicionado ao módulo do aplicativo.
- Desabilite scripts personalizados.
Por que um formulário padrão esperado não é mostrado por padrão?
Quando há vários formulários para uma tabela, o desejado não é usado como o padrão.
Como solucionar problemas
Os seguintes critérios determinam o primeiro formulário mostrado ao usuário:
- Se um formId for fornecido ao abrir um formulário, esse formulário será mostrado. Uma formId pode ser fornecida por meio de funções de API do Cliente, como openForm ou em uma URL.
- Caso contrário, o formulário mais recente escolhido pelo usuário será mostrado. O sistema se lembra da seleção mais recente do seletor de formulário.
- Se o usuário não tiver usado o seletor de formulário antes, o sistema usará a ordem do formulário.
Se o formulário não estiver disponível para o usuário, o sistema continuará encontrando um formulário apropriado para mostrar.
Um formulário está disponível para o usuário quando:
- O usuário tem permissão para acessar o formulário.
- O formulário é adicionado ao módulo do aplicativo.
Se nenhum formulário estiver disponível para o usuário, o formulário de fallback será usado.
Por que um controle está desabilitado/habilitado ou visível/oculto
Há muitas razões possíveis pelas quais um controle pode ser desabilitado ou oculto quando o formulário é carregado.
Como solucionar problemas
Você pode usar o Monitor para exibir a FormControls operação que inclui todos os detalhes sobre o estado de controle inicial quando o formulário é carregado.
Outro local para verificar é a operação ControlStateChange.visible ou ControlStateChange.disabled que explica por que o estado do controle é alterado para desabilitado ou visível a qualquer momento no formulário. Esta operação explica o estado de controle antes da alteração, a alteração de estado pretendida que pode ter êxito e o estado após a alteração. Nem todas as tentativas de alteração de estado de controle são bem-sucedidas. Para um controle desabilitado pelo formulário XML, você pode habilitá-lo por meio da API do cliente em um OnLoad manipulador de eventos. No entanto, se o controle estiver desabilitado por motivos de segurança, é altamente improvável que uma tentativa de habilitá-lo por meio da API do cliente altere com êxito o estado.
Um controle pode ser desabilitado usando a seguinte lista de regras em ordem. Se uma regra for atendida, as regras a seguir serão ignoradas. Se você quiser alterar se um controle está desabilitado, altere a entrada para a regra usada para o resultado ou para uma regra anterior na lista.
- Se os sinalizadores
DisableWebResourceControls=trueouDisableFormControl=<control name>forem passados e o controle for afetado por esses sinalizadores, o controle será desabilitado. - Se a tabela proprietária for somente leitura na Interface Unificada nas definições de tabela, o controle será desabilitado.
- Se a tabela não estiver disponível no modo offline, o controle será desabilitado.
- Se o usuário atual não tiver permissões de gravação no registro, o controle será desabilitado.
- Se a definição da coluna tiver
IsValidforCreatesido definida como false, o controle será desabilitado. - Se a definição da coluna tiver
IsValidforUpdatesido definida como false, o controle será desabilitado. - Se o usuário atual não tiver
Assign toprivilégios, a coluna de proprietário será desabilitada. - Se o usuário não tiver permissões de gravação na coluna definida pela segurança em nível de campo, o controle será desabilitado.
- Se um script de API do cliente habilitar ou desabilitar o controle, o estado desabilitado do controle respeitará essa configuração.
- Se o controle estiver desabilitado no designer de formulários, o controle será desabilitado.
- Se o usuário não tiver
Append Toprivilégio para a tabela do controle de pesquisa ouAppendprivilégio na tabela do registro atual, o controle de pesquisa será desabilitado
Por fim, se o controle passar por todas as verificações acima, o estado do registro determinará se o controle está desabilitado. O controle é habilitado por padrão em registros ativos e desabilitado em registros inativos.
Observação
A diferença entre FormControls e ControlStateChange é que a FormControls operação reflete o estado de controle inicial quando o formulário é carregado, enquanto a ControlStateChangeoperação reflete a alteração de estado a qualquer momento no formulário, seja durante a carga do formulário, em eventos OnChange ou OnSave depois que o formulário é carregado.
Importante
O estado oculto e desabilitado de um controle pode ser alterado várias vezes quando um formulário é carregado pela primeira vez. Para saber o motivo pelo qual um controle está oculto ou desabilitado, verifique a última operação registrada no monitor. Por exemplo, se não houver ControlStateChange.visible/ControlStateChange.hidden operações para o controle que está sendo investigado, o valor e o raciocínio estarão na FormControls operação. Caso contrário, é o valor e o motivo na últimaControlStateChange.visible/ControlStateChange.hidden operação. Você pode ordenar logs por carimbo de data/hora para buscar a última operação.
Por que um controle tem um determinado valor no carregamento do formulário
Um controle pode não ter um valor específico na carga do formulário como o usuário esperava.
Como solucionar problemas
Há muitas razões possíveis pelas quais o controle pode ter um valor quando um formulário é carregado. A ControlDefaultValue operação no Monitor explica a origem dos valores padrão.
Se várias atualizações estiverem ocorrendo com o valor de um controle, um Update Sequence indica o valor final. Por exemplo, aqui está um controle com um valor padrão e substituído por um valor passado com um script de API do cliente. Uma pilha de chamadas foi fornecida.
Há cenários em que as colunas são preenchidas com base em um mapeamento de coluna de relação, nesse caso, o evento mostra isso.
Verifique de onde o valor está vindo e execute uma ação com base na tabela a seguir:
| Fonte | Como corrigir |
|---|---|
| Script da API do cliente | Contate o proprietário do script. |
| Valor padrão | Verifique a configuração do controle. |
| Mapeamento de coluna de relação | Verifique a configuração de relação e atualize o mapeamento de coluna. |
| Valor fornecido pelos dados de entrada da página transmitidos via URL | Verifique a API que abre o formulário específico que apresenta o problema; ela está enviando o valor. |
Por que uma guia ou seção está visível ou oculta
Há muitos motivos possíveis pelos quais uma guia ou seção pode estar oculta ou visível.
Como solucionar problemas
As operações TabStateChange ou SectionStateChange no Monitor explicam uma alteração de estado visível, conforme mostrado na imagem a seguir. Se um script o causar, a pilha de chamadas revelará o arquivo de recurso web, número de linha e nome da função que causou esse comportamento.
Siga de acordo com a sugestão na razão do estado ou do proprietário das regras de negócios ou de recursos da web para alterar ou corrigir o comportamento.
Diálogos ou navegação inesperados
Há muitas razões possíveis pelas quais uma caixa de diálogo é exibida ou a navegação ocorre inesperadamente. Uma das causas comuns é que os métodos da API Xrm.Navigation são chamados para abrir um registro ou um formulário por um script personalizado. Por exemplo, quando você abre um formulário, um alerta é exibido, conforme mostrado na imagem a seguir.
Como solucionar problemas
A XrmNavigation operação no Monitor contém uma pilha de chamadas que ajuda a identificar o script que está causando um comportamento inesperado.
Acompanhe o proprietário do recurso da Web para alterar ou corrigir o comportamento.
Abrindo outro formulário em vez de um formulário de criação rápida
Ao abrir um formulário de criação rápida de uma consulta ou uma grade, pode-se abrir outro formulário (formulário de edição ou formulário principal) em vez do formulário de criação rápida. Há algumas razões pelas quais esse problema pode acontecer:
- O sinalizador de força de diálogo do formulário principal está sendo definido.
- O formulário de criação rápida não está disponível.
Como solucionar problemas
Você pode usar o Monitor para exibir a FormType operação que inclui todos os motivos pelos quais um formulário de criação rápida não é aberto.
Você precisa acompanhar o proprietário da tabela que desabilitou a criação rápida por meio de definições de tabela (metadados).
A tabela não aparece no submenu de menu de criação rápida
Ao abrir o menu de criação rápida global, nem todas as tabelas estão disponíveis. Alguns possíveis motivos:
- A tabela não está habilitada para criação rápida. Verifique se a tabela dá suporte à criação rápida e se ela está habilitada.
- A tabela não é adicionada ao aplicativo. Verifique se todos os componentes necessários são adicionados a um aplicativo.
- Nenhum formulário de criação rápida está disponível para a tabela. Crie um formulário de criação rápida.
- A tabela está em modo somente leitura.
- O usuário não tem permissão para acessar o formulário de criação rápida. Verifique se o usuário tem funções de segurança apropriadas.
- O usuário não tem privilégio de criação para a tabela.
- A tabela não dá suporte à criação de privilégios.
Como solucionar problemas
Você pode usar o Monitor para ver a QuickCreateMenu operação, que inclui todas as tabelas e os motivos pelos quais elas são filtradas do menu de criação rápida.
Confira os exemplos a seguir para entender os motivos da filtragem. Com base nas explicações, entre em contato com a parte responsável ou faça alterações adequadamente.
Mensagem inesperada de alterações não salvas
Ao trabalhar em formulários, você obtém a mensagem de alterações não salvas no rodapé do formulário quando navega do formulário atual ou salva o formulário sem alterações.
Como solucionar problemas
O erro de alterações não salvas aparece quando você altera o formulário e quando as alterações não são salvas. Se você não fez nenhuma alteração manualmente, elas podem vir de uma regra de negócios, plug-in ou JavaScript. Você pode usar o Monitor para exibir a UnsavedChanges operação que ajuda a localizar a origem das alterações. Você pode filtrar por OperationType UnsavedChanges.
A all attributes modified seção inclui um resumo rápido das colunas que causam o erro de alterações não salvas e seus valores. A unsaved changes seção mostra o que aconteceu com as colunas em detalhes. Para cada coluna, você pode ver uma lista de controles que podem estar causando uma alteração. A alteração de valor também é exibida (previousValue, newValue) e uma pilha de chamadas.
A captura de tela a seguir mostra a causa raiz do problema. Você pode ver que a alteração veio do OnLoad script.
Observação
Caso o usuário tenha realizado as alterações manualmente no formulário, uma pilha de chamadas não será fornecida.
Verifique de onde a alteração está vindo e se o comportamento é esperado ou não. Se um script causar a alteração, o recurso da Web original poderá ser rastreado novamente na pilha de chamadas. Na maioria dos casos, é um script. Tome uma decisão com base no próprio recurso da Web.
A coluna obrigatória de negócios não impede o salvamento
As colunas necessárias para negócios são um recurso de usabilidade que ajuda a impedir que os usuários salvem um registro com um valor vazio nessa coluna. Em aplicativos controlados por modelos e no Power Pages, os seguintes cenários não bloqueiam o salvamento de um registro quando uma coluna necessária tem um valor vazio:
- A coluna está oculta do formulário, devido às propriedades da coluna ou a um script do lado do cliente usando a API do cliente control.setVisible .
- A coluna está em uma aba de formulário ou seção oculta.
- Um script do lado do cliente altera o nível necessário da coluna usando a API do cliente setRequiredLevel.
- O usuário não está usando aplicativos controlados por modelos ou Power Pages para criar o registro. Os aplicativos cliente que usam APIs do Dataverse não são impedidos de salvar registros quando a coluna AttributeMetadata.RequirementLevel é definida como AttributeRequiredLevel.ApplicationRequired. Saiba mais sobre o nível de exigência da coluna
Quando precisar garantir a integridade dos dados, você deverá usar regras empresariais de entidade e outras validações no lado do servidor, como plug-ins síncronos.
Como solucionar problemas
A RequiredFieldValidation operação é registrada quando uma salvação é tentada, independentemente de salvar for bem-sucedida ou não. Esta operação explica por que cada empresa requer blocos de coluna ou não bloqueia a operação de salvamento.
A imagem a seguir é um exemplo dessa operação. A mensagem explica como ler os detalhados relatórios de cada coluna exigida. Neste exemplo, a coluna fax está associada a um controle, e o controle de mesmo nome é somente leitura. Portanto, ele não acionará a validação da coluna necessária.
A imagem a seguir ilustra outro exemplo em que jobtitle é uma coluna obrigatória no fluxo do processo de negócios, mas não no formulário, e a coluna não é modificada. Portanto, ela não bloqueia a operação de salvamento mesmo quando está vazia.
Acompanhamento
Na maioria das vezes, o comportamento é por design e a RequiredFieldValidation operação explica por que essa coluna se comporta de uma determinada maneira na operação de salvamento de formulários. Se a validação de coluna necessária for ignorada em uma coluna porque o controle está desabilitado ou oculto, como o primeiro exemplo ilustrado, consulte as sugestões do verificador de formulários para análise posterior.
Isso pode levar a outro cenário de solução de problemas, como Por que um controle está desabilitado/habilitado ou visível/oculto.
Não é possível criar um registro devido a permissões insuficientes para um campo protegido, mesmo que esse campo não esteja no formulário
Isso pode acontecer quando os usuários criam um registro (linha) de um formulário diferente. Eles recebem a mensagem de erro O usuário não tem permissões de criação para um campo protegido , mesmo que não tenha inserido um valor para esse campo (coluna) ou que o campo não esteja no formulário.
Quando a tabela A tem um campo de pesquisa para a tabela B, a criação de um registro A do registro B define automaticamente os campos de pesquisa nela como B, mesmo que esses campos não estejam no formulário.
Por exemplo:
- A tabela de contas tem um campo de pesquisa,
primarycontactid, para a tabela de contatos. - O usuário abre um formulário de contato para Robin Danielsen.
- O usuário abre o campo de pesquisa,
parentaccountidno formulário e seleciona o botão para criar uma nova conta. - O novo formulário de conta é aberto, com o
primarycontactidcampo automaticamente definido como Robin Danielsen.
Se o primarycontactid campo estiver protegido e o usuário não tiver permissões para editá-lo, ele receberá um erro ao tentar salvar a nova conta. Eles podem limpar o campo antes de salvá-lo. No entanto, se esse campo não estiver no formulário, eles não poderão limpá-lo. Uma solução alternativa é criar a conta na página da conta em vez de em um formulário de contato.
Algumas colunas não são exibidas na caixa de diálogo de mesclagem
A caixa de diálogo de mesclagem usa a definição de formulário principal padrão para a tabela e renderiza seletivamente a maioria, mas não todas as colunas na caixa de diálogo. Esta operação do Verificador de Formulário explica por que algumas das colunas não aparecem na caixa de diálogo de mesclagem, mesmo quando elas podem aparecer no formulário principal.
Como solucionar problemas
A operação a seguir MergeDialog.load explica o motivo pelo qual algumas colunas não são exibidas.
Neste exemplo, a coluna parentcustomerid no formulário de contato não é suportada na caixa de diálogo de mesclagem. A coluna de cartão de visita não é exibida porque a seção que contém está oculta na definição XML do formulário principal. Embora a exibição da seção proprietária no formulário principal por meio da API do cliente seja possível, a caixa de diálogo de mesclagem respeita a configuração XML do formulário, pois os manipuladores de eventos não têm suporte na caixa de diálogo de mesclagem.