Compartir vía


Solucionar problemas de formularios en aplicaciones basadas en modelos

Este artículo tiene informacion para ayudar a solucionar algunos de los problemas habituales que puede encontrar al trabajar con formularios de aplicaciones basadas en modelos.

Importante

  • Las herramientas descritas en este artículo están diseñadas para solucionar problemas. No están pensadas para usarse en escenarios de producción cotidianos, aunque puede usarse para solucionar problemas en entornos de producción.
  • Estas herramientas de solución de problemas solo afectan a la sesión de usuario actual a menos que se indique lo contrario (por ejemplo, cuando una pestaña del navegador obtenga acceso a la aplicación basada en el modelo). No cambian las personalizaciones del sistema ni afectan a otros usuarios o sesiones. Una vez cerrada la sesión actual, el efecto ya no se aplica.
  • La mayoría de las herramientas están disponibles en todos los entornos de producción. Es posible que algunos de los que se mencionan en el artículo aún no se hayan implementado en su organización; periódicamente se agregan nuevas herramientas.
  • Las herramientas que aparece en este artículo están escritas orientadas a escenarios. Puede usarlas de forma independiente para solucionar diferentes tipos de problemas.
  • Usar parámetros de URL para deshabilitar diversos componentes de formulario y Ver bibliotecas y controladores de eventos de formularios registrados en Monitor son herramientas fundamentales y críticas que utilizará con frecuencia para solucionar problemas de muchos escenarios.
  • Para obtener más información sobre cómo utilizar Monitor, consulte Utilice Monitor para solucionar problemas de comportamiento de formularios de aplicaciones basadas en modelos

Use parámetros de URL para deshabilitar varios componentes de formulario

Cuando esté solucionando problemas con formularios, debe usar los parámetros de URL para deshabilitar componentes mientras trabaja para aislar el componente específico que provocó el problema. Le recomendamos que utilice los indicadores uno a la vez para delimitar la causa del problema. Puede usar los siguientes parámetros de URL:

  • DisableFormCommandbar

    Desactiva la barra de comandos del formulario. Solo deshabilita la barra de comandos en las páginas de formulario y no admite listas (cuadrícula), panel, etc.

    https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormCommandbar=true
    
  • DisableFormHandlers

    Deshabilita todos los controladores de formularios. Si usa el indicador DisableFormHandlers=true, deshabilita los siguientes controladores de eventos: OnLoad, OnSave, de reglas de negocio, OnChange y TabStateChange.

    Para obtener más información sobre cómo obtener índices de bibliotecas o eventos para controles granulares, consulte Ver bibliotecas y controladores de eventos de formularios registrados en el 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

      Deshabilita el controlador de formularios especificando el nombre del evento, por ejemplo, **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

      Inhabilita el controlador de eventos en el índice especificado para cualquier nombre de evento admitido. Por ejemplo, DisableFormHandlers=true_0 deshabilita todos los controladores de eventos en el índice 0. DisableFormHandlers=onload_2 deshabilita el controlador de eventos OnLoad en el índice 2.

    • &flags=DisableFormHandlers=eventName_startIndex_endIndex

      Deshabilita todos los controladores de eventos dentro del rango determinado especificando los valores startIndex y endIndex (ambos están incluidos). Por ejemplo, DisableFormHandlers=true_0_2 deshabilita todos los controladores de eventos del índice 0, 1 y 2. DisableFormHandlers=onload_2_5 deshabilita el controlador de eventos OnLoad del índice 2, 3, 4 y 5. Si tiene más controladores de eventos, puede utilizar este enfoque para restringir rápidamente los controladores problemáticos.

    Nota

    Las reglas de negocio se crean en el diseñador de reglas de negocio, se compilan en el script del lado del cliente y se registran en varios eventos de formulario, como OnLoad, OnSave y OnChange. La forma de deshabilitar las reglas de negocio es muy similar a la de otros eventos de formulario. Sin embargo, hay algunas diferencias fundamentales:

    • Cuando usa DisableFormHandlers=true, businessrule, businessrule_*index* o businessrule_*startIndex_endIndex*, está deshabilitando las reglas de negocio en todos los eventos de formulario en los que están registrados.
    • Por ejemplo, la imagen siguiente muestra instrucciones sobre cómo actualizar reglas de negocio en el back-end. Solo necesita hacerlo una vez en su organización y puede revertir los cambios después de solucionar el problema.
      Actualizar reglas de negocio
    • Después de realizar la acción anterior y actualizar el formulario, verá un mensaje diferente con información adicional, como se muestra en la imagen siguiente:
      Control individual de reglas de negocio
  • DisableFormLibraries

    Deshabilita las bibliotecas de formularios y evita que se carguen. Para obtener más información sobre cómo obtener índices de bibliotecas o eventos para controles granulares, consulte Ver bibliotecas y controladores de eventos de formularios registrados en el monitor. El uso es similar a DisableFormHandlers, excepto que no toma un nombre de evento como valor.

    • &flags=DisableFormLibraries=true: deshabilita todas las bibliotecas de formularios.
    • &flags=DisableFormLibraries= index**: deshabilita las bibliotecas de formularios en el índice especificado.
    • &flags=DisableFormLibraries= startIndex_endIndex**: deshabilita las bibliotecas de formularios en el rango de startIndex y endIndex (ambos incluidos).
  • DisableWebResourceControls

    Deshabilita todos los controles de recursos web del formulario.

    https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableWebResourceControls=true
    

    Deshabilitar recurso web

  • DisableFormControl

    Deshabilita un control de formulario. Especifique el nombre del control para deshabilitar el control. Si ve que el problema desaparece con &flags=DisableWebResourceControls=true, y hay más de un control de recursos web en el formulario, puede usar esta marca para identificar mejor el control que está causando el problema.

    https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableFormControl=controlname
    
  • DisableBusinessProcessFlow

    Deshabilita todos los flujos de proceso de negocio del formulario.

    https://myorg.crm.dynamics.crm/main.aspx?appid=00000000-0000-0000-0000-000000000000&pagetype=entityrecord&id=00000000-0000-0000-0000-000000000000**&flags=DisableBusinessProcessFlow=true
    
  • navbar Esto no es un parámetro marca; en su lugar, use navbar=off en la URL.

