Generador de consultas FetchXML

<FetchXmlBuilder> edita una consulta FetchXML sin que nadie escriba FetchXML. Cubre las partes del lenguaje que la gente realmente utiliza — la tabla, las columnas que devuelve, cómo se ordenan las filas y un árbol de filtros de condiciones y grupos anidados — y une tablas relacionadas, agrega y ejecuta lo que construyó.

Solo reaccionar, por ahora

Este componente existe solo en la pila React — aún no existe un equivalente a Blazor. Un portal Blazor que necesita almacenar una consulta FetchXML aún puede hacerlo; lo que no tiene es este editor para construir una.

Pruébalo

El componente real frente a los metadatos de este entorno. Elige una tabla, añade una columna o condición, únete a una tabla relacionada y observa cómo el panel FetchXML sigue el ritmo — luego pulsa Ejecutar para ver qué coincide la consulta.

Ejemplo de reacción
React TypeScript

No es lo mismo que FetchXMLBuilder

Esta página trata sobre el componente. FetchXMLBuilder es la clase C# que compone el mismo XML en código, para un llamador del lado del servidor que construye una consulta manualmente. Producen lo mismo y ninguno necesita el otro.

Los metadatos son obligatorios, no opcionales

Cada tabla, columna y relación se elige de lo que realmente tiene el entorno. Eso es deliberado: un nombre lógico escrito a mano produce FetchXML que analiza perfectamente y luego falla contra Dataverse, que es el peor tipo de error que se puede dar a alguien. El usePowerPortalsProFetchXmlMetadata gancho conecta el constructor a los extremos de metadatos en caché del framework, así que los selectores comparten lo que las cuadrículas en la misma página ya han recuperado.

Los viajes de ida y vuelta de consultas

El creador analiza FetchXML en un modelo de documento y lo vuelve a escribir. Cualquier cosa para la que no tenga editor — un atributo de una versión de plataforma más reciente, un elemento escrito por otra herramienta — se lleva sin tocar en lugar de descartarse al cargar, así que abrir una consulta en el editor y guardarla nunca te cuesta una parte silenciosa.

Qué significa eso para una consulta guardada

El formato no se conserva. La sangría y las citas de atributos se normalizan al salir, por lo que una consulta guardada de nuevo a través del constructor es la misma consulta en lugar del mismo texto.

Proporcionando una consulta

Hay tres formas de entrar, y las tres pasan por el mismo lector:

  • La value hélice. Suministrala onChange para un componente controlado, o úsala defaultValue y deja que el constructor sea dueño de su estado.
  • El panel FetchXML. Pega o escribe una consulta y el editor se reconstruye a partir de ella aproximadamente un segundo después de que dejes de escribir.
  • Una vista guardada. Empieza desde una vista en la cabecera de Filtros que lista las vistas de la tabla y toma toda la consulta de la que elijas. Es una copia: nada se escribe de vuelta a la vista.

Lo que llega se comprueba primero. El XML malformado se reporta con su línea y columna, y también cualquier cosa que haga que el editor muestre algo distinto a lo que se escribió — un operador o tipo de enlace que no conoce, una consulta que no nombra ninguna tabla. Esos se rechazan de plano y la consulta que ya aparece en pantalla se deja intacta. Todo lo demás se reporta y sigue aplicando: un elemento o atributo mal escrito, dos tablas compartiendo un alias, una condición que se lee de un alias que nada declara.

Tablas relacionadas

Se añade una unión desde el selector de relaciones, por lo que las from columnas y to provienen de la relación en lugar de la memoria. Lo que puede aportar una unión depende de su tipo:

  • Los tipos que devuelveninner, outer y matchfirstrowusingcrossapply — devolven las columnas de la tabla relacionada, de modo que sus columnas puedan proyectarse, ordenarse y compararse.
  • Los tipos de filtradoexists, in, any, not any y all — devuelven la fila como mucho una vez y ninguna de las columnas relacionadas. El editor elimina el alias cuando cambias a uno, por lo que el nombre queda libre para otra unión.
  • No tiene fila relacionada que es un preset en lugar de un tipo de enlace: FetchXML no tiene ninguno para ello, así que el editor escribe la unión externa y la prueba nula en la clave unida que la plataforma espera, y mantiene ambos en sintonía.

Sobre "todos"

FetchXML all no significa lo que su nombre sugiere — coincide con filas que tienen filas relacionadas de las cuales ninguna satisface el filtro, y not all está documentado como equivalente a any. Cada tipo se etiqueta por lo que hace en lugar de por su nombre, y una acción de Invertir condiciones sobre un grupo de filtros expresa la lectura que la gente suele querer.

Consultas agregadas

Activa Agregado en la sección de Columnas y cada columna dice lo que aporta — un valor calculado a lo largo de las filas, o por qué están agrupadas. Las funciones ofrecidas se reducen al tipo de columna, los alias se vuelven necesarios y se rellenan por ti, una columna de fecha agrupada gana una parte de fecha, y la ordenación cambia a los alias, porque las filas de una consulta agregada son grupos y valores calculados sin columnas por las que ordenar.

allowAggregate={false} retira el switch, para un host que lee filas en lugar de totales — una regla evaluada registro a registro, un filtro guardado, en cualquier lugar donde una sola fila de valores calculados no sería una respuesta. Está ausente en lugar de desactivada, porque ningún cambio en la consulta la traería de vuelta. La única excepción es una consulta que ya agrega: mantiene sus controles independientemente de la posición que se establezca, por lo que una pegada en el panel FetchXML aún puede editarse de nuevo en una consulta ordinaria.

Montar parte de ella

Cada sección puede desactivarse, y las secciones se exportan individualmente para un diseño que las necesite en otro lugar — monta <FetchXmlBuilderProvider> y coloca los FetchXml*Section componentes tú mismo. Omitir una sección elimina su interfaz, nunca el FetchXML subyacente: las columnas de una consulta sobreviven intactas con columns: false.

Restringir las tablas

allowedTables reduce el selector de tablas a los nombres lógicos que mencionas — para una superficie que no debería consultar todo el entorno, como un generador de informes sobre el puñado de tablas que expone un portal. Omitilo, se ofrecen todas las tablas. Reduce lo que se puede elegir, no lo que se puede mostrar: una consulta que ya nombra una tabla fuera de la lista la mantiene en lugar de ser reescrita silenciosamente, y una tabla relacionada sigue llamándose por su nombre de visualización siempre que una unión la mencione. Las uniones en sí no están restringidas, porque siguen relaciones — una propiedad de la tabla ya elegida.

Ejecutando la consulta

Suministra renderResults y el constructor hace crecer un panel de Resultados con un botón Ejecutar y decide cuándo puede pulsarse. Mostrar filas consume un cliente de datos que el constructor deliberadamente no tiene, así que el resultado es tuyo — en un portal que normalmente significa el propio <MainGrid> framework sobre la consulta que te devolviera. Deja la prop apagada y el panel no está ahí.

API