Diseñar un informe
Objetivo
Maquetar un informe dentro de la plataforma —en un lienzo, junto a las consultas que lo rellenan— en lugar de dibujarlo en una herramienta aparte y volver a pegar el JSON.
Dónde se abre
Abra su solución, elija Informes, seleccione un informe y pulse Diseñar. El lienzo se abre en el mismo sitio, bajo la misma ruta de navegación y los mismos selectores de entorno y solución con los que ya estaba trabajando. No es una segunda aplicación ni una pestaña nueva: diseñar un informe es trabajo de creador, y este es el portal del creador.
Diseñar y Editar son dos comandos porque se ocupan de dos mitades distintas:
- Diseñar es la maquetación: la página, sus bandas, sus tablas, su logotipo.
- Editar es todo lo que un lienzo no puede saber: qué consultas guardadas rellenan la plantilla, y qué campo reduce cada una de ellas cuando alguien imprime un solo registro.
En la mayoría de los informes usará los dos, y ninguno sobrescribe la mitad del otro.
Requisitos previos
- Ha iniciado sesión como creador, con una solución y un entorno seleccionados.
- El informe ya existe. Créelo primero —consulte Crear un informe— y después diséñelo.
Pasos
- Abra su solución y elija Informes.
- Seleccione el informe y pulse Diseñar.
- Si el informe nunca se ha diseñado, el lienzo se abre solo con el tablero Styles: los colores y estilos de texto de los que parte un diseño, que nunca se imprimen. Use Insertar → Página de informe para colocar una página, y maquete el contenido dentro de ella.
- Dibuje el informe: bandas para el encabezado y el pie, un repetidor para las filas, texto enlazado a los campos de su conjunto de datos. La paleta y el panel de capas funcionan como siempre; el inspector tiene ahora dos pestañas; consulte más abajo.
- Pulse Guardar.
Empezar a partir de un ejemplo
Insertar → Informes de ejemplo coloca una página de informe terminada en el lienzo junto a lo que ya haya dibujado —no se sustituye nada— y carga sus datos de ejemplo en el editor de datos del informe, así que la vista previa aparece de inmediato.
La lista tiene dos mitades, y responden a preguntas distintas.
Los cinco primeros son documentos terminados —Factura, Ventas, Lista de contactos, Resumen, Panel— y están ahí para mostrar el aspecto que puede tener un informe.
Los cuatro siguientes demuestran cada uno una función, que es lo que necesita cuando sabe el efecto que busca pero no el gesto. Cada uno lleva una línea en su propio pie de página que indica dónde mirar:
| Ejemplo | Muestra |
|---|---|
| Estilo (cebra + formato condicional) | Filas alternas, un color y un grosor que cambian por encima de un umbral, un color de estado y una marca que aparece solo en las filas a las que se aplica |
| Marca de agua | Un sello BORRADOR sobre cada página, y un bloque de control documental en la esquina |
| Encabezado y pie repetidos | Un membrete y un pie en cada hoja, encabezados de columna que vuelven allí donde continúa la tabla, y un subtotal por hoja junto a un total de toda la tabla |
| Gráficos | Un gráfico de barras y un gráfico de líneas, y debajo una tabla que lee el mismo conjunto de datos |
Abra uno, seleccione una banda o una celda y lea sus expresiones en el inspector o en la página Código. Son dibujos normales: edítelos, quédese con la parte que quería y elimine el resto.
Sus celdas leen row.par_name, row.par_amount, row.par_currency y row.par_status —las
columnas de la tabla de ejemplo de gastos— en lugar de nombres inventados. Eso es lo que permite
instalar el mismo dibujo como un informe que funciona con filas reales detrás, en lugar de uno que
se ve bien en la vista previa y se imprime en blanco. Rediríjalos a su propia tabla editando el
conjunto de datos y los enlaces; las técnicas no cambian.
El rayado en cebra es Fondo en el marco de fila del repetidor, y dice
rowIndex % 2 == 1 ? '#f8fafc' : '': el número de fila, no un campo. Leer un valor parece
idéntico hasta que alguien vuelve a ordenar la tabla.
a ? b : c ? d : e no se puede analizar. Escriba
row.status == 'Approved' ? '#059669' : (row.status == 'Rejected' ? '#be123c' : '#b45309').
Una expresión que no se puede analizar deja la propiedad exactamente como la dibujó, así que el
síntoma es un color que nunca cambia en lugar de un error.
Generar con IA
Generar con IA describe una página con palabras y la dibuja. Describa lo que quiere —el cuadro es grande a propósito: una página que merezca la pena generar ocupa un párrafo— y pulse Generar, o Ctrl/⌘+Intro. Lo que vuelve se agrega a lo que ya hay en el lienzo; no se sustituye nada de lo que dibujó. Para empezar de cero, vacíe primero el lienzo y después genere.
Lo que vuelve se comprueba antes de que aparezca nada —cada forma tiene que ser una que este editor pueda construir realmente—, así que una respuesta que nombra una forma que no existe no pone un cuadro roto en su página.
Se corrige a sí mismo antes de rendirse. Cuando no vuelve nada aprovechable, la plataforma devuelve la respuesta directamente al modelo con el problema indicado, en lugar de pedirle a usted que corrija un error que nunca escribió. Lo intenta hasta tres veces, y mientras tanto el botón dice Corrigiendo… intento 2 de 3.
Una respuesta aprovechable en parte se conserva, no se desecha. Las formas que se pudieron dibujar quedan en el lienzo y el cuadro de diálogo sigue abierto enumerando lo que quedó fuera, así que una respuesta de diez formas en la que dos no eran aprovechables llega como ocho formas y dos frases, en lugar de ocho formas y silencio. Un resultado parcial del que no se le informa es uno que usted leería como si su propia descripción hubiera pedido menos.
Usted describe el diseño, y nada más. Qué modelo de IA responde lo configura una sola vez para toda la plataforma un administrador: no hay clave que pegar ni proveedor que elegir.
Si no hay botón de IA, esta plataforma no tiene IA configurada. Pregunte a un administrador; es un ajuste del servidor, no algo que un creador pueda activar.
Las dos pestañas del inspector
El panel de propiedades de la derecha tiene dos pestañas, y responden a dos preguntas distintas:
- Gráfico: qué es el objeto: dónde está, qué tamaño tiene, su relleno, su trazo, su texto.
- Informe: qué significa el objeto para el informe: que este marco es la página, o una banda de encabezado, o un repetidor, y a qué está enlazado un texto o una imagen.
Un punto en la pestaña Informe significa que el objeto seleccionado ya forma parte del informe —la página, una banda, un texto enlazado—, así que lo ve sin abrir la pestaña. La pestaña que deje abierta sigue abierta mientras selecciona otros objetos.
Algunos objetos no tienen nada que poner en la pestaña Informe: solo un marco puede ser la página o una banda, y solo un texto o una imagen pueden enlazarse a datos. La pestaña lo indica en lugar de abrirse vacía.
Guardar hace dos cosas a la vez, y esta es la parte que merece la pena entender: compila lo que ha dibujado en la plantilla que se imprime, y guarda su dibujo junto a ella. Por eso puede pulsar Diseñar mañana y recuperar su maquetación en lugar de una reconstrucción de ella: se conserva el dibujo, no solo su resultado.
Un diseño de página, por muchas hojas que imprima
Un diseño de página se pagina: el cuerpo fluye por tantas hojas como necesite el contenido, y el encabezado y el pie de página se vuelven a dibujar arriba y abajo de cada una. Una lista de cien facturas es un diseño de página y cuatro páginas impresas.
Varios diseños de página en un informe: secciones
Dibuje un segundo marco de Página de informe en el lienzo y obtendrá una sección: una portada maquetada de una manera, el cuerpo de otra, los términos y condiciones al dorso. Cada marco etiquetado como página de informe es una sección, en el orden en que están en el lienzo, y cada sección empieza en una hoja propia.
Cada sección tiene sus propios márgenes y su propio encabezado de página, pie de página, membrete y marca de agua: una portada sin encabezado ni número de página, y un cuerpo que tiene ambos, en un mismo informe. Una sección sin nada dentro no imprime nada en absoluto, en lugar de una hoja en blanco.
Los números de página cuentan todo el informe, no la sección: la portada es la página 1 de n, donde n cuenta también todas las hojas que ocupan el cuerpo y los términos. Quien tiene en la mano una página impresa quiere «3 de 9».
Todas las secciones se imprimen en el mismo tamaño de papel, tomado del primer marco de página. Una impresora tiene una bandeja, así que un informe que mezclara A4 y A5 no se imprimiría bien en ningún sitio. Cambie el tamaño de uno de los marcos y el diseñador lo indica al guardar, y luego imprime todo en el papel del primer marco. Los márgenes puede cambiarlos por sección; la hoja no.
Una sección es «a partir de aquí, la página tiene otro aspecto». Cuando solo quiere una hoja nueva con el mismo diseño, eso es la marca que se describe a continuación.
Empezar una zona en una página nueva
La paginación corta una página cuando el bloque siguiente no cabe. Eso responde a «no dividas esta fila»; no puede responder a «esta parte empieza en su propia página», porque eso no tiene nada que ver con cuánto espacio queda.
Seleccione la zona —una banda, un repetidor, un contenedor de columnas, un gráfico— y marque Empieza en una página nueva en la pestaña Informe del inspector. El informe corta justo antes de ella, esté la página llena o no. Úselo para una serie de reclamaciones por cliente, o allí donde se quiera una hoja nueva con el mismo diseño de página. Cuando la propia página deba tener otro aspecto, dibuje un segundo marco de página y use una sección en su lugar.
Dos detalles que conviene saber:
- Nunca deja una hoja en blanco. Un corte al principio de una página que ya está vacía no hace nada, así que marcarlo en la primera zona del informe —o en dos zonas seguidas— no le cuesta papel.
- En una banda que se repite como encabezado de tabla, el corte cae antes del encabezado, que es lo que quiere: la nueva página se abre con los encabezados de columna y las filas siguen.
No recurra a esto para que una banda caiga en su sitio: rellenar una banda con espacio vacío hasta que se desborde parece correcto hoy y se rompe en cuanto cambian los datos. La marca es la forma duradera de decirlo.
Repetir sobre un conjunto de datos
Un marco repetidor dibuja su contenido una vez por fila. Etiquete el marco como repetidor en la pestaña Informe del inspector y después elija qué recorre en Repetir sobre.
Repetir sobre es una lista desplegable de los conjuntos de datos de este informe —rows,
invoices—, así que no hay ningún nombre que recordar ni que escribir mal. Si el que quiere no está
en la lista, agréguelo en Editar en el panel de Informes y aparecerá aquí.
Una lista y no un cuadro donde escribir, a propósito: un repetidor recorre un conjunto de datos completo, así que «cuál» tiene exactamente tantas respuestas como conjuntos de datos tiene el informe. Reducir las filas —solo las reclamaciones aprobadas, por ejemplo— corresponde al propio conjunto de datos, donde está la consulta y donde cada banda que lee ese conjunto de datos obtiene la misma respuesta; póngalo en el cuadro de un marco y la siguiente banda necesitará su propia copia.
Qué muestra un texto o una imagen
Un texto o una imagen dentro de un repetidor está enlazado, y el enlace se escribe en el mismo editor que cualquier otro fragmento de BS Lang de la plataforma: completa lo que se puede llamar, muestra qué recibe una función y subraya un error mientras escribe en lugar de imprimir después una celda en blanco.
En la pestaña Informe del inspector, Enlace es una lista desplegable de los campos a los que se puede enlazar, porque eso es lo que suele ser un enlace, y un nombre que se elige es un nombre que no se puede escribir mal.
Todo lo que sea más que un campo se escribe en la página de código: seleccione el texto y pulse
Escribir código en la barra de herramientas (el botón </>). La lista de su lateral empieza por
Qué muestra, el enlace, y sigue con cada propiedad que puede seguir a los datos (vea Estilo que
viene de los datos, más abajo). El editor tiene espacio para trabajar: autocompletado, lo que recibe
cada función y un subrayado rojo bajo un error mientras escribe; la lista marca cada entrada como
Escrito o Tiene un error. Ahí va concat('Page ', pageNumber, ' of ', pageCount). La ✕ de su
esquina le devuelve al dibujo, y lo que escribió se guarda con él cuando pulsa Guardar.
Abra el ojo para ver lo que puede escribir. Todos los cuadros de expresión de la plataforma
llevan uno, y detrás está todo lo que esta expresión puede alcanzar: Página (pageNumber,
pageCount, page.rows), Fila del repetidor (row, rowIndex, rows, rowCount), las
columnas del conjunto de datos que recorre este repetidor, los agregados propios del informe con lo
que recibe cada uno, y las funciones propias del lenguaje. Busque en él, haga clic en una entrada y
se insertará donde está el cursor. Está ahí porque la finalización no puede responder a «¿qué hay en
esta fila?»: la finalización le dice qué viene a continuación una vez que ha empezado a escribir, y
el ojo le dice qué hay antes de que empiece.
Dentro de un repetidor las columnas se escriben como row.<field>: row es un registro de
exactamente un conjunto de datos, y un campo de otro no se resolvería en nada. Fuera de un repetidor
no hay ningún row, así que los mismos campos se direccionan a través de su conjunto de datos:
rows[0].total.
Una columna de una tabla relacionada se escribe con el nombre que la consulta dio a la unión.
Una consulta guardada que une el cliente como customer ofrece sus columnas como
row.customer.par_name y row.customer.par_credit_limit, y las funciones de lista toman el mismo
nombre entre comillas: sum(rows, 'customer.par_credit_limit'). Si cambia el nombre de la unión en
la consulta, los enlaces tienen que seguirlo.
Y es una expresión, no solo un nombre de campo. row.amount * 1.2,
row.status == 'Approved' ? 'Yes' : 'No', concat(row.first, ' ', row.last),
sum(page.rows, 'amount') para un total por página: el mismo lenguaje que una regla de negocio, los
enlaces de una pantalla y un script de solución.
| Dónde está | Qué hay en el ámbito |
|---|---|
| Una fila de un repetidor | row, rowIndex, rows, rowCount y cada conjunto de datos por su nombre |
| Un encabezado o pie de página | pageNumber, pageCount, page.rows, page.rowCount |
| En cualquier sitio | los conjuntos de datos por su nombre, data y los agregados de abajo |
Totales, grupos y sumas acumuladas
Un total de tabla va en una fila de total. Dibuje una banda debajo del repetidor y marque
Fila de total del repetidor de arriba en la pestaña Informe. Se dibuja una vez después de la última
fila y ve rows y rowCount para todo el conjunto de datos, así que sum(rows, 'amount') ahí es
el total de la tabla.
Es una cifra distinta de un total de página, que es sum(page.rows, 'amount') en el pie de
página y solo cuenta las filas que cayeron en esa hoja. Las dos son útiles; elija deliberadamente.
Un total acumulado es sum(take(rows, rowIndex + 1), 'amount') en la propia fila: cada fila
hasta esta inclusive.
Agrupar es tarea del conjunto de datos. Guarde una consulta que agrupe —una fila por estado, con un recuento y un total (vea Guardar una consulta)—, añádala al informe como segundo conjunto de datos en Conjuntos de datos y repita sobre ella como sobre cualquier otro: cada fila que dibuja es un grupo, ya contado y totalizado, y una fila de total debajo suma los grupos. Un repetidor no puede ir dentro de la fila de otro repetidor, así que un informe no enumera las filas de cada grupo bajo un encabezado del grupo.
Llegar a un segundo conjunto de datos es lookup(regions, 'code', row.region).manager: la
primera fila cuya columna coincide, para que pueda imprimir un nombre que su propia consulta no
obtuvo.
Estilo que viene de los datos
Seleccione una banda, una celda o una forma, pulse Escribir código y elija una propiedad de la lista bajo Propiedades: cada una acepta una expresión, que se responde por fila:
| Propiedad | Ejemplo |
|---|---|
| Fondo | row.amount > 1000 ? '#fee2e2' : '' |
| Color del texto | row.overdue ? '#b91c1c' : '' |
| Grosor de fuente | row.isTotal ? '700' : '' |
| Se muestra cuando | row.note != '' |
Vacío significa «déjelo como lo dibujé»: por eso los ejemplos tienen un simple '' en el otro
lado en lugar de repetir su propio color, y por eso activar esto nunca puede dejar en blanco un
informe que estaba bien. Se muestra cuando es la excepción: una respuesta falsa elimina el
elemento por completo, fondo y borde incluidos, cosa que enlazar el texto a '' nunca podría hacer.
Para colorear una fila entera, establezca Fondo en el marco de fila del repetidor y no en una celda de dentro.
Los agregados: sum · count · avg · min · max · pluck · round · abs · upper ·
lower · concat · ifEmpty · format. Cada uno recibe una lista y, cuando la necesita, la
columna que leer: sum(claims, 'par_amount').
Las funciones de lista: where · exclude · take · skip · sortBy · groupBy · lookup ·
distinct. Todas nombran una columna, nunca una condición:
where(claims, 'status', 'Approved'), no where(claims, row.status == 'Approved'). Es un límite
real y no una cuestión de estilo: una función recibe sus argumentos ya calculados, así que una
condición se respondería una sola vez en lugar de una vez por fila.
pluck es la que responde con una lista en lugar de un solo valor, y es a lo que se enlaza un
gráfico. Un gráfico quiere una serie, y un conjunto de datos son filas; así que
pluck(revenue, 'amount') le da los importes y pluck(revenue, 'month') le da las etiquetas
correspondientes, ambos del mismo conjunto de datos, para que no puedan desfasarse ni una fila.
Un gráfico
Insertar → Gráfico de barras o Gráfico de líneas coloca un gráfico en la página bajo el centro de su vista: un marco en el que dibuja el motor de informes, con un título. No hay nada que dibujar a mano: la escala, las marcas y las etiquetas se calculan a partir de los datos cada vez que se ejecuta el informe. En una pantalla el mismo menú ofrece más tipos, como dibujos; un informe ofrece los dos que puede imprimir.
Seleccione el marco, pulse Escribir código y rellene Valores del gráfico y Etiquetas del
gráfico, ambos con pluck para que salgan a la par de un mismo conjunto de datos:
pluck(bystatus, 'total') y pluck(bystatus, 'par_status'). Barras o líneas, y el color, están en
la pestaña Informe. La vista previa y la página impresa dibujan el mismo gráfico.
Un gráfico que no cabe debajo de lo anterior pasa a la hoja siguiente, como cualquier otro bloque.
Códigos de barras y códigos QR
Insertar → Código de barras o Insertar → Código QR coloca un código real y legible por escáner en el marco que está en el centro de la vista: si lo suelta en un encabezado de página, se imprime en cada hoja. En la pestaña Informe defina su Valor, su Zona de silencio (el margen en blanco que necesita un escáner) y, o bien Imprimir el valor bajo las barras (Code 128), o bien Corrección de errores (QR). Code 128 admite ASCII imprimible; un código QR admite cualquier texto, también un enlace.
Para un código distinto en cada fila, selecciónelo dentro del repetidor, pulse Escribir código y
rellene Valor del código de barras: row.par_reference. El lienzo dibuja el valor fijo, porque
un lienzo no tiene filas.
Papel y orientación
El tamaño del marco de página es el papel, en puntos (72 por pulgada): 595 × 842 es A4. Para cambiar el papel de una página, escriba su An y su Al; los tamaños de Papel del menú Marco dibujan un marco nuevo.
Para la orientación horizontal, indique primero a las bandas que sigan al papel: ponga la restricción Horizontal de cada banda en Izquierda y derecha, y todo lo que esté pegado a su borde derecho en Derecha. Después haga la página de 842 × 595.
Margen, en la pestaña Informe de la página, es el espacio que queda libre arriba y abajo de cada hoja. A lo ancho, todo se imprime donde lo dibujó. Imprimir / PDF imprime cada página en una hoja exactamente del tamaño de la página, así que el navegador no tiene margen donde poner su propio encabezado y pie.
Un informe en persa o en árabe
Escriba las palabras y el diseñador pone el texto de derecha a izquierda. Un texto cuyas palabras son persas, árabes o hebreas se pone De derecha a izquierda y se alinea a la derecha al terminar de escribir, y la página lo imprime así: un punto o un número al final de la línea se queda al final. Un texto enlazado no tiene palabras de las que deducirlo, así que ponga De derecha a izquierda usted mismo en la pestaña Gráfico, junto a los botones de alineación. Disponga las columnas desde la derecha, como las lee un lector persa.
Las cifras y el calendario son del lector. Un texto cuyo Formato es number o date se
escribe en el idioma y el calendario de quien abre el informe: cifras persas para un lector que trabaja
en persa, y una fecha jalalí para quien tenga Configuración de apariencia → Calendario en Persa. La Vista
previa del diseñador sigue su propia configuración, la aplicación la de cada lector, y el mismo
informe imprime 7,890.50 para uno y ۷٬۸۹۰٫۵۰ para otro.
Un número dentro de concat se escribe tal como está guardado, así que dele un formato propio:
concat('صفحهٔ ', format(pageNumber, 'integer'), ' از ', format(pageCount, 'integer')).
Vista previa de un informe que se imprime para un registro
Cuando el primer conjunto de datos tiene un campo de registro, el informe se imprime desde un registro, y la vista previa lo muestra así: toma la primera fila del primer conjunto de datos como el registro y limita a él cada conjunto de datos con campo de registro. Una factura se previsualiza como la primera factura con sus propias líneas, no con las de todas.
Un informe para el que subió una plantilla
Los informes creados pegando una plantilla no tienen dibujo detrás. Pulsar Diseñar en uno abre un lienzo vacío en lugar de intentar reconstruir la maquetación a partir de la plantilla.
Es deliberado. Una plantilla registra bandas, repetidores y enlaces, no los marcos, guías y estilos que usted dispuso para llegar a ellos, así que cualquier cosa que la plataforma dibujara a partir de ella sería una suposición, y guardar esa suposición sustituiría su plantilla real por la suposición. Si quiere un informe subido en el lienzo, maquételo una vez y guárdelo; a partir de ahí va y vuelve sin pérdidas.
A la inversa es seguro: editar los conjuntos de datos de un informe diseñado desde el panel de Informes deja su dibujo intacto.
Guardar, y adónde va
Hay exactamente un Guardar, y está en la barra de título de la parte superior de la pantalla: el mismo sitio que en cualquier otra pantalla del producto. Escribe el informe como un componente de solución: por capas, propiedad de su solución, validado y listo para exportar.
El menú Archivo propio del diseñador no se muestra aquí. Por separado, ese menú guarda un archivo JSON en su disco; dentro de la plataforma sería un segundo comando que parece haber guardado su trabajo y no lo ha hecho. Exportar (PNG, SVG) sigue disponible, porque una imagen de un informe es útil en cualquier caso.
Moverlo entre entornos
No cambia nada: el informe es un componente de solución y viaja como siempre, con su plantilla dentro. Su dibujo también viaja con él, así que quien lo importe puede pulsar Diseñar y continuar su maquetación en lugar de empezar de nuevo.
Solución de problemas
- «Este diseño todavía no tiene ninguna página de informe.» — ha dibujado en el lienzo pero no dentro de una página de informe. Use Insertar → Página de informe y ponga el contenido dentro; el marco de página es lo que le dice al compilador dónde empieza el informe.
- Guardar aparece atenuado. — nada ha cambiado desde que lo abrió. Dibuje algo primero.
- El informe se imprime pero la página está vacía. — el repetidor no apunta a ningún conjunto de datos. Abra Repetir sobre: enumera todos los conjuntos de datos que tiene realmente este informe. Elija uno, o agregue el conjunto de datos que falta en Editar y después elíjalo.
- «Cada marco de página es una sección de este informe, pero todos deben tener el mismo tamaño…» — uno de sus marcos de Página de informe tiene un tamaño distinto del primero. Cámbielo para que coincida; hasta que lo haga, todo se imprime en el papel del primer marco. Consulte Varios diseños de página en un informe, más arriba.
- Mi maquetación volvió distinta. — está en un informe cuya plantilla se subió en lugar de diseñarse. Consulte Un informe para el que subió una plantilla, más arriba.
- Una celda está en blanco y el resto del informe está bien. — su enlace no pudo ejecutarse. Ábralo: el editor subraya la parte que no pudo interpretar. Un enlace que falla deja un blanco a propósito en lugar de arrastrar consigo toda la página.
rows.lengthdice 'length' es un método: escriba length() para llamarlo. Es un método en BS Lang, así que necesita los paréntesis:rows.length(). De todos modos,count(rows)se lee mejor en un informe. (Antes respondía con toda la lista en lugar del recuento, y no decía nada. Ahora ya no).sumaparece subrayado en rojo. — compruebe cómo está escrito con la lista de arriba. El editor conoce los agregados propios del informe y nada más; una función que la plataforma no tiene es una función a la que nada llamará.- Un enlace escrito antes de esta versión dejó de funcionar. — las expresiones de informe son
ahora BS Lang, el mismo lenguaje que en el resto de la plataforma. Casi todo se mantiene sin
cambios —rutas de campo, aritmética, comparaciones,
?:, los agregados—, pero conviene volver a abrir una expresión que dependía de algo que el antiguo evaluador permitía por casualidad, porque ahora el editor se lo dirá.