También puede agregar varios parámetros de URL separados por una coma (,).

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

Nota

La diferencia entre DisableFormHandlers y DisableFormLibraries es:

  • La marca DisableFormHandlers deshabilita los controladores de formularios independientemente de las bibliotecas que contengan formularios . En contraste, la marca DisableFormLibraries deshabilita las bibliotecas de formularios (recursos web) independientemente de las funciones (controladores de eventos) incluidas en las bibliotecas. En pocas palabras, DisableFormLibraries asegura que los archivos de recursos web JavaScript especificados no estén cargados.
  • La marca DisableFormHandlers no evita que se cargue la biblioteca de formularios. Por lo tanto, no detiene la ejecución del código JavaScript presente en la biblioteca pero no registrado como controlador de eventos. Por ejemplo, si una biblioteca de formularios new_myscript.js está escrita de la siguiente manera (práctica no recomendada):
  • Debería empezar por DisableFormHandlers para ver si el problema desaparece, y si no, puede intentar DisableFormLibraries. Deshabilitar cualquier script siempre implica algunos riesgos de romper potencialmente los escenarios de su formulario. Sin embargo, estos últimos tienden a tener más efectos secundarios debido a la deshabilitación de todos los archivos JavaScript. Diferencia entre DisableFormHandlers y DisableFormLibraries
  • Asumiendo que myOnloadHandler está registrado como controlador de eventos OnLoad, la marca DisableFormHandlers=true solo evita la segunda alerta, mientras que la marca DisableFormLibraries=true evita ambas alertas.

Ver bibliotecas y controladores de eventos de formularios registrados en el monitor

Para ver bibliotecas y controladores de eventos de formulario registrados, puede ver la operación FormEvents Monitor.

Eventos de formularios

Necesita los valores de parámetro eventIndex y libraryIndex cuando use los indicadores URL DisableFormHandlers DisableFormLibraries. Una vez que se deshabilita un evento o una biblioteca, verá el estado habilitado del evento tanto en la operación FormEvents (una vista general de todos los controladores de eventos registrados de todos los eventos), como en la operación FormEvents.eventName (detalles registrados cuando ocurre un evento específico).

Eventos de formulario OnLoad

Comportamientos inesperados al cargar un formulario

Algunos problemas comunes que pueden causar un comportamiento inesperado cuando se carga un formulario de aplicación basado en modelos son:

  • Las columnas o los controles no tienen los valores esperados.
  • Los controles no están deshabilitados o no están habilitados.
  • Los controles no aparecen o no están ocultos.

Cómo solucionar problemas

Hay varias razones por las que se producen comportamientos inesperados cuando se abre un formulario. Uno de los más comunes son los scripts OnLoad que se ejecutan de forma sincrónica o asincrónica para cambiar la columna o controlar el comportamiento. Para determinar si su secuencia de comandos está causando el problema, puede deshabilitar los controladores de formulario agregando &flags=DisableFormHandlers=true al final de la URL de su aplicación.

Si el comportamiento inesperado deja de producirse después de que deshabilitó el controlador de formulario, es un indicio claro de que el controlador de formulario específico está provocando este comportamiento. Al identificar el script problemático que está causando este comportamiento, realice el seguimiento con el propietario del script para solucionar este problema.

Mensaje de error de guardado en curso

A veces, al guardar un formulario, aparece un mensaje de error Guardado en curso.

Este error ocurre cuando el formulario de evento OnSave se activa antes que el anterior evento OnSave se completa. Este comportamiento no se admite y el error aparece por diseño porque llamar al evento OnSave antes de que el evento OnSave anterior esté completo causa bucles de guardado recursivos con consecuencias no deseadas.

Una causa típica de este error es el script que llama al método save() en el controlador de eventos OnSave. Otra posible causa pueden ser llamadas concurrentes save() en el método setTimeout(), que puede hacer que el error aparezca de forma intermitente, dependiendo de si la llamada save() se completó antes de que se realizase otra llamada save().

Cómo solucionar problemas

En Monitor, la operación FormEvents.onsave proporciona todos los detalles que están causando el error (esta pila de llamadas se modifica con fines de demostración). La pila de llamadas indica qué recurso web, función, línea y número de fila exactos causan este error. El comprobador de formularios no puede detectar el error si no se puede reproducir el problema.

Error Guardar en progreso

Realice un seguimiento con el propietario del script para solucionar el problema.

Errores intermitentes de formulario

La causa más común de errores de formulario intermitentes o aleatorios es el uso de métodos de API de cliente no admitidos. Estos errores tienen las siguientes características:

  • Se producen solo para registros, usuarios, regiones o navegadores específicos, o solo durante períodos en los que la carga de la red o del servicio es alta.

  • Rara vez se producen en instancias de soporte.

  • Pueden ocurrir una vez en un ordenador y el mismo error puede ocurrir nuevamente después de borrar la caché del navegador.

  • formContext.getControl o formContext.getControl (arg).getAttribute () devuelven aleatoriamente un valor nulo para un control o columna válido.

Hay muchas formas de escribir métodos de API de cliente no admitidos y todos comparten un patrón común: provocan una condición de carrera en la canalización de carga del formulario. Debido a que introducen una condición de carrera, el problema solo se produce cuando el script personalizado se ejecuta antes de que el formulario esté completamente listo para obtener acceso a él a través de la API del cliente. Muchos factores pueden causar una condición de carrera:

  • En el recurso web de JavaScript, el código se coloca en un ámbito global que se ejecuta inmediatamente cuando se carga el archivo de recursos web, sin esperar a que se pueda acceder al formulario. Asegúrese de que el código se ejecute dentro de un controlador de formulario válido, como un controlador OnLoad.

    Método de API de cliente no admitido

  • En el archivo de script de componente de Power Apps Component Framework se accede a los métodos de API del cliente dentro de la función init o updateView. Las funciones init() y updateView() se ejecutan inmediatamente cuando se carga el componente, sin esperar a que el formulario sea fácilmente accesible. No puede utilizar métodos de API de cliente no compatibles en componentes de Power Apps Component Framework.

Se obtiene acceso a la API del cliente dentro de una función window.setTimeout() en el archivo de recursos web. El estado de la página es impredecible cuando el método setTimeout() ejecuta la función ajustada. Debido a la naturaleza de la función del temporizador, cuando se produce la ejecución, la página puede estar en un estado de transición (durante la carga o el guardado de la página) a la que la API del cliente no puede obtener acceso fácilmente.

Cómo solucionar problemas

Con Monitor, puede obtener acceso a la información que le ayuda a determinar cuándo se produjo el acceso de cliente no admitido y cuándo ocurrió el acceso en el momento equivocado debido a una condición de carrera. Sin embargo, el comprobador de formularios no notifica sobre dicho acceso de cliente no admitido cuando el código no admitido se ejecute en el momento adecuado y no cause ningún problema.

API de cliente no admitido

Nota

La pila de llamadas se ha modificado con fines ilustrativos. La pila de llamadas muestra detalles como el recurso web, la función y la línea que causa el error.

Realice un seguimiento con el propietario del script para solucionar el problema.

El formulario o registro no se guarda cuando intenta guardar el formulario

Una causa común es un controlador de eventos OnSave que llama al método executionContext.getEventArgs().preventDefault() para cancelar la operación de guardado.

Cómo solucionar problemas

En Monitor, la operación FormEvents.onsave proporciona todos los detalles de por qué se cancela el evento de guardado, más detalles que los que están disponibles en la propia interfaz de usuario del formulario.

Error de registro no guardado

Realice un seguimiento con el propietario del script para solucionar el problema.

El formulario se congela, se carga lentamente o arroja errores inexplicables

Hay muchas razones posibles por las que un formulario se queda bloqueado, se carga lentamente o genera un error de script "El método de recurso web no existe" o un error que no es un error de script común. Entre las razones posibles se encuentran:

  • Scripts OnLoad malos.
  • Controles de recursos web.
  • Reglas y secuencias de comandos de los botones de la cinta.
  • Solicitudes de red sincrónicas.
  • Complementos personalizados.
  • Error en el flujo de proceso de negocio.

Cómo solucionar problemas

Determine si el problema se reproduce sin involucrar formularios. Si es así, hay un problema más amplio que debe investigarse fuera del contexto del formulario. La propiedad real del problema depende de los detalles particulares caso por caso.

  • Si cree que este problema solo se produce en formularios, consulte Usar parámetros de URL para deshabilitar diversos componentes de formulario para restringir el componente que está causando el problema.
  • Si identifica que el problema lo causan determinadas bibliotecas de formularios/archivos de script, realice un seguimiento con el propietario que realizó estas personalizaciones para averiguar la causa raíz del problema.
  • Si identifica que los controles de recursos web causan el problema con la marca DisableWebResourceControls, puede usar la marca DisableFormControl para deshabilitar cada uno de uno en uno hasta que el problema deje de reproducirse. El último control deshabilitado que no reproduce el problema es el que lo está causando. Realice un seguimiento con el propietario del control para solucionar el problema.
  • Si identifica que el problema lo causa la barra de comandos o la cinta con la marca DisableFormCommandbar, significa que no es un problema con el formulario, sino un problema con la barra de comandos. Use el comprobador de comandos para solucionar problemas de comandos individuales e identificar cuál está causando el problema.

Una regla de negocio o un script personalizado no funciona

Este problema se produce si una regla de negocio o un script personalizado que solía funcionar en el cliente web heredado dejó de funcionar en la Interfaz unificada. Una de las principales razones por las que se produce este error es cuando una regla de negocio o un script en Interfaz unificada hace referencia a un control que no está disponible en Interfaz unificada.

Cómo solucionar problemas

Una de las razones por las que la regla de negocio o el script no funcionan en la Interfaz unificada es que los controles que forman parte de ellos no existen en la Interfaz unificada. Los controles compuestos existen en el cliente web, pero en la Interfaz unificada el control compuesto se divide en partes y se almacena de manera diferente. Por ejemplo, si la columna fullname forma parte de la regla de negocio o del script personalizado, deben usarse las columnas firstname, middlename o lastname en su lugar.

Una vez que inicie el comprobador de formularios, puede ver más detalles en la operación CompositeControl que incluye el control compuesto que está causando el problema, las columnas que se pueden usar en la regla de negocio o el script personalizado en su lugar y una pila de llamadas completa (la pila de llamadas se modifica con fines de demostración).

El script personalizado no funciona

Realice un seguimiento con el propietario correspondiente de la regla de negocio o el script personalizado para cambiar el control sugerido por el comprobador de formularios.

La mayoría de los formularios tienen una pestaña Relacionados. Abre el Menú relacionado con los Elementos de menú relacionados.

Pestaña relacionada en un formulario, expandida

Es posible que un elemento de menú relacionado no aparezca como se esperaba.

Cómo solucionar problemas

Es posible que un elemento de menú relacionado no aparezca porque:

Debe haber una relación de uno a muchos o de muchos a muchos entre la tabla principal y la tabla relacionada. Un formulario muestra una fila de la tabla principal. La tabla relacionada es la que debe aparecer en el menú Relacionados del formulario. Si estos Relaciones no existen, el elemento del menú relacionado no aparece.

Para verificar, vaya al portal de Power Apps, seleccione Tablas y seleccione la tabla que tiene el Relaciones que desea. para ver.

El menú Relacionados no muestra tablas relacionadas de ciertos Relaciones creados por Dataverse. Estas relaciones están marcadas como no personalizables.

La propiedad AssociatedMenuConfiguration.IsCustomizable indica si la relación se puede personalizar. La forma más sencilla de comprobarlo es consultar la relación mediante la API web para ver los datos del tipo complejo AssociatedMenuConfiguration .

Supongamos que desea comprobar si la relación entre las tablas Unidad de negocio y Objetivo es personalizable. El SchemaName de esta relación es business_unit_goal. Escriba esta dirección URL en el explorador:

GET [Organization URI]/api/data/v9.2/RelationshipDefinitions(SchemaName='business_unit_goal')/Microsoft.Dynamics.CRM.OneToManyRelationshipMetadata?$select=AssociatedMenuConfiguration

También puede obtener los mismos datos consultando la definición de la tabla:

GET [Organization URI]/api/data/v9.2/EntityDefinitions(LogicalName='businessunit')/OneToManyRelationships(SchemaName='business_unit_goal')/AssociatedMenuConfiguration

La respuesta para cualquiera de las solicitudes podría verse así:

{
    "@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 es false. Por lo tanto, la relación no es personalizable y el Objetivo no aparece en el menú Relacionado.

Si la tabla se creó en Web Client (obsoleta desde 2019), es posible que no aparezca porque está deshabilitada para Unified Client.

Para verificar, vaya al Explorador de soluciones y seleccione la tabla (entidad). Asegúrese de que Habilitar para cliente unificado esté marcado.

El explorador de soluciones muestra que una entidad no está habilitada para Unified Client

Las tablas creadas con el diseñador moderno no tienen este problema. Están siempre habilitadas para el cliente unificado.

Nota

Algunas de las tablas del sistema no se pueden habilitar para el cliente unificado. Por ejemplo, Sesión de proceso no se puede utilizar en aplicaciones basadas en modelos.

Historial de auditoría no está en el menú relacionado.

Cómo solucionar problemas

El historial de auditoría no es compatible en estos casos:

Un Elemento de menú relacionado puede aparecer cuando no debería.

Cómo solucionar problemas

Es posible que un elemento de menú relacionado aparezca porque:

El sistema ignora las personalizaciones de formularios XML para relaciones de varios a varios autorreferenciales. El sistema ignora estas personalizaciones porque no es posible indicar si las personalizaciones son para la tabla principal o la tabla relacionada, que en este caso son la misma tabla. Por tanto, el sistema ignora estas personalizaciones.

Si modifica el formulario XML para ocultar el elemento de menú relacionado, seguirá apareciendo. Se ignoran todas las personalizaciones de formulario XML para relaciones autorreferenciales, como cambiar el orden o la etiqueta del elemento relacionado.

Algunas tablas del sistema no se pueden ocultar

Por ejemplo, las tablas personalizadas siempre muestran el elemento de menú relacionado Actividades. No es posible ocultarlo con el diseñador de formularios o modificando el formulario XML.

El texto de los elementos del menú relacionados no está en el idioma esperado.

Cómo solucionar problemas

Si algunos elementos del menú relacionados se muestran en un idioma diferente al idioma del usuario, compruebe si al formulario XML le faltan etiquetas traducidas.

Consulte el formulario XML para ver si hay etiquetas definidas para cada idioma. Por ejemplo, este formulario XML muestra que el elemento navContacts solo tiene una etiqueta en inglés de EE. UU. (1033): Contacts.

<NavBarByRelationshipItem Id="navContacts" Area="Sales" Sequence="10064" RelationshipName="contact_customer_accounts" Show="true">
  <Titles>
    <Title LCID="1033" Title="Contacts" />
  </Titles>
</NavBarByRelationshipItem>

Para solucionar este problema, agregue las etiquetas traducidas al formulario XML. Por ejemplo, este formulario XML muestra que el elemento navContacts tiene etiquetas tanto en inglés EE. UU. (1033) como en alemán (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>

Si el texto para el idioma del usuario no está definido, el sistema utiliza el idioma base de la organización. Si tampoco existe, el sistema utiliza el texto en inglés EE. UU.

¿Por qué un formulario se muestra o no en el selector de formularios?

El selector de formulario es un menú desplegable que permite a los usuarios cambiar entre diferentes formularios para una tabla en particular.

Selector de formulario ampliado, que muestra diferentes formularios disponibles

Debe comprender las condiciones que controlan si se muestra el formulario.

Cómo solucionar problemas

Un formulario está disponible en el selector cuando se cumplen todas estas condiciones:

  1. El usuario tiene permiso para acceder al formulario.
  2. El formulario se agrega al módulo de la aplicación.
  3. El formulario no está oculto con la API del cliente.
  4. Para los formularios de Customer Service workspace, ShowInFormSelector está establecido en True.

Si un formulario no se muestra en el selector de formularios,

  1. Verifique los roles de seguridad del usuario afectado.
  2. Compruebe si el formulario está agregado al módulo de la aplicación.
  3. Deshabilitar scripts personalizados.

¿Por qué un formulario predeterminado esperado no se muestra de forma predeterminada?

Cuando hay varios formularios para una tabla, el deseado no se utiliza como predeterminado.

Cómo solucionar problemas

Los siguientes criterios determinan el primer formulario que se muestra al usuario:

  1. Si se proporciona un formId al abrir un formulario, entonces se muestra ese formulario. Se puede proporcionar un formId a través de funciones de la API del cliente como openForm o en una URL.
  2. De lo contrario, se muestra el formulario más reciente que eligió el usuario. El sistema recuerda la última selección del selector de formulario.
  3. Si el usuario no ha utilizado el selector de formulario antes, el sistema utiliza el orden de formulario.

Si el formulario no está disponible para el usuario, el sistema continúa buscando un formulario apropiado para mostrar.

Un formulario está disponible para el usuario cuando:

  1. El usuario tiene permiso para acceder al formulario.
  2. El formulario se agrega al módulo de la aplicación.

Si no hay formularios disponibles para el usuario, se utiliza formulario de reserva.

Por qué un control está habilitado/deshabilitado o visible/oculto

Hay muchas razones posibles por las que un control puede estar deshabilitado u oculto cuando se carga el formulario.

Cómo solucionar problemas

Puede usar Monitor para ver la operación FormControls que incluye todos los detalles sobre el estado de control inicial cuando se carga el formulario.

Comprobación de controles de formularios

Otro lugar para comprobar es la operación ControlStateChange.visible o ControlStateChange.disabled que explica por qué se cambia el estado visible o deshabilitado del control en cualquier momento en el formulario. Esta operación explica el estado del control antes del cambio, el cambio de estado previsto que podría tener éxito y el estado después del cambio. No todos los intentos de cambio de estado de control tienen éxito. Para un control deshabilitado por formulario XML, puede habilitarlo a través de la API del cliente en un controlador de eventos OnLoad. Sin embargo, si el control está deshabilitado por razones de seguridad, es muy poco probable que un intento de habilitarlo a través de la API del cliente cambie el estado correctamente.

Estado de control cambiado

Un control puede desactivarse usando la siguiente lista de reglas en orden. Si se cumple una regla, se ignoran las siguientes reglas. Si desea cambiar si un control está deshabilitado, debe cambiar la entrada a la regla utilizada para el resultado o a una regla anterior en la lista.

  • Si los indicadores DisableWebResourceControls=true o DisableFormControl=<control name> se pasan y el control se ve afectado por estos indicadores, el control se desactiva.
  • Si la tabla propietaria es de solo lectura en la interfaz unificada en las definiciones de tabla, el control está deshabilitado.
  • Si la tabla no está disponible en modo desconectado, el control está deshabilitado.
  • Si el usuario actual no tiene permisos de escritura en el registro, el control está deshabilitado.
  • Si la definición de la columna tiene IsValidforCreate establecido en falso, el control está deshabilitado.
  • Si la definición de la columna tiene IsValidforUpdate establecido en falso, el control está deshabilitado.
  • Si el usuario actual no tiene el privilegio Assign to, la columna de propietario está deshabilitada.
  • Si el usuario no tiene permisos de escritura en la columna definida por la seguridad a nivel de campo, el control está deshabilitado.
  • Si un script de API de cliente habilita o deshabilita el control, el estado deshabilitado del control respeta esa configuración.
  • Si el control está deshabilitado en diseñador de formularios, el control está deshabilitado.
  • Si el usuario no tiene el privilegio Append To para la tabla del control de búsqueda, o el privilegio Append en la tabla del registro actual, el control de búsqueda está deshabilitado.

Finalmente, si el control pasa todas las comprobaciones anteriores, el estado de registro determina si el control está deshabilitado. El control está habilitado por defecto en registros activos y deshabilitado en registros inactivos.

Nota

La diferencia entre FormControls y ControlStateChange es que la operación FormControls refleja el estado de control inicial cuando se carga el formulario, mientras que la operación ControlStateChange refleja el cambio de estado en cualquier momento en el formulario, ya sea durante la carga del formulario, en los eventos OnChange u OnSave después de que se cargue el formulario.

Importante

El estado oculto y deshabilitado de un control puede cambiar varias veces cuando se carga un formulario por primera vez. Para saber la razón por la que un control está oculto o deshabilitado, asegúrese de marcar la última operación registrada en el monitor. Por ejemplo, si no hay operaciones ControlStateChange.visible/ControlStateChange.hidden para el control que se investiga, el valor y el razonamiento estarán en la operación FormControls. De lo contrario, será el valor y la razón en la última operación ControlStateChange.visible/ControlStateChange.hidden. Puede ordenar los registros por marca de tiempo para buscar la última operación.

Por qué un control tiene un determinado valor al cargar el formulario

Un control podría no tener un valor específico en la carga del formulario como esperaba el usuario.

Cómo solucionar problemas

Hay muchas razones posibles por las que el control puede tener un valor cuando se carga un formulario. La operación ControlDefaultValue de Monitor explica el origen de los valores predeterminados.

Valor de control predeterminado

Si se producen varias actualizaciones en el valor de un control, Update Sequence indica el valor final. Por ejemplo, aquí hay un control con un valor predeterminado y luego se reemplaza con un valor pasado con un script de API de cliente. Se proporciona una pila de llamadas.

Valor anterior del control

Hay escenarios en los que las columnas se rellenan en función de una asignación de columnas de relación, en cuyo caso el evento lo muestra.

Valor posterior del control

Compruebe de dónde proviene el valor y tome medidas según la siguiente tabla:

Código fuente Cómo corregir
Script de API de cliente Póngase en contacto con el propietario del script.
Valor predeterminado Compruebe la configuración del control.
Asignación de columnas de relación Compruebe la configuración de la relación y actualice la asignación de columnas.
Valor pasado por los datos de entrada de página transmitidos a través de la URL Compruebe que la API que abre el formulario concreto que tiene el problema pasa el valor.

Por qué una pestaña o sección está visible u oculta

Hay muchas razones posibles por las que una pestaña o sección puede estar oculta o visible.

Cómo solucionar problemas

Las operaciones TabStateChange o SectionStateChange en Monitor explican el cambio de estado visible, como se muestra en la siguiente imagen. Si un script lo causa, la pila de llamadas revelaría el archivo de recursos web, el número de línea y el nombre de la función que causó este comportamiento.

Sección pestaña

Realice un seguimiento de acuerdo con la sugerencia en el motivo del estado o el propietario del recurso web/reglas de negocio para cambiar o corregir el comportamiento.

Navegación o cuadros de diálogo inesperados

Hay muchas razones posibles por las que aparece un cuadro de diálogo o la navegación se produce de forma imprevista. Una de las causas comunes es que los métodos API Xrm.Navigation se llaman para abrir un registro o un formulario mediante un script personalizado. Por ejemplo, cuando abre un formulario, aparece una alerta, como se muestra en la siguiente imagen.

Cuadro de diálogo de alerta

Cómo solucionar problemas

La operación XrmNavigation en Monitor contiene una pila de llamadas que le ayuda a identificar el script que está causando un comportamiento imprevisto.

Operación XrmNavigation en el monitor

Realice un seguimiento con el propietario del recurso web para cambiar o corregir el comportamiento.

Abriendo otro formulario en lugar de un formulario de creación rápida

Al abrir un formulario de creación rápida desde una búsqueda o una cuadrícula, se podría abrir otro formulario (formulario principal o de edición) en lugar de un formulario de creación rápida. Hay algunas razones por las que el problema puede suceder:

  • Se está estableciendo el indicador para forzar del cuadro de diálogo del formulario principal.
  • El formulario de creación rápida no está disponible.

Cómo solucionar problemas

Puede usar Monitor para ver la operación FormType que incluye todas las razones por las que no se abre un formulario de creación rápida.

La tabla no está habilitada para la creación rápida

Debe realizar un seguimiento con el propietario de la tabla que ha deshabilitado la creación rápida a través de definiciones de tabla (metadatos).

La tabla no aparece en el menú flotante de creación rápida

Al abrir el menú desplegable de creación rápida global, no todas las tablas están disponibles. Hay algunas razones por las que las tablas se filtran en esta lista:

  • No hay un formulario de creación rápida disponible para la tabla.
  • La tabla no está habilitada para el formulario de creación rápida.
  • La tabla no está habilitada para la nueva Interfaz unificada.
  • La tabla es de solo lectura en la Interfaz unificada.
  • La visibilidad del cliente móvil de la tabla no se puede modificar.
  • La tabla no forma parte del módulo de la aplicación.
  • El usuario no tiene privilegios de creación en la tabla.
  • El privilegio de creación no es compatible con la tabla.

Cómo solucionar problemas

Puede usar Monitor para ver la operación QuickCreateMenu, que incluye todas las tablas y las razones por las que se filtran desde el menú flotante de creación rápida.

Consulte los ejemplos siguientes para comprender las razones del filtrado. Basándose en las explicaciones, comuníquese con la parte responsable o realice los cambios correspondientes.

La tabla no está habilitada para la Interfaz unificada

La tabla no está habilitada para la creación rápida

La tabla no forma parte del módulo de la aplicación

Mensaje inesperado de cambios no guardados

Al trabajar en formularios, obtiene el mensaje cambios no guardados en el pie de página del formulario, cuando navega desde el formulario actual o guarda el formulario sin cambios.

Cómo solucionar problemas

El error sobre cambios no guardados aparece cuando cambia el formulario y cuando los cambios no se guardan. Si no ha realizado ningún cambio manualmente, podría provenir de un JavaScript, un complemento o una regla de negocio. Puede usar Monitor para ver la operación UnsavedChanges que ayuda a encontrar el origen de los cambios. Puede filtrar por OperationType UnsavedChanges.

La sección all attributes modified incluye un resumen rápido de las columnas que están causando el error de cambios no guardados y sus valores. La sección unsaved changes muestra lo que sucedió con las columnas en detalle. Para cada columna, puede ver una lista de controles que podrían estar provocando un cambio. También se muestra el cambio de valor (previousValue, newValue), así como una pila de llamadas.

La siguiente captura de pantalla muestra la causa raíz del problema. Puede ver que el cambio vino del script OnLoad.

Error de cambios sin guardar

Nota

Si el usuario ha realizado manualmente los cambios en el formulario, no se proporcionará una pila de llamadas.

Compruebe de dónde proviene el cambio y si es el comportamiento esperado o no. Si un script provoca el cambio, el recurso web original se puede rastrear hasta la pila de llamadas. En la mayoría de los casos, es un guión. Realice una decisión basada en el propio recurso web.

La validación de la columna requerida por la empresa no se comporta de la manera prevista

Las columnas requeridas por la empresa bloquean de forma predeterminada la operación de guardado del formulario si el valor está vacío. Sin embargo, en muchos escenarios por diseño, es posible que una columna requerida por la empresa no bloquee la operación de guardado cuando el valor esté vacío o bloquear el guardado cuando no crea que debería hacerlo.

Cómo solucionar problemas

La operación RequiredFieldValidation se registra cuando se intenta guardar, independientemente de si el guardado se realizó correctamente o no. Esta operación explica por qué cada columna requerida por la empresa bloquea o no bloquea la operación de guardado.

La siguiente imagen es un ejemplo de esta operaicón. El mensaje explica cómo leer los informes detallados de cada columna requerida. En este ejemplo, la columna fax está enlazada a un control y el control del mismo nombre es de solo lectura. Por lo tanto, no activará la validación de columna requerida.

Validación de columna

La siguiente imagen es otro ejemplo de que jobtitle es una columna requerida por la empresa en el flujo de proceso de negocio, pero no en el formulario, y la columna no se modifica. Por lo tanto, no bloquea la operación de guardado incluso cuando está vacía.

Validación de columna requerida

Seguimiento

La mayoría de las veces, el comportamiento es por diseño, y la operación RequiredFieldValidation explica por qué esta columna se comporta de determinada manera en la operación de guardado de formularios. Si la validación de columna requerida se omite en una columna porque el control está deshabilitado u oculto, como se ilustra en el primer ejemplo, consulte las sugerencias del comprobador de formularios para un análisis más detallado.

Esto podría llevar a otro escenario de solución de problemas, como Por qué un control está deshabilitado/habilitado o visible/oculto.

Algunas columnas no se muestran en el cuadro de diálogo de combinación

El cuadro de diálogo de combinación utiliza la definición de formulario principal predeterminada para la tabla y, de forma selectiva, representa la mayoría de las columnas del cuadro de diálogo, pero no todas. Esta operación del comprobador de formularios explica por qué algunas de las columnas no se muestran en el cuadro de diálogo de combinación, incluso si se muestran en el formulario principal.

Cómo solucionar problemas

La siguiente operación MergeDialog.load explica la razón por la que no se muestran algunas columnas.

En este ejemplo, la columna parentcustomerid del formulario de contacto no se admite en el cuadro de diálogo de combinación. La columna de la tarjeta de presentación no se muestra porque la sección que contiene está oculta en la definición XML del formulario principal. Aunque es posible mostrar la sección de propiedad en el formulario principal a través de la API del cliente, el cuadro de diálogo de combinación respeta la configuración XML del formulario, ya que los controladores de eventos no se admiten en el cuadro de diálogo de combinación.

Carga del cuadro de diálogo de combinación

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